コピペできるSQL文(基礎)

コピペして使えるSQL文です。

# 前提
テーブル`A`
a1|a2|a3
---|---|---
-|-|-
-|-|-
-|-|-

テーブル`B`
b1|b2|b3
---|---|---
-|-|-
-|-|-
-|-|-

テーブル`C`
c1|c2|c3
---|---|---
-|-|-
-|-|-
-|-|-

# テーブルAのカラムa1を抽出する
```
SELECT a1 FROM A
```

# 条件に合ったレコードを取得する

|SQL文|カラムa1が|
---|---
a1 = 1|1に等しい
a1 <> 1|1出ない
a1 > 1|1より大きい
a1 >= 1|1以上
a1 LIKE '%あ%'|パターン'%あ%'に当てはまる
a1 IN (1,2,3) | 1,2,3のいずれか
a1 NOT IN (1,2,3) | 1,2,3どれでもない
a1 BETWEEN 1 AND 2 | 1以上2以下
a1 IS NULL | NULL
a1 IS NOT NULL | NOT NULL

`%` : 0文字以上の任意の文字列
`*` : 1文字以上の任意の文字列
`-` : 任意の1文字
|||
---|---
AND| かつ
OR | または
NOT | 出ない

```
SELECT * FROM A
  WHERE a1 >= 3 AND a2 <= 5
```


# カラムa1の昇順に並べる
```
SELECT * FROM A
  ORDER BY a1 ASC
```
# 降順
```
SELECT * FROM A
  ORDER BY a1 DESC
```

# 重複したデータは1つだけ表示
```
SELECT DISTINCT * FROM A
```

# 表や列に別名をつける
```
SELECT a1 AS 'a1_new' FROM A A_new
INNER JOIN B B_new ON A_new.a1 = B_new.b1
```

# テーブルAとBから、a1とb1が一致するレコードを抽出する
a1|a2|b1
---|---|---
-|-|-
-|-|-
-|-|-
```
# 等結合
SELECT A.a1, A.a2, B.b2 FROM A,B
WHERE A.a1 = B.b1

SELECT A.a1, A.a2, B.b2 FROM A
INNER JOIN B ON A.a1 = B.b1

# Aを基準に、Bに無い行をNULLで埋めて結合
SELECT A.a1, A.a2, B.b2 FROM A
LEFT OUTER JOIN B ON A.a1 = B.b1

# Bを基準に、Aに無い行をNULLで埋めて結合
SELECT A.a1, A.a2, B.b2 FROM A
RIGHT OUTER JOIN B ON A.a1 = B.b1

# A,Bの片方にしか無い行をNULLで埋めて結合
SELECT A.a1, A.a2, B.b2 FROM A
FULL OUTER JOIN B ON A.a1 = B.b1

# FULL OUTERでは、Aに行が無いときはA.a1がNULLになってしまう。
# これを表示できるようにする
SELECT COALESCE(A.a1, B.b1), A.a2, B.b2 FROM A
FULL OUTER JOIN B ON A.a1 = B.b1
```

# テーブルA、B、Cからa2とb1、b2とc1が一致するデータを抽出する
```
SELECT * FROM A,B,C
  where A.a2 = B.b1
  and B.b2 = C.c1

SELECT * FROM A
  INNER JOIN B ON A.a2 = B.b1 # こっちの処理が先
  INNER JOIN C ON B.b2 = C.c1 # 上の処理で得られた表にCを結合
```

# テーブルの結合
全く同じカラムを持つ2つのテーブルで使える
```
# 和
SELECT * FROM X UNION SELECT * FROM Y
# 共通
SELECT * FROM X INTERSECT SELECT * FROM Y
# 差
SELECT * FROM X EXCEPT SELECT * FROM Y
```
同じカラムでなくても使える。全ての組み合わせを作成
```
# 直積
SELECT * FROM X CROSS JOIN SELECT * FROM Y
```
# カラム名が同じもので自動的に結合
```
SELECT * FROM X NATURAL JOIN B
```

# 集合関数
|||
---|---
SUM(a1)|合計
AVG(a1)|平均
MAX(a1)|最大
MIN(a1)|最小
COUNT(a1)|NULLでない行数を数える
COUNT(*)|行数を数える

例
a1|a2
---|---
code001|30
code002|45
code003|7

```
SELECT a1, SUM(a2) FROM A
GROUP BY a1

# 条件をつける
SELECT a1, SUM(a2) FROM A
GROUP BY a1
HAVING SUM(a2) < 50
```

# 副問合せ
```
# 副問合せで生成した表から抜き出す
# 副問合せを先に処理
SELECT a1 FROM (SELECT * FROM A WHERE a1 = 3)

# 副問合せを先に処理
SELECT * FROM A
  WHERE a1 IN (SELECT b1 FROM B WHERE b2 = 3)

# 主問合せから副問合せに1行ずつデータを渡す
SELECT * FROM A
  WHERE a1 EXISTS (SELECT * FROM B WHERE b2 = 3 and B.b1 = A.a1)
```

# WITH
そのSELECT文の中だけで使用できる表を定義できる
```
WITH TEMP (temp_a1, temp_count)
  AS (SELECT a1, count(*) FROM A GROUP BY a1)

SELECT * FROM B,TEMP
WHERE B.b1 = TEMP.temp_a1
and TEMP.temp_count > 50
```

# CASE
条件分岐

a1|数値
---|---
code01|10未満
code02|20以上
code03|10以上20未満
```
SELECT a1, CASE
            WHEN a2 < 10 THEN '10未満'
            WHEN a2 >= 10 and a2 < 20 THEN '10以上20未満'
            ELSE '20以上'
            END
            AS '数値'
FROM A
```

# 参考
[令和05年【春期】【秋期】 応用情報技術者 合格教本 (情報処理技術者試験)](https://www.amazon.co.jp/%E4%BB%A4%E5%92%8C05%E5%B9%B4%E3%80%90%E6%98%A5%E6%9C%9F%E3%80%91%E3%80%90%E7%A7%8B%E6%9C%9F%E3%80%91-%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E5%90%88%E6%A0%BC%E6%95%99%E6%9C%AC-%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93-%E3%81%BF%E3%82%84%E5%AD%90/dp/4297131587)
[令和05年 イメージ＆クレバー方式でよくわかる 栢木先生の基本情報技術者教室 (情報処理技術者試験)](https://www.amazon.co.jp/%E4%BB%A4%E5%92%8C05%E5%B9%B4-%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%EF%BC%86%E3%82%AF%E3%83%AC%E3%83%90%E3%83%BC%E6%96%B9%E5%BC%8F%E3%81%A7%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%8B-%E6%A0%A2%E6%9C%A8%E5%85%88%E7%94%9F%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85%E6%95%99%E5%AE%A4-%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93-%E6%A0%A2%E6%9C%A8/dp/4297131307)