DB〜重要SQL【データベーススペシャリスト試験】

DB

集合操作(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;

タイトルとURLをコピーしました