SQL FROM句:テーブルの結合の考え方
「社員マスタ」と「部署マスタ」というテーブルがあります。社員はそれぞれ1つの部署に所属しています。
社員コード | 社員名 | 部署コード |
---|---|---|
1 | テスト社員1 | 1 |
2 | テスト社員2 | 2 |
3 | テスト社員3 | 1 |
部署コード | 部署名 |
---|---|
1 | 開発部 |
2 | 営業部 |
社員と所属部署の一覧を表示したい。
SQL
は下記のようになります。
SELECT T1.社員名, T2.部署名
FROM 社員マスタ AS T1
JOIN 部署マスタ AS T2
ON T1.部署コード = T2.部署コード
社員名は社員マスタ、部署名は部署マスタから取得するため、FROM
句で複数のテーブルを指定する必要があります。
部署コードのように、複数のテーブルで同名のカラム名がある場合は、社員マスタ.部署コード
のように、どのテーブルのカラムなのか明示する必要があります。
社員マスタ AS T1
のように、FROM
句でテーブルを指定する際に、別名を定義することができ、T1.社員マスタ
というようなテーブル名での指定が可能になります。
複数のテーブルを指定するには、JOIN
句を使用し、テーブル同士を結合します。
ON T1.部署コード = T2.部署コード
の部分で、結合条件を指定しています。
結合条件
下記のように結合条件を1=1
(常に条件を満たす=条件を指定しない)にして実行した場合を見てみます。
SELECT T1.社員名, T2.部署名
FROM 社員マスタ AS T1
JOIN 部署マスタ AS T2
ON 1=1
社員名 | 部署名 |
---|---|
テスト社員1 | 開発部 |
テスト社員1 | 営業部 |
テスト社員2 | 開発部 |
テスト社員2 | 営業部 |
テスト社員3 | 開発部 |
テスト社員3 | 営業部 |
1社員につき2レコード表示されてしまいます。
結合条件を指定しないと、指定したテーブル同士で考えられるすべての組み合わせ(直積)を出力してしまいます。
社員マスタが3件(3通り)と部署マスタが2件(2通り)で、3通り×2通り=6通り(件)出力されることになります。
わかりやすくするために、社員マスタの部署コードと、部署マスタの部署コードを表示させます。
SELECT T1.社員名
,T2.部署名
,T1.部署コード AS 社員_部署コード
,T2.部署コード AS 部署_部署コード
FROM 社員マスタ AS T1
JOIN 部署マスタ AS T2
ON 1=1
社員名 | 部署名 | 社員_部署コード | 部署_部署コード |
---|---|---|---|
テスト社員1 | 開発部 | 1 | 1 |
テスト社員1 | 営業部 | 1 | 2 |
テスト社員2 | 開発部 | 2 | 1 |
テスト社員2 | 営業部 | 2 | 2 |
テスト社員3 | 開発部 | 1 | 1 |
テスト社員3 | 営業部 | 1 | 2 |
赤背景の行は、社員マスタの部署コードとは違う部署の部署名を出力しているので、本来は出力してはいけないデータです。
社員マスタの部署コードに紐づく部署名を出力したいので、結合条件で社員マスタ.部署コード=部署マスタ.部署コード
と指定します。