集合操作(Set Operations)
複数のSELECT結果を組み合わせる操作。
・UNION:重複を除いて結合
SELECT name FROM student
UNION
SELECT name FROM teacher;
・UNION ALL:重複も残す
・INTERSECT:共通部分だけ
・EXCEPT (MINUS):片方にだけ存在するデータ
結合(Join Operations)
複数テーブルを結合して利用。
・INNER JOIN:共通部分だけ
SELECT s.id, s.name, c.course_name
FROM student s
INNER JOIN course c ON s.id = c.student_id;
・LEFT OUTER JOIN:左表を基準に全件取得
・RIGHT OUTER JOIN:右表を基準に全件取得
・FULL OUTER JOIN:両方を基準に全件取得
・CROSS JOIN:デカルト積
・NATURAL JOIN:同じ名前の結合
基本演算(CRUD)
・INSERT:追加
INSERT INTO student (id, name) VALUES (1, ‘Alice’);
UPDATE student SET name = ‘Bob’ WHERE id = 1;
DELETE FROM student WHERE id = 1;
・UPDATE:更新
UPDATE employee
SET salary = salary * 1.1
WHERE department = ‘Sales’;
・DELETE:削除
DELETE FROM employee
WHERE salary < 200000;
・SELECT:取得(最重要)
集約関数(Aggregate Functions)
グループ化して統計を取る。
・COUNT:個数をカウントする
・ SUM:数量を合計する
・ AVG:数値の平均値を計算する
・ MIN:数値の中で最小値を算出する
・MAX:数値の中で最大値を算出する
・GROUP BY:条件が同じものを纏める
・ HAVING:GROUP BY句より下の条件
SELECT department, AVG(salary)
FROM employee
GROUP BY department
HAVING AVG(salary) > 500000;
サブクエリ(Subquery)
クエリの中でクエリを使う。
スカラーサブクエリ(単一値を返す)
・ IN
SELECT name
FROM student
WHERE id IN (SELECT student_id FROM course WHERE course_name=’DB’);
・EXISTS;存在するもの
SELECT name
FROM student s
WHERE EXISTS (
SELECT 1 FROM course c
WHERE c.student_id = s.id
AND c.course_name = ‘DB’
);
→ 「DBを受講している学生」だけ取得
・NOT EXISTS;存在しない場合
SELECT name
FROM student s
WHERE NOT EXISTS (
SELECT 1 FROM course c
WHERE c.student_id = s.id
);
→ 「どの科目も受講していない学生」を取得
ウィンドウ関数(Window Functions)
行ごとの結果に「順位・累計」などを付与できる。
ROW_NUMBER, RANK, DENSE_RANK(順位付け) SUM, AVG, COUNT … OVER()(集計の拡張)
SELECT name, salary,
RANK() OVER(ORDER BY salary DESC) AS rank
FROM employee;
制約・トランザクション
試験でも出やすい。
PRIMARY KEY
・UNIQUE:同じ列に重複した値を入れられないようにする。
CREATE TABLE Users (
user_id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE, — 重複禁止
name VARCHAR(50)
);
📖 ポイント:
・PRIMARY KEY と違い、NULL は許容される(DBMSによっては複数NULL可)。
・重複チェックが必要なカラム(メールアドレス、社員番号など)に利用。
・FOREIGN KEY;他テーブルとの参照整合性を保つ。
CREATE TABLE Orders (
order_id INT PRIMARY KEY,
user_id INT,
order_date DATE,
FOREIGN KEY (user_id) REFERENCES Users(user_id) — Usersに存在するuser_idのみ可
);
📖 ポイント:
・「親テーブル」Users に存在しない user_id は登録できない。
・ON DELETE CASCADE を付けると、親データ削除時に関連レコードも削除される。
・CHECK BEGIN :特定の条件を満たす値だけ
/ COMMIT / ROLLBACK
CREATE TABLE employee (
id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE,
dept_id INT REFERENCES department(id),
salary INT CHECK (salary > 0)
);
CASE式
条件分岐をSQL内で書くときに使う。
SELECT name,
CASE
WHEN score >= 80 THEN ‘優’
WHEN score >= 60 THEN ‘良’
ELSE ‘可’
END AS 評価
FROM student;
→ SQL内で「if文」のように使える。
COALESCE
・複数の引数を順番に評価し、最初に NULL でない値を返す 関数。
・NULL を別の値に置き換える用途でよく使います。
基本構文
COALESCE(expr1, expr2, expr3, …, exprN)
・左から順番にチェックして、最初に NULL でない値を返す。
・すべて NULL なら NULL を返す。
使用例
例1: 単純な置き換え
SELECT COALESCE(phone, ‘未登録’) AS phone_number
FROM customer;
👉 phone が NULL の場合、 ‘未登録’ を返す。
例2: 複数列の候補から最初の有効値を返す
SELECT COALESCE(home_email, work_email, ‘メールなし’) AS contact_email
FROM users;
👉 home_email があればそれを返す、なければ work_email、それもなければ ‘メールなし’。
例3: 集計と組み合わせ
権限管理(試験で頻出)
・GRANT ;権限を与える
GRANT SELECT ON student TO userA;
・REVOKE:権限を取除く
REVOKE SELECT ON student FROM userA;

