優しい？SQL入門

# SQL入門

本記事では**SQLの概要**や**データベースの作成から操作**までの流れをまとめています。
SQL初心者である筆者の個人メモ兼情報共有のために書きました。
間違いや改善点などあればどんどんご指摘ください！


## 1. SQLとは
SQLとはデータベースを利用するための言語です。
正確にはSQL文をDBMS(データベース管理システム)に伝える事で、
データベースサーバのファイルを書き換えます。
こうしてデータベースの値を操作するような振る舞いを実現します。

## 2. SQLの基本

### 2-1. SQLの種類
SQLの命令文は大きく分けて以下の3つに分類できます。
- DDL(Data Definition Language)
　→データを定義する命令(CREATE, DROP)
- DML(Data Manipulation Language)
　→データを操作する命令(SELECT, INSERT, UPDATE, DELETE)
- DCL(Data Control Language)
　→データを制御する命令(START TRANSACTION, ROLLBACK, COMMIT)

### 2-2. 用語
データベースに存在する値は表のような概念で保存されています。
表の各要素はそれぞれ以下の名称で呼ばれています。

|表での名称|SQLでの名称|スペル|
|---|---|---|
|表|テーブル|table|
|行|ロウ|row|
|列|カラム|column|

### 2-3. ルール
データベースの形式として主流なリレーショナルデータベースを作る際、
必ず守らなければいけないルールが2つあります。

- 表には主キーがなければいけない
- 表には主キーに従属した項目だけがある

主キーとは重複する値のない一意なキー(カラム)の事です。
主キーに従属した項目だけがあるというのは、一つのテーブルに複数の主キーを設定しないということであり、
ある主キーを一つ消した時に別の一意な値(主キー)が消えないようにするという意味でもあります。

### 2-4. 主なデータ型

|データ型|MySQLでのキーワード|
|---|---|
|整数型|INT|
|実数型|DOUBLE|
|固定長文字列型|CHAR|
|可変長文字列型|VARCHAR|
|日付型|DATE|

## 3. 環境構築
### 3-1. MySQLのインストール
今回の例ではMySQLを使用しています。
以下のリンクをクリックしてMySQL公式ページに移動できます。
https://dev.mysql.com/downloads/mysql/
OSを選択してダウンロードします。

macOSの場合はbrewからでもダウンロードできます。

```
brew install mysql
```

### 3-2. データベースの作成、操作
データベースの作成や操作は以下のコマンドでおこないます。

データベースの作成

```
CREATE DATABASE データベース名;
```
データベースの一覧を表示
 
```
SHOW DATABASES;
```

使用するデータベースの選択

```
USE データベース名;
```

## 4. データの登録、削除

テーブルの作成 (制約：NOT NULL または 未入力)

```
CREATE TABLE テーブル名 (
列名1 データ型 制約,
列名2 データ型 制約,
PRIMARY KEY(主キーの列名)
);
```

テーブルの一覧表示

```
SHOW TABLES;
```

テーブルへのデータ登録
```
INSERT INTO テーブル名 VALUES (データ1, データ2);
```

登録されたデータの確認

```
SELECT * FROM テーブル名;
```

テーブルの削除

```
DROP TABLE テーブル名;
```

データベースの削除

```
DROP DATABASE データベース名;
```

## 5. データの検索
テーブルと列を指定してデータを表示

```
SELECT 列名1, 列名2 FROM テーブル名;
```

重複を除いたデータを表示 (複数列指定した場合、値の種類が多い列に対して一意になるよう処理が行われます)

```
SELECT DISTINCT 列名1, 列名2 FROM テーブル名;
```

条件を指定してデータを表示
条件(例)：列名 = 値, IS NULL, IS NOT NULL ...など

```
SELECT 列名1, 列名2 FROM テーブル名 WHERE 条件;
```

条件指定(否定)

```
SELECT 列名1, 列名2 FROM テーブル名 WHERE NOT 条件;
```

表示する列名に別名をつける

```
SELECT 列名 AS 別名 FROM テーブル名;
```

条件指定(値の範囲を指定)

```
SELECT 列名1, 列名2 FROM テーブル名 WHERE 列名1 BETWEEN 値1 AND 値2;
```

条件指定(複数の値を指定)

```
SELECT 列名 FROM テーブル名 WHERE 列名 IN (値1, 値2);
```

条件指定(ワイルドカード)
%：0文字以上の任意の文字列
_：任意の文字1つ

```
SELECT 列名 FROM テーブル名 WHERE 列名 LIKE '%文字列%';
```

## 6. データの整列

並べ替え(昇順)

```
SELECT 列名 FROM テーブル名 ORDER BY 列名 ASC;
```

並べ替え(降順)

```
SELECT 列名 FROM テーブル名 ORDER BY 列名 ASC;
```

並べ替え(昇順かつ範囲指定あり)
開始位置：0~n(行目)
行数：1~n(件目)

```
SELECT 列名 FROM テーブル名 ORDER BY 列名 ASC LIMIT 開始位置, 行数;
```

## 7. データの集約

データの集約
集約関数：SUM, AVG, MAX, MIN, COUNT...など

```
SELECT 集約関数(列名) FROM テーブル名;
```

データの四捨五入
四捨五入する桁数：小数点以下1桁の場合1, 整数部1桁の場合-1

```
SELECT ROUND(列名, 四捨五入する桁数) FROM テーブル名;
```

データの切り捨て
切り捨てる桁数：小数点以下1桁の場合1, 整数部1桁の場合-1

```
SELECT ROUND(列名, 切り捨てる桁数) FROM テーブル名;
```

## 8. テーブルの結合

列名で結合

```
SELECT テーブル名1.列名1, テーブル名2.列名1 FROM テーブル名1, テーブル名2 WHERE テーブル名1.列名2 = テーブル名2.列名2;
```

内部結合(列名で結合した時と同じ)

```
SELECT テーブル名1.列名1, テーブル名2.列名1 FROM テーブル名1 INNER JOIN テーブル名2 ON テーブル名1.列名2 = テーブル名2.列名2;
```

外部結合
※内部結合では指定した列名がNULLの場合、結合できないためデータが取得されない
　→NULLの場合でも表示したい場合、外部結合でどちらかのテーブルに合わせて結合する

テーブル1に合わせる場合

```
SELECT テーブル名1.列名1, テーブル名2.列名1 FROM テーブル名1 LEFT OUTER JOIN テーブル名2 ON テーブル名1.列名2 = テーブル名2.列名2;
```

テーブル2に合わせる場合

```
SELECT テーブル名1.列名1, テーブル名2.列名1 FROM テーブル名1 RIGHT OUTER JOIN テーブル名2 ON テーブル名1.列名2 = テーブル名2.列名2;
```

## 9. グループ化

列名単位でグループ化
→以下の場合、列名1にて同じ値となる列名2は集約される。(複数行で表示されなくなり、集約関数が使える)

```
SELECT 列名1, AVG(列名2) FROM テーブル名 GROUP BY 列名1;
```

グループ化(条件あり)

```
SELECT 列名1, AVG(列名2) FROM テーブル名 GROUP BY 列名1 HAVING 条件;
```

## 10. ビュー

### ビュー(View)とは？
SELECT文などの表示コマンドを名前をつけて保存したものです。
長いSQL文を短く記載できるというメリットがあります。

ビューの作成

```
CREATE VIEW ビュー名 AS 命令文;
```

ビューの表示(テーブルの表示と同じ)

```
SHOW TABLES;
```

ビューの削除

```
DROP VIEW ビュー名;
```
## 11. サブクエリ

### サブクエリとは？
SQLの命令文内で別の命令文を呼び出す事ができます。
呼び出す側の命令文をメインクエリ(主要な問い合わせ)、
呼び出された側の命令文をサブクエリ(副問い合わせ)と呼びます。


サブクエリの呼び出し
※サブクエリ単体での表示結果はメインクエリの条件式と合致するようにしなければいけません。
　→以下の場合サブクエリの戻り値が複数あるとエラーなります

```
SELECT 列名 FROM テーブル名 WHERE 列名 = (サブクエリ);
```

### 相関サブクエリ
通常、サブクエリが呼び出された後にサブクエリが呼び出されますが、
メインクエリにてデータが1件取得される毎にサブクエリが実行される
特殊なサブクエリも存在します。これを相関サブクエリと言います。

相関サブクエリの呼び出し
※以下の場合、列名1毎にグループ化してそれぞれの値での列名2のMAX値を取得する

```
SELECT 列名1, 列名2 FROM テーブル名1 AS 任意のテーブル名：T1 WHERE 列名 = (SELECT MAX(列名2) FROM テーブル名1 AS 任意のテーブル名：T2 WHERE T1.列名1 = T2.列名1 GROUP BY 列名1);
```

## 12. データの更新

データの更新
※条件を指定しない場合、指定した列名全てが更新される

```
UPDATE テーブル名 SET 列名 = 更新後の値 WHERE 更新対象となる条件
```

## 13. データの削除

データの削除
※条件を指定しない場合、指定した列名全てが削除される

```
DELETE FROM テーブル名 WHERE 削除対象となる条件
```

## 14. トランザクション処理

### トランザクションとは？
「これ以降の一連の処理」という意味になります。
SQLでは「START TRANSACTION」と宣言する事で、
以降の処理をキャンセルし実行前の状態に戻す事ができます。
この機能をロールバックと呼びます。

ロールバック実行
※以下の場合、SQL命令文の処理はキャンセルされる

```
START TRANSACTION;
SQL命令文
ROLLBACK;
```

## コミット
問題なく処理を終えた場合は、コミットを行い処理を確定させます。

コミット実行
※以下の場合、SQL命令文の処理は入力した内容で確定されます

```
START TRANSACTION;
SQL命令文
COMMIT;
```