コピペして使える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年【春期】【秋期】 応用情報技術者 合格教本 (情報処理技術者試験)
令和05年 イメージ&クレバー方式でよくわかる 栢木先生の基本情報技術者教室 (情報処理技術者試験)