SQL 基本操作メモ（データ取得編）


# 基本操作

### **■列を選択　SELECT**



```sql
SELECT name, price
```

### **■テーブルを選択　FROM**

テーブル sales_data から、
列 name, price を出力

```sql
SELECT name, price
FROM sales_data;
```

### **■全ての列を選択　SELECT *　**

```sql
SELECT *
FROM sales_data;
```

### **■条件を選択　WHERE**

テーブル sales_data から、
列 name が apple の、全ての列を出力

```sql
SELECT *
FROM sales_data
WHERE name = "apple";
```

- テキスト →　クオーテーションで囲む
- 数値 →　クオーテーションで囲まない
- 日付 →　クオーテーションで囲む

```sql
WHERE name = "apple"

WHERE price = 500

WHERE date = "2018-06-13"
```
比較演算子も使用可能

```sql
WHERE price >= 500

WHERE date < "2018-06-13"
```




### **■特定の文字を含むデータの取得　LIKE**

nameカラムで「banana」を含むデータ

```sql
WHERE name LIKE "%banana%"
```

nameカラムで「banana」で始まるデータ

```sql
WHERE name LIKE "banana%"
```

nameカラムで「banana」で終わるデータ

```sql
WHERE name LIKE "%banana"
```

### **■否定の条件　WHERE NOT**

priceカラムが 1000 でないデータ

```sql
WHERE NOT price = 1000
```


nameカラムで「banana」を含まないデータ

```sql
WHERE NOT name LIKE "%banana%"
```




### **■NULLの扱い　IS NULL / IS NOT NULL**

price が NULL のデータを抽出

```sql
WHERE price IS NULL
```

price が NULL でないデータを抽出

```sql
WHERE price IS NOT NULL
```


### **■WHERE文に複数の条件　AND / OR**

両方の条件を満たすデータを抽出

```sql
WHERE category = "A" AND name = "orange"
```


どちらかの条件を満たすデータを抽出

```sql
WHERE category = "A" OR name = "orange"
```

### **■並べ替え　ORDER BY**

- ASC : 昇順
- DESC : 降順

テーブル sales_data の中で price 列を降順で抽出

```sql
SELECT *
FROM sales_data
ORDER BY price DESC;
```

### **■出力行数の制限　LIMIT**

10件まで表示

```sql
SELECT *
FROM sales_data
WHERE price = 800
LIMIT 10;
```

### **■重複を省いたデータを取得　DISTINCT**

```sql
SELECT DISTINCT (name)
FROM sales_data;
```

### **■四則計算**

- 足し算：+
- 引き算：-
- 掛け算：*
- 割り算：/

price を税込金額に変更（1.08をかける）

```sql
SELECT price * 1.08
FROM sales_data;
```

### **■関数**

- 合計：SUM()
- 平均：AVG()
- データ数：COUNT() 【NULLはカウントしない】
- 全行数：COUNT(*)
- 最大値：MAX()
- 最小値：MIN()

name が apple のデータの price の合計

```sql
SELECT SUM(price)
FROM sales_data
WHERE name = "apple";
```

### **■グループ化と集計　GROUP BY**

name ごとの price の合計値を出力

```sql
SELECT name, SUM(price)
FROM sales_data
GROUP BY name;
```
【WHERE との併用も可能（WHEREから先に適用される）】

### **■グループ化したデータの絞り込み　HAVING**

```sql
SELECT name, SUM(price)
FROM sales_data
GROUP BY name
HAVING SUM(price) >= 500;
```

### **■サブクエリを使って複雑なデータを取得する**

apple の価格より高い価格を持つ name を表示

```sql
SELECT name
FROM sales_data
WHERE price > (
    SELECT price
    FROM sales_data
    WHERE name = "apple"
);
```

### **■カラムに別の名前をつける　AS**

```sql
SELECT price AS "appleの価格"
FROM sales_data
WHERE name = "apple";
```
```sql
SELECT name AS "priceが500より高い商品名"
FROM sales_data
WHERE price > 500;
```

### **■テーブルの結合　JOIN ON**

別テーブル countries と country_id、idを基点に結合

```sql
SELECT *
FROM sales_data
JOIN countries
ON sales_data.country_id = countries.id;
```

複数テーブルでのカラムの指定（テーブル名.カラム名）

```sql
SELECT sales_data.name, countries.name
FROM sales_data
JOIN countries
ON sales_data.country_id = countries.id;
```

NULLのレコードも表示させる場合（LEFT JOIN）

```sql
SELECT sales_data.name, countries.name
FROM sales_data
LEFT JOIN countries
ON sales_data.country_id = countries.id;
```
テーブルをさらに結合

```sql
SELECT *
FROM sales_data
JOIN countries
ON sales_data.country_id = countries.id
LEFT JOIN suppliers
ON sales_data.supplier_id = suppliers.id;
```

# 処理の順番

テーブル指定（FROM）
　↓
結合（JOIN ON）
　↓
条件（WHERE）
　↓
グループ化（GROUP BY）
　↓
関数処理（SUM, AVG...）
　↓
グループデータの絞り込み（HAVING）
　↓
検索（SELECT）
　↓
順序（ORDER BY）
　↓
出力数調整（LIMIT）