SQL入門

#tableA#

tableA

|name|birthplace|birthmonth|
|---|---|---|
|sato|hokkaido|9|
|yamada|tokyo|2|
|tanaka|kanagawa|5|
|takahashi|osaka|1|
|iwata|kanagawa|7|

表のことを**テーブル**
縦の列のことを**カラム**
横の列のことを**レコード**

##FROM SELECT##

tableA の name と birthmonth を取得する。

```SQL:
SELECT name, birthmonth
FROM tableA;
```

|name|birthmonth|
|---|---|---|
|sato|9|
|yamada|2|
|tanaka|5|
|takahashi|1|
|iwata|7|

##AS##

AS を使ってカラム名を変更する。
※別名に日本語を指定する場合は「’（シングルクォーテーション）」で囲む。

```SQL:
SELECT name AS ’名前’, birthmonth AS ’誕生月’
FROM tableA;
```

|名前|誕生月|
|---|---|---|
|sato|9|
|yamada|2|
|tanaka|5|
|takahashi|1|
|iwata|7|

##*##

* を使い、全カラムを指定する。

```SQL:
SELECT *
FROM tableA;
```

|name|birthplace|birthmonth|
|---|---|---|
|sato|hokkaido|9|
|yamada|tokyo|2|
|tanaka|kanagawa|5|
|takahashi|osaka|1|
|iwata|kanagawa|7|

##DISTINCT##

重複なしで birthplace の一覧を取得する。

```SQL:
SELECT DISTINCT(birthplace)
FROM tableA;
```

|birthplace|
|---|
|hokkaido|
|tokyo|
|kanagawa|
|osaka|

#tablB#

tableB

|horse|age|gender|
|---|---|---|
|kurono|5|hinnba|
|ehu|3|boba|
|deep|4|boba|
|title|3|boba|
|kiseki|7|boba|

##WHERE##

5歳以上の horse と　age を取得する。

```SQL:
SELECT horse, age
FROM tableB
WHERE age > 5;
```

|horse|age|
|---|---|---|
|kurono|5|
|kiseki|7|

###HAVING###

- WHERE はテーブル内のデータから条件にあうデータを抽出。
- HAVING は　*グルーピングしたデータの中から*、更に特定の条件でデータを抽出する。

1.FROM
2.WHERE
3.GROUP BY
4.HAVING
5.SELECT
6.ORDER BY

##AND##

4歳以上の boba の情報を取得する。

```SQL:
SELECT *
FROM tableB
WHERE age > 5 AND gender = ’boba’;
```

|horse|age|gender|
|---|---|---|
|deep|4|boba|
|kiseki|7|boba|

- AND と　OR を組み合わせた場合、AND が先に計算されるため、`()`をつけて正しく優先順位を計算する必要があります。

##OR##

７歳以上か hinba の情報を取得する。

```SQL:
SELECT *
FROM tableB
WHERE age > 7 OR gender = ’hinba’;
```

|horse|age|gender|
|---|---|---|
|kurono|5|hinnba|
|kiseki|7|boba|

- AND と　OR を組み合わせた場合、AND が先に計算されるため、`()`をつけて正しく優先順位を計算する必要があります。

##BETWEEN##

4〜5歳ののデータを取得する。

```SQL:
SELECT *
FROM tableB
WHERE age BETWEEN 4 AND 6;
```

|horse|age|gender|
|---|---|---|
|kurono|5|hinnba|
|deep|4|boba|

##IN,NOT IN##

boba か　hinba の情報を取得する。

```SQL:
SELECT *
FROM tableB
WHERE gender IN (’boba’,’hinba’);
```

|horse|age|gender|
|---|---|---|
|kurono|5|hinnba|
|ehu|3|boba|
|deep|4|boba|
|title|3|boba|
|kiseki|7|boba|

##LIKE##

horse が　k から始まるものを検索する。

```SQL:
SELECT *
FROM tableB
WHERE horse LIKE ’k%’;
```

|horse|age|gender|
|---|---|---|
|kurono|5|hinnba|

##IS NULL,IS NOT NULL##

horse が空のものを検索する。

```SQL:
SELECT *
FROM tableB
WHERE horse IS NULL;
```

|horse|age|gender|
|---|---|---|

##LIMIT##

２行だけを取得する。

```SQL:
SELECT *
FROM tableB
WHERE LIMIT 2;
```

|horse|age|gender|
|---|---|---|
|kurono|5|hinnba|
|ehu|3|boba|

##ORDER BY##

```SQL:
SELECT *
FROM tableB
ORDER BY age;
```
age の昇順で並び替える。

|horse|age|gender|
|---|---|---|
|ehu|3|boba|
|title|3|boba|
|deep|4|boba|
|kurono|5|hinnba|
|kiseki|7|boba|

age 降順で並び替える。

```SQL:
SELECT *
FROM tableB
ORDER BY age DESC;
```

|horse|age|gender|
|---|---|---|
|kiseki|7|boba|
|kurono|5|hinnba|
|deep|4|boba|
|ehu|3|boba|
|title|3|boba|

#tableC#

tableC

|name|date|team|age|
|---|---|---|---|
|sato|2021-04-01|dev|27|
|yamada|2021-04-01|ops|27|
|tanaka|2021-04-02|ops|27|
|takahashi|2021-04-02|ops|35|
|iwata|2021-04-03|dev|22|

##COUNT##

date ごとに数を数える。

```SQL:
SELECT COUNT(name)
FROM tableC
WHERE date = ’2021-04-03’;
```

|COUNT|
|---|
|1|

COUNT:レコード数
AVG:平均数
MAX:最大値
MIN:最初値
SUM:合計

##GROUP BY##

date ごとに数を数える。

```SQL:
SELECT date, COUNT(name)
FROM tableC
GROUP BY date;
```

|date|COUNT|
|---|---|
|2021-04-01|2|
|2021-04-02|2|
|2021-04-03|1|

##GROUP BY##

date ごとの team を数える。

```SQL:
SELECT date, team, COUNT(name)
FROM tableC
GROUP BY date, team;
```

|date|team|COUNT|
|---|---|---|
|2021-04-01|dev|1|
|2021-04-01|ops|1|
|2021-04-02|ops|2|
|2021-04-03|dev|1|

#tableD tableE#

tableD

|id|name|
|---|---|
|1|sato|
|2|yamada|
|3|tanaka|
|4|kikuchi|
|5|ishida|

tableE

|id|tableDid|birthplace|
|---|---|---|
|1|3|tokyo|
|2|1|kanagawa|
|3|4|saitama|
|4|5|osaka|

##INNER JOIN##

name ごとの birthplace を取得する。

```SQL:
SELECT D.name, E.birthplace
FROM tableD AS D
INNER JOIN tableE AS E ON D.id = E.tableDid;
```

|name|birthplace|
|---|---|
|sato|kanagawa|
|tanaka|tokyo|
|kikuchi|saitama|
|ishida|osaka|

##LEFT INNER JOIN##

条件に一致しないものは消えてしまうため、レコード数にミスが生じるため、LEFT INNER JOINを使う。

```SQL:
SELECT D.name, E.birthplace
FROM tableD AS D
LEFT INNER JOIN tableE AS E ON D.id = E.tableDid;
```

|name|birthplace|
|---|---|
|sato|kanagawa|
|yamada|null|
|tanaka|tokyo|
|kikuchi|saitama|
|ishida|osaka|

#tableF#

|prefname|population|
|---|---|
|kanagawa|700|
|tokyo|900|
|osaka|600|
|aichi|400|

##CASE##

地域ごとの人口を出す。

```SQL:
SELECT
 CASE WHEN prefname IN ('kanagawa','tokyo') THEN 'kanto'
 WHEN prefname IN ('osaka','aichi') THEN 'kansai'
 ELSE NULL
 END AS tableF2
 SUM(population)
FROM tableF
GROUP BY
 CASE WHEN prefname IN ('kanagawa','tokyo') THEN 'kanto'
 WHEN prefname IN ('osaka','aichi') THEN 'kansai'
 ELSE NULL
 END;
```

tableF2

|prefname|population|
|---|---|
|kanto|1600|
|kansai|800|

#tableG#

|type|brand|price|
|---|---|---|
|airmax|nike|15000|
|airforce|nike|11000|
|airjodan|nike|12000|
|supersutar|adidas|11000|
|stansmith|adidas|10000|

##サブクエリ1##

平均価格以上の商品を取得する。

```SQL:
SELECT *
WHERE price >= (SELECT AVG(price) 
                FROM tableG);
```

|type|brand|price|
|---|---|---|
|airmax|nike|15000|
|airjodan|nike|12000|

##サブクエリ2##

brand ごとの平均価格を取得する。

```SQL:
SELECT *
FROM tableG AS g1
WHERE price >= (SELECT AVG(price) 
                FROM tableG AS g2
                WHERE g1.brand = g2.brand
                GROUP BY brand);
```

|type|brand|price|
|---|---|---|
|airmax|nike|15000|
|supersutar|adidas|11000|