コース一覧
SQL実践:JOIN・サブクエリ・データ更新
複数テーブルの結合

SQL実践:JOIN・サブクエリ・データ更新

JOIN、集合演算、サブクエリ、CTE、DDL・DMLを学び、複数テーブルを組み合わせてデータベースを作成・更新する無料コースです。

1
テーブル結合
01. なぜ結合が必要か5分
02. INNER JOINの基本5分
03. LEFT/RIGHT OUTER JOIN5分
04. 複数テーブルの結合5分
05. 自己結合5分
06. 集合演算 UNION/INTERSECT/EXCEPT5分
07. 結合の実践演習5分
08. テーブル結合クイズ5分
2
サブクエリ活用
01. サブクエリとは5分
02. WHERE句のサブクエリ5分
03. FROM句のサブクエリ5分
04. SELECT句のサブクエリ5分
05. WITH句(CTE)の活用5分
06. サブクエリ実践クイズ5分
3
テーブル作成とデータ操作
01. CREATE DATABASE と CREATE TABLE5分
02. データ型の選び方5分
03. INSERT 文でデータを追加する5分
04. UPDATE 文でデータを更新する5分
05. DELETE 文でデータを削除する5分
06. 物理削除と論理削除5分
07. ALTER TABLE で構造を変更する5分
08. 制約 (NOT NULL / UNIQUE / DEFAULT)5分
09. TRUNCATE と DROP5分
10. DDL / DML 実践クイズ5分

複数テーブルの結合

テーブルを 2 つつなぐところまでは書けても、3 つ目を足したとたんに column reference "id" is ambiguous で止まる。複数結合で最初にぶつかる壁はここです。

JOIN は下へ足していくだけ

SQL クエリ

-- レビューから本をたどり、さらに出版社までたどる
SELECT r.rating, b.title, p.name AS publisher
FROM reviews r
JOIN books b ON r.book_id = b.id
JOIN publishers p ON b.publisher_id = p.id
ORDER BY r.id;

JOIN テーブル ON 条件 を縦に並べるだけで、いくつでもつなげます。読むときは上から順に、主軸からどこへ枝を伸ばしているかを追います。ここでの主軸は reviews で、books を経由して publishers までたどっています。books を飛ばして reviews から publishers へは行けません。突き合わせる列が無いからです。

どのテーブルの id なのか、データベースには分からない

SQL クエリ

-- id がどちらのものか決められずエラーになる
SELECT id, title
FROM reviews r
JOIN books b ON r.book_id = b.id;

3 つのテーブルには、たいてい id という同じ名前の列があります。だから複数結合では、列に必ずテーブルの別名を付けて b.id のように書きます。

別名は 1 文字か 2 文字の小文字が定番です。reviews なら r、order_items のような複合語なら子音を拾って oi。長いテーブル名を毎回そのまま書くと 1 行が伸びて、読むのもレビューするのもつらくなります。

途中に 1 つでも内部結合が混じると、主軸が消える

SQL クエリ

-- 出版社が未設定の本も、レビューが無い本も残る
SELECT b.title, p.name AS publisher, r.rating
FROM books b
LEFT JOIN publishers p ON b.publisher_id = p.id
LEFT JOIN reviews r ON b.id = r.book_id;

左を全部残したいときは、途中の結合をすべて LEFT JOIN にします。1 つでも内部結合が混じると、そこで相手のいない行が落ち、せっかく残していた主軸の行まで消えます。複数結合で件数が合わない原因は、たいていこれです。

もう一つ、行が増える方向にも気を付けてください。1 冊の本にレビューが 5 件あれば、その本は結果に 5 行並びます。そのまま SUM(b.price) のような集計をかけると、本の価格が 5 回足されて水増しされます。件数が想定と違うと感じたら、結合を 1 つずつ外して、どこで増えたのかを確かめます。

解説

結合に使う列にインデックスが張られていないと、テーブルが大きくなった瞬間に返ってこなくなります。遅いと感じたら EXPLAIN を付けて、どの結合で全件走査になっているかを見ます。

テーブル構造

CREATE TABLE customers (
  id INT PRIMARY KEY,
  name VARCHAR(30)
);

CREATE TABLE products (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  price INT
);

CREATE TABLE orders (
  id INT PRIMARY KEY,
  customer_id INT,
  order_date DATE
);

CREATE TABLE order_items (
  id INT PRIMARY KEY,
  order_id INT,
  product_id INT,
  quantity INT
);

INSERT INTO customers VALUES
  (1, '田中'),
  (2, '鈴木'),
  (3, '佐藤');

INSERT INTO products VALUES
  (10, 'マウス', 2500),
  (11, 'キーボード', 8000),
  (12, 'モニター', 35000);

INSERT INTO orders VALUES
  (1001, 1, '2026-05-01'),
  (1002, 2, '2026-05-03'),
  (1003, 1, '2026-05-10');

INSERT INTO order_items VALUES
  (1, 1001, 10, 2),
  (2, 1001, 11, 1),
  (3, 1002, 12, 1),
  (4, 1003, 10, 3);

期待される出力

order_idcustomer_nameproduct_namequantitysubtotal
1001田中キーボード18000
1001田中マウス25000
1002鈴木モニター135000
1003田中マウス37500

ヒント

JOIN を 3 つ縦に並べる。customers, order_items, products の順がわかりやすい

別名は c, o, oi, p の 1-2 文字で統一する

subtotal は p.price * oi.quantity で計算する

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • テーブルDB の表 (Excel のシートみたいなもの)
  • JOIN複数テーブルをくっつけて 1 つの結果に並べる SQL
  • データベースデータを構造化して保存する仕組み
  • レビューコードを読み合い品質を上げる工程
  • ビュークエリに名前をつけて再利用する仮想表
  • インデックスDB 検索を速くする索引
query.sql
学習モード
エディタを読み込んでいます
コードの実行結果
データベースを初期化中...