SQL基本まとめ① （基本形、集計関数等）

##はじめに
Progateで学習したSQLの基本を自分なりにまとめておく。


##データベースとは
テキストや数値などのデータを保存するためのツール

「テーブル」という表でデータを管理している
縦の列を「カラム」、横の行のことを「レコード」という


##クエリとは
データを取得するために、データベースに送る命令をクエリと呼ぶ
SQL(Structured Query Language)とは、クエリを書くための言語


##SELECT, FROM, WHERE
おそらく下記のコードがSQLの一番基本的な形

```sql
SELECT カラム名1, カラム名2, ... -- (取得するデータのカラムを指定、全カラムからデータを取得する場合は`*`を用いる)
FROM テーブル名 -- (取得するテーブルを指定)
WHERE　カラム名 = 値 -- (どのレコード(行)を取得するか)
; -- (セミコロン)でクエリの終わりを示す
```

例）

```sql
SELECT name, price -- 'name', 'price'カラムを指定
FROM purchases;  -- 'purchases'テーブルを指定
WHERE name = "SOUL'd OUT" -- 'name'が"SOUL'd OUT"と一致するレコードを取得
;
```

###データ型　
カラムごとに、数値やテキスト、日付などのデータの型が決められている

###比較演算子
比較演算子(<, >, <=, >=, etc.)を用いることで、数値や日付の条件を指定できる。

例）

```sql
-- 数値型の比較
SELECT *
FROM purchases
WHERE price >= 1000; 

-- 日付型の比較
SELECT *
FROM purchases
WHERE purchased_at <= "2017-08-01";
```

##WHERE ... LIKE ...
特定の要素を"含む"データを取得する

例）
「ガム」を含むデータで、「キシリトールガム」も取得したい
`WHERE カラム名 LIKE 文字列;`
"%ガム%" 「ガム」前後のワイルドカード(%)により、「ガム」を含むデータを取得できる

```sql
SELECT *
FROM purchases
WHERE name LIKE "ガム%";
```

###NOT演算子
それを”含まない”データを取得する

例）
「ガム」を含まないデータを取得

```sql
SELECT *
FROM purchases
WHERE NOT name LIKE "%ガム%";
```

##IS NULL, IS NOT NULL
「何もデータがない」というのを`NULL`で表現する

```sql
カラム名 IS NULL; -- 指定したカラムがNULLで'ある'データを取得
カラム名 IS NOT NULL; -- 指定したカラムがNULLで'ない'データを取得

-- ※注意
カラム名 = NULL;
NOT カラム名 = NULL; -- という形にはできない！
```

例）

```sql
SELECT *
FROM purchases
WHERE price IS NULL;
```


##AND, OR演算子
複数の条件を組み合わせる

例）

```sql
SELECT *
FROM purchases
WHERE category = "食費"
AND character_name = "ひつじ仙人";
```

##ORDER BY
データの並び替えを行う
並べ方: ASC(昇順), DESC(降順)

```sql
ORDER BY カラム名 並べ方;
```

例）

```sql
SELECT *
FROM purchases
WHERE character_name = "にんじゃわんこ"
ORDER BY price ASC;
```

##LIMIT
最大で取得するデータの数を`n`に制限する
クエリの末尾に記述する

```sql
LIMIT n;
```


##DISTINCT
重複するデータを省くことができる

```sql
-- DISTINCT(カラム名)
SELECT DISTINCT(name)
FROM purchases;
```

##集計関数
###SUM
合計値を求める

```sql
-- SUM(カラム名)
SELECT SUM(price)
FROM purchases
WHERE character_name = "にんじゃわんこ"; -- 特定のカラムの合計を求める
```

###AVG
平均値を求める

```sql
-- AVG(カラム名)
SELECT AVG(price)
FROM purchases
WHERE character_name = "にんじゃわんこ";
```

###COUNT
データの数を数える
NULLはカウントしない
COUNT(*)とすることで、全てのデータが対象になり、特定のカラムのデータの数ではなく、レコードの数を計算する

```sql
-- COUNT(カラム名)
SELECT COUNT(*)
FROM purchases
WHERE character_name = "にんじゃわんこ"; -- 特定の要素を含むデータの数
```

###MAX, MIN
最大値、最小値を求める

```sql
-- MAX/MIN(カラム名)
SELECT MAX(price)
FROM purchases
WHERE character_name = "にんじゃわんこ";
```

##GROUP BY
指定したカラムのデータをグループ化する
`GROUP BY`を用いる場合、`SELECT`で使えるのは、`GROUP BY`に所属しているカラム名と、集計関数のみ

```sql
-- GROUP BY カラム名
SELECT COUNT(price), purchased_at
FROM purchases
GROUP BY purchased_at;
```

###複数のカラムのグループ化
```sql
-- GROUP BY カラム名1, カラム名2, ...
SELECT SUM(price), purchased_at, character_name
FROM purchases
GROUP BY purchased_at, character_name;
```

##HAVING
グループ化したデータをさらに絞り込む
`WHERE`はグループ化される前のテーブル全体を検索対象とし、
`HAVING`はグループ化されたデータを検索対象とする。
集計関数を用いた`SUM(price)`などは、`sum(price)`という新しいカラム名となる

```sql
-- GROUP BY カラム名
-- HAVING 条件;
SELECT SUM(price), purchased_at, character_name
FROM purchases
GROUP BY purchased_at, character_name
HAVING SUM(price) > 3000;
```

##実行される順番
1. 検索: `WHERE`
2. グループ化: `GROUP BY`
3. 関数: `COUNT`, `SUM`, `AVG`, `MAX`, `MIN`
4. HAVING: `HAVING`

##おわりに
次回はサブクエリや複数テーブルの結合、データの取得・更新・削除など、もう少し複雑な処理について触れる。

[SQL基本まとめ②（サブクエリ、JOIN、データの挿入・更新・削除） ▶️](https://qiita.com/moromin/items/434be35bbc173fba9bff)