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