SQLクエリ文をまとめてみた

# プロゲートでSQLクエリ文を学んだので自分なりに簡単にまとめてみる

RailsではSQL文を自動で発行してくれていたので、基本的なSQL知識をつけるために学びました。
参考程度にお願いします。誤字等あったらすみません。

<details><summary>**題目一覧　これを全文検索(Macならcommand+F)すれば早いかもです！！**</summary>
⭐️データ取得系⭐️
データの取得 
取得したデータのカラム名を別名にする 
データの取得　複数
データの取得　カラム全部
条件付き
条件付き　NOT 
複数条件付き
複数条件付き どちらかを満たす場合
"なまえ"を含むデータの取得
前方一致
後方一致
NULLデータの取得
NULLじゃないデータの取得
取得データの並び替え  ASC(昇順):小さい順　DESC(降順):大きい順
重複を省く
カラムの四則演算
カラムの合計取得　SUM関数
カラムの平均取得　AVG関数
カラムの合計"数"取得　COUNT関数
カラムの最小値取得　MIN関数
カラムの最大値取得 MAX関数
グループ化 
複数カラムのグループ化 
WHEREとGROUP BY 
グループ化したデータの更なる絞り込み　
サブクエリの追加 
⭐️テーブル同士の紐つけ　と　テーブルを分けるメリット⭐️
テーブルの結合 
複数テーブルでのカラムの指定
複数テーブルでのカラムの指定 WHERE
NULLの取得をする　LEFT JOIN　
3つ以上のJOIN
⭐️データの追加編集削除系⭐️
データの追加 
データの変更
データの削除　
</details>

(作成終わり後の私)
↑あ…画面右側にメニューが出来るんですね…。そっちのがいいかもです。苦笑



### SQL文の処理順番　
SQL文にも処理順序があるそうなのでイメージしながらやるとやりやすいです。

|実行内容|SQL文|
|---|---|
|テーブル指定|FROM|
|結合|ON・JOIN|
|取得条件|WHERE|
|グループ化|GROUP BY  |
|関数|COUNT・SUM・AVG・MAX・MIN|
|更に絞り込み|HAVING  |
|検索|SELECT・DISTINCT|
|順序|ORDER BY|
|取得数指定|LIMIT|

##⭐️データ取得系⭐️

### データの取得 

```
SELECT カラム名
FROM テーブル名
;　
```

### 取得したデータのカラム名を別名にする 

```
SELECT カラム名 AS "別名"
FROM テーブル名
;　
```

### データの取得　複数

```
SELECT カラム名①,　カラム名② 
FROM テーブル名
;
```

### データの取得　カラム全部

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

### 条件付き

```
SELECT カラム名 
FROM テーブル名
WHERE 条件　細かい演算子は本記事では書きません。
;
```

### 条件付き　NOT 
```
SELECT カラム名 
FROM テーブル名
WHERE NOT 条件　細かい演算子は本記事では書きません。
;
```

### 複数条件付き

```
SELECT カラム名 
FROM テーブル名
WHERE 条件　細かい演算子は本記事では書きません。
AND 条件②
;
```

### 複数条件付き どちらかを満たす場合

```
SELECT カラム名 
FROM テーブル名
WHERE 条件　細かい演算子は本記事では書きません。
OR 条件②
;
```



### "なまえ"を含むデータの取得

```
SELECT カラム名
FROM テーブル名
WHERE カラム名　LIKE "%なまえ%"
```
#### 前方一致
```
WHERE カラム名　LIKE "名前%"
```

#### 後方一致
```
WHERE カラム名　LIKE "%名前"
```

###NULLデータの取得
```
SELECT カラム名
FROM テーブル名
WHERE カラム名　IS NULL
;
```

###NULLじゃないデータの取得
```
SELECT カラム名
FROM テーブル名
WHERE カラム名　IS NOT NULL
;
```

###取得データの並び替え  ASC(昇順):小さい順　DESC(降順):大きい順
```
SELECT カラム名
FROM テーブル名
ORDER BY カラム名　DESC or ASC
;
```

### 必要な分のデータの取得 

```
SELECT カラム名
FROM テーブル名
LIMIT 数
;　
```

### 重複を省く
```
SELECT DISTINCT(カラム名)
FROM テーブル名
;
```

### カラムの四則演算
```
SELECT　カラム名　* 1.08　など
FROM テーブル名
;
```

### カラムの合計取得　SUM関数
```
SELECT　SUM(カラム名)
FROM テーブル名
;
```


### カラムの平均取得　AVG関数
```
SELECT　AVG(カラム名)
FROM テーブル名
;
```

### カラムの合計"数"取得　COUNT関数
```
SELECT　COUNT(カラム名)
FROM テーブル名
;
```

### カラムの最小値取得　MIN関数
```
SELECT　MIN(カラム名)
FROM テーブル名
;
```

### カラムの最大値取得 MAX関数
```
SELECT　MAX(カラム名)
FROM テーブル名
;
```
### グループ化 ※SELECTで使えるのはGROUP BY に指定しているカラム名と集計関数のみ

```
SELECT カラム名
FROM テーブル名
GROUP BY カラム名
;　
```
### 複数カラムのグループ化 

```
SELECT カラム名①,　カラム名②
FROM テーブル名
GROUP BY カラム名①, カラム名②
;　
```

### WHEREとGROUP BY 　※WHERE→GROUP BY の順で書く事

```
SELECT カラム名
FROM テーブル名
WHERE 条件
GROUP BY カラム名
;　
```

### グループ化したデータの更なる絞り込み　※WHERE→GROUP BY→HAVING の順で書く事

```
SELECT カラム名
FROM テーブル名
WHERE 条件
GROUP BY カラム名
HAVING　条件
;　
```


### サブクエリの追加 ※追加されたサブクエリが実行されてからクエリが実行されるそうです

```
SELECT カラム名
FROM テーブル名
WHERE 条件 (
 SELECT カラム名
 FROM　テーブル名
 WHERE 条件
);　
```


## ⭐️テーブル同士の紐つけ　と　テーブルを分けるメリット⭐️

テーブルA

|id|名前|別テーブルのid(外部キー)|
|---|---|---|
|1|あいつ|2|
|2|こいつ|1|
|3|そいつ|3|
|4|どいつ|1|

テーブルB

|id(主キー)|名前|寒さランキング|
|---|---|---|
|1|南極|1|
|2|北極|2?|　　　
|3|栃木|3|


2つのテーブルを繋ぐための**主キー**と**外部キー**
DBの正規化で重要ですね。

テーブルを分けるとデータの管理がしやすくなります。

例えば、上のテーブルBの寒さランキング(笑)がテーブルAに全部まとまっているとしましょう。
①「こいつ」さんと「どいつ」さんは「南極」に住んでる
②もし「南極」の「寒さランキング」が変わったら**2箇所**のデータを変更しないといけない

これが２つのテーブルに分かれていることにより、「寒さランキング」が変わっても**1箇所**のデータ変更で済みます。


### テーブルの結合 ※結合した場合のクエリの実行順序 FROM→JOIN→ON→SELECT　※NULLは取得しない

```
SELECT カラム名
FROM テーブルA
JOIN テーブルB
ON テーブルA.カラム名(外部キー) = テーブルB.カラム名(主キー)
;　
```

### 複数テーブルでのカラムの指定

```
SELECT テーブル名A.カラム名, テーブル名B.カラム名
FROM テーブルA
JOIN テーブルB
ON テーブルA.カラム名(外部キー) = テーブルB.カラム名(主キー)
;　
```

### 複数テーブルでのカラムの指定 WHERE

```
SELECT テーブル名A.カラム名, テーブル名B.カラム名
FROM テーブルA
JOIN テーブルB
ON テーブルA.カラム名(外部キー) = テーブルB.カラム名(主キー)
WHERE テーブル名A.カラム名　条件式など
;　
```

### NULLの取得をする　LEFT JOIN　

```
SELECT テーブル名A.カラム名, テーブル名B.カラム名
FROM テーブルA
LEFT JOIN テーブルB
ON テーブルA.カラム名(外部キー) = テーブルB.カラム名(主キー)
;　
```

### 3つ以上のJOIN

```
SELECT テーブル名A.カラム名, テーブル名B.カラム名, テーブル名.カラム名
FROM テーブルA
JOIN テーブルB
ON テーブルA.カラム名(外部キー) = テーブルB.カラム名(主キー)
LEFT JOIN テーブルC
ON テーブルA.カラム名(外部キー) = テーブルC.カラム名(主キー)
;　
```

##⭐️データの追加編集削除系⭐️

### データの追加 ※idカラムはAUTO INCREMENT機能で自動で値が割り当てられるらしい

```
INSERT INTO テーブル名(カラム名A、カラム名B,カラム名C)
VALUE(カラムAにはいる値、　カラムBにはいる値、　カラムCにはいる値)

select * from テーブル名;
```

### データの変更 ※WHEREのid指定を忘れると全て変わってしまいます。

```
UPDATE テーブル名
SET カラム名=変更したい値, カラム名B=変更したい値
WHERE id = 削除したいレコードのID
;
```

### データの削除　※WHEREのid指定を忘れると全て消えてしまいます。

```
DELETE FROM テーブル名
WHERE id = 削除したいレコードのID
;
```

以上です。