SQL 辞典

SQL コースで覚える構文の一覧です。

SELECT表からデータを取り出すLv1 で覚える

SELECT 列, 列 FROM 表;
SELECT * FROM 表;

* はすべての列。列どうしの計算や、AS で列に別名をつけることもできます。文の最後は ; で終わります。

SELECT name, price FROM items;
SELECT price * 1.1 AS with_tax FROM items;

WHERE条件に合う行だけにするLv3 で覚える

SELECT … FROM 表 WHERE 条件;

= <> < > <= >= で比べます。文字列や日付は '…' で囲みます。AND・OR・NOT で条件を組み合わせ、かっこで優先順位を決めます。

SELECT * FROM items WHERE price >= 1000 AND category = 'book';

ORDER BY並べ替えるLv5 で覚える

… ORDER BY 列 [ASC | DESC], 列 …

ASC は小さい順(省略時)、DESC は大きい順。複数の列を書くと、前の列が同じときに次の列で並べます。

SELECT * FROM items ORDER BY price DESC, name;

DISTINCT重複した行を 1 つにするLv6 で覚える

SELECT DISTINCT 列 FROM 表;

選んだ列の組み合わせが同じ行を 1 行にまとめます。

SELECT DISTINCT category FROM items;

LIMIT / FETCH FIRST件数を絞るLv6 で覚える

… LIMIT n [OFFSET m]
… FETCH FIRST n ROWS ONLY

先頭から n 行だけ返します。ORDER BY と組み合わせて上位 n 件に。FETCH FIRST は標準 SQL の書き方です。

SELECT * FROM items ORDER BY price DESC LIMIT 3;

LIKEパターンで探すLv8 で覚える

列 LIKE 'パターン'
列 NOT LIKE 'パターン'

% は 0 文字以上、_ はちょうど 1 文字。大文字小文字を区別します(PostgreSQL の ILIKE は区別しない)。

SELECT * FROM members WHERE email LIKE '%@example.com';

BETWEEN範囲に入っているLv9 で覚える

列 BETWEEN a AND b

a 以上 b 以下(両端を含む)。日付の範囲にもよく使います。

SELECT * FROM orders WHERE ordered_on BETWEEN '2024-04-01' AND '2024-04-30';

IN候補のどれかに一致するLv9 で覚える

列 IN (値, 値, …)
列 IN (SELECT …)

OR を並べる代わりに使えます。NOT IN は候補に NULL があると何も返らない点に注意。

SELECT * FROM items WHERE category IN ('book', 'game');

IS NULL値がない(NULL)か調べるLv10 で覚える

列 IS NULL
列 IS NOT NULL

NULL は「値がない」こと。= NULL では比べられないので IS NULL を使います。

SELECT * FROM members WHERE phone IS NULL;

COALESCE / NULLIFNULL を置き換えるLv10 で覚える

COALESCE(値, 代わりの値, …)
NULLIF(a, b)

COALESCE は最初の NULL でない値を返します。NULLIF は a と b が同じなら NULL(0 での割り算よけに)。

SELECT COALESCE(phone, '未登録') FROM members;

文字列関数文字を加工するLv11 で覚える

UPPER(s) LOWER(s) LENGTH(s)
SUBSTRING(s FROM 開始 FOR 長さ) / SUBSTR(s, 開始, 長さ)
TRIM(s) REPLACE(s, 古, 新) LPAD(s, 桁, 文字)
s || t  CONCAT(s, t)

|| で文字列をつなげます。位置は 1 から数えます。

SELECT UPPER(name) || '様' FROM members;

数値関数数を丸める・計算するLv12 で覚える

ROUND(x, 桁) TRUNC(x, 桁) CEIL(x) FLOOR(x)
ABS(x) MOD(a, b) POWER(a, b)

ROUND は四捨五入、TRUNC は切り捨て、CEIL は切り上げ。整数どうしの割り算は小数が切り捨てられます。

SELECT ROUND(AVG(price), 1) FROM items;

日付関数日付を扱うLv12 で覚える

CURRENT_DATE  CURRENT_TIMESTAMP
EXTRACT(YEAR FROM 日付)
日付 - 日付(日数)  日付 + 整数

EXTRACT で年・月・日を取り出します。PostgreSQL では date_trunc・to_char・interval も使えます。

SELECT EXTRACT(MONTH FROM ordered_on) FROM orders;

CAST型を変えるLv12 で覚える

CAST(値 AS 型)
値::型(PostgreSQL)

文字列を数や日付に、数を文字列に変えます。

SELECT CAST('2024-04-01' AS DATE);

CASE場合分けするLv13 で覚える

CASE WHEN 条件 THEN 値 … ELSE 値 END
CASE 列 WHEN 値 THEN 値 … END

上から順に調べて最初に合った THEN の値になります。ELSE がなければ NULL。集計の中にも書けます。

SELECT name, CASE WHEN price >= 1000 THEN '高' ELSE '安' END FROM items;

COUNT / SUM / AVG / MIN / MAX集計するLv15 で覚える

COUNT(*) COUNT(列) COUNT(DISTINCT 列)
SUM(列) AVG(列) MIN(列) MAX(列)

COUNT(*) は行数、COUNT(列) は NULL でない値の数。集計関数は NULL を無視します。

SELECT COUNT(*), AVG(price) FROM items;

GROUP BYグループごとに集計するLv16 で覚える

SELECT 列, 集計 FROM 表 GROUP BY 列;

同じ値の行をまとめて集計します。SELECT には GROUP BY の列か集計関数だけを書けます。

SELECT category, COUNT(*) FROM items GROUP BY category;

HAVING集計した結果で絞るLv17 で覚える

… GROUP BY 列 HAVING 集計の条件

WHERE は集計の前に行を絞り、HAVING は集計の後にグループを絞ります。

SELECT category, COUNT(*) FROM items GROUP BY category HAVING COUNT(*) >= 3;

JOIN表をつなぐ(内部結合)Lv21 で覚える

FROM 表 a JOIN 表 b ON a.列 = b.列

ON の条件に合う組み合わせだけを残します。INNER JOIN と同じ。同じ名前の列は 別名.列 で区別します。

SELECT o.id, c.name FROM orders o JOIN customers c ON o.customer_id = c.id;

LEFT / RIGHT / FULL JOIN相手がいなくても行を残すLv23 で覚える

FROM a LEFT JOIN b ON …
FROM a RIGHT JOIN b ON …
FROM a FULL OUTER JOIN b ON …

LEFT JOIN は左の表の行をすべて残し、相手がいない列は NULL。WHERE b.id IS NULL で「相手のいない行」を探せます。

SELECT c.name FROM customers c LEFT JOIN orders o ON o.customer_id = c.id WHERE o.id IS NULL;

CROSS JOINすべての組み合わせLv24 で覚える

FROM a CROSS JOIN b

a の行数 × b の行数の組み合わせを作ります。同じ表を 2 回書けば自己結合(社員と上司)もできます。

SELECT s.name, d.day FROM shops s CROSS JOIN days d;

UNION / INTERSECT / EXCEPT結果を重ねるLv25 で覚える

SELECT … UNION [ALL] SELECT …
SELECT … INTERSECT SELECT …
SELECT … EXCEPT SELECT …(Oracle は MINUS)

列の数と型をそろえます。UNION は重複を除き、UNION ALL は残します。

SELECT name FROM staff UNION SELECT name FROM members;

副問い合わせ問い合わせの中に問い合わせLv27 で覚える

WHERE 列 > (SELECT …)
WHERE 列 IN (SELECT …)
FROM (SELECT …) 別名

かっこの中の SELECT の結果を使います。1 つの値・値の並び・表として使えます。

SELECT * FROM items WHERE price > (SELECT AVG(price) FROM items);

EXISTS対応する行があるかLv28 で覚える

WHERE EXISTS (SELECT 1 FROM … WHERE 外側との条件)

外側の行ごとに副問い合わせを調べます(相関副問い合わせ)。NOT EXISTS は「ない」もの。

SELECT * FROM customers c WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);

WITH(共通テーブル式)問い合わせに名前をつけるLv29 で覚える

WITH 名前 AS (SELECT …) SELECT … FROM 名前;
WITH RECURSIVE …(再帰)

長い問い合わせを段階に分けて書けます。複数書くときは , で区切ります。

WITH big AS (SELECT * FROM orders WHERE total >= 10000) SELECT COUNT(*) FROM big;

ウィンドウ関数行を残したまま順位・累計Lv30 で覚える

関数() OVER (PARTITION BY 列 ORDER BY 列)
ROW_NUMBER() RANK() DENSE_RANK()
SUM(列) OVER (…)  LAG(列) LEAD(列)

GROUP BY と違い行はまとまりません。PARTITION BY でグループ、ORDER BY で順番を決めます。

SELECT name, RANK() OVER (ORDER BY score DESC) FROM results;

INSERT行を加えるLv33 で覚える

INSERT INTO 表 (列, …) VALUES (値, …), (値, …);
INSERT INTO 表 SELECT …;

列を書かないときはすべての列を表の順番で。書かなかった列は DEFAULT か NULL になります。

INSERT INTO items (name, price) VALUES ('ペン', 120);

UPDATE値を書き換えるLv34 で覚える

UPDATE 表 SET 列 = 値, … WHERE 条件;

WHERE を忘れるとすべての行が変わります。SET の右側には計算や副問い合わせも書けます。

UPDATE items SET price = price * 1.1 WHERE category = 'book';

DELETE行を消すLv34 で覚える

DELETE FROM 表 WHERE 条件;

WHERE を忘れるとすべての行が消えます。先に SELECT で対象を確かめるのが安全です。

DELETE FROM orders WHERE status = 'cancel';

CREATE TABLE表を作るLv35 で覚える

CREATE TABLE 表 (列 型 [制約], …);

型は INTEGER・VARCHAR(n)・NUMERIC(p,s)・DATE・BOOLEAN など。CREATE TABLE … AS SELECT で結果から作ることもできます。

CREATE TABLE items (id INTEGER PRIMARY KEY, name VARCHAR(50) NOT NULL);

制約入れてよい値を決めるLv35 で覚える

PRIMARY KEY  NOT NULL  UNIQUE  DEFAULT 値
CHECK (条件)  REFERENCES 表(列)  FOREIGN KEY (列) REFERENCES …

PRIMARY KEY は重複も NULL も不可。外部キーは相手の表にある値だけを許します。違反するとエラーになります。

CREATE TABLE orders (id INTEGER PRIMARY KEY, item_id INTEGER REFERENCES items(id), qty INTEGER CHECK (qty > 0));

ALTER TABLE表の形を変えるLv36 で覚える

ALTER TABLE 表 ADD COLUMN 列 型;
ALTER TABLE 表 DROP COLUMN 列;
ALTER TABLE 表 RENAME COLUMN 古 TO 新;
ALTER TABLE 表 ADD CONSTRAINT 名前 …;

列の追加・削除・名前の変更・制約の追加ができます。

ALTER TABLE items ADD COLUMN stock INTEGER DEFAULT 0;

DROP表などを消すLv36 で覚える

DROP TABLE [IF EXISTS] 表;
DROP VIEW / DROP INDEX …

表そのものを消します(データも消える)。

DROP TABLE IF EXISTS tmp_items;

TRUNCATE表を空にするLv36 で覚える

TRUNCATE TABLE 表;

全行を一度に消します(表は残る)。

TRUNCATE TABLE logs;

トランザクションまとめて確定・取り消しLv37 で覚える

BEGIN; … COMMIT;
BEGIN; … ROLLBACK;
SAVEPOINT 名前; ROLLBACK TO 名前;

BEGIN から COMMIT までの変更はまとめて確定し、ROLLBACK で全部取り消します。Oracle は BEGIN なしで、COMMIT するまで確定しません。

BEGIN; UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; COMMIT;

CREATE INDEX検索を速くするLv38 で覚える

CREATE [UNIQUE] INDEX 名前 ON 表 (列, …);
DROP INDEX 名前;

よく WHERE や JOIN に使う列に作ると検索が速くなります。UNIQUE INDEX は重複を許しません。

CREATE INDEX idx_orders_customer ON orders (customer_id);

CREATE VIEW問い合わせに名前をつけて表のように使うLv38 で覚える

CREATE [OR REPLACE] VIEW 名前 AS SELECT …;

ビューはデータを持たず、使うたびに中の SELECT が実行されます。

CREATE VIEW book_items AS SELECT * FROM items WHERE category = 'book';