コース一覧
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分

なぜ結合が必要か

注文一覧を出してほしいと頼まれて orders を読むと、顧客の欄には customer_id の 3 や 7 という数字しか並びません。

SQL クエリ

-- これだと誰の注文なのか分からない
SELECT id, customer_id, amount FROM orders;

このまま渡しても「3 番って誰ですか」と聞き返されて終わりです。

名前は、別のテーブルに 1 つだけ置いてある

では最初から orders に顧客名を書いておけばよいかというと、それをやると改名のたびに全注文行を書き換える羽目になります。書き換え漏れがあれば、同じ顧客なのに行によって名前が違う、という壊れ方をします。

だから orders は customer_id だけを持ち、名前は customers に 1 つだけ置きます。そのぶん、読むときには 2 つのテーブルを突き合わせる手間が必要になります。この突き合わせが結合 (JOIN) です。

ON で「どの列どうしを合わせるか」を伝える

SQL クエリ

-- 本と出版社を publisher_id で突き合わせる
SELECT b.title, p.name
FROM books b
JOIN publishers p
  ON b.publisher_id = p.id;

FROM のテーブルに JOIN でもう 1 つ足し、ON に「どの列とどの列が同じなら同じものとみなすか」を書きます。b や p のような短い別名を付けておくと、どちらのテーブルの列なのかが一目で分かります。

ON を書き忘れると、データベースは全部の組み合わせを作ります。100 行と 1000 行なら 10 万行です。本番の数百万行どうしでやると、サーバが止まることもあります。

customers · 3 行 id · PK name · 1 回だけ 1 田中 2 鈴木 3 佐藤 1 customer → N orders ON o.customer_id = c.id orders · 4 行 id customer_id amount 101 1 3000 102 2 1500 103 1 2000 104 3 5000 JOIN JOIN 後 · 4 行 · id 昇順 order_id customer_name amount 101 田中 3000 102 鈴木 1500 103 田中 2000 104 佐藤 5000 田中は 1 回保存 · JOIN 結果で注文 101 / 103 に表示 条件なしは 3 × 4 = 12 組 · ON で 4 組に一致

残る行の決まり方が何通りかある

結合には種類があり、違いは「どの行が結果に残るか」だけです。

書き方結果に残る行
INNER JOIN両方に相手が見つかった行だけ
LEFT OUTER JOIN左は全部残し、右に相手がなければ NULL
RIGHT OUTER JOIN右を全部残す
CROSS JOIN全部の組み合わせ

同じテーブルに 2 つの別名を付けて、自分自身と突き合わせる書き方もあります。この章では、それぞれがどう違うかを 1 つずつ確かめていきます。

解説

結合に使う列の型は両側で揃えてください。片方が VARCHAR で片方が INT だと、暗黙の型変換でインデックスが効かなくなり、行数が増えたとたんに極端に遅くなります。

テーブル構造

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

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

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

INSERT INTO orders VALUES
  (101, 1, 3000),
  (102, 2, 1500),
  (103, 1, 2000),
  (104, 3, 5000);

期待される出力

order_idcustomer_nameamount
101田中3000
102鈴木1500
103田中2000
104佐藤5000

ヒント

JOIN customers c ON o.customer_id = c.id の形を使う

SELECT 句で c.name を取り出すと顧客名が出る

AS で別名をつけると結果列名がきれいになる

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

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

  • テーブルDB の表 (Excel のシートみたいなもの)
  • データベースデータを構造化して保存する仕組み
  • HTTPWeb の通信プロトコル、HTTPS は TLS で暗号化したもの
  • URLページの住所全体
  • JOIN複数テーブルをくっつけて 1 つの結果に並べる SQL
  • 型変換あるデータ型を別の型に変換すること。
  • インデックスDB 検索を速くする索引
query.sql
学習モード
エディタを読み込んでいます
コードの実行結果
データベースを初期化中...