3.5 テーブルの結合

employees テーブルには部署ID が含まれていますが, IDでは誰がどの部署に属しているのか一見してわかりにくいです. そこで部署ID を使って部署の名称の一覧がある departments テーブルと紐付ける操作が必要になります. これを結合といいます. まずは, INNER JOIN 句と ON 句を使って結合します. INNER JOIN内部結合と訳されます.

SELECT employees.id,  employees.name,
  departments.name AS department
FROM <DB>.employees
INNER JOIN <DB>.departments
ON employees.department_id = departments.id
;

INNER JOIN 句で結合するもう1つのテーブルを指定し, ON 句で結合の条件を指定しています. これらの構文の説明は一旦後回しにして, それ以外の新しい構文について説明します. SELECT 句で列名を指定するときに employees.id, departments.name といった見慣れない構文があります. これは結合前のテーブルのどれから取得する列なのかを明示的にする構文です. たとえば, 今回は employees テーブルと departments テーブルのどちらにも id という列があるので, 単に SELECT id と書いた場合, どちらのテーブルの id 列であるのか特定できず, エラーになります. そこで, <テーブル名>.<列名> という書き方が用いられます. ASdepartments.namedepartment に変更しているのも衝突を避けるためです. 衝突がない場合はテーブル名を省略することができます. テーブル名が長かったり, 指定したい列が多かったりすると, この構文は読みづらいです. そこで, テーブルの別名 (エイリアス) という機能を使います.

SELECT t1.id,  t1.name,  t2.name AS department
FROM <DB>.employees t1
INNER JOIN <DB>.departments t2
ON t1.department_id = t2.id
;

FROM 句でテーブル名を指定した後に適当な単語を書くと, SELECT 句など列を指定する句でテーブル名として使えます. そして元のテーブル名は使えなくなります. INNER JOIN 句の後にある t2 も同様に, departments テーブルの別名を意味します.