SQL FROM句で複数のテーブルを結合するポイント
FROM
句では取得したいテーブルのテーブル名を指定します。
以下のようなテーブルがあるとします。
department
は社員が所属する部署の情報を格納しています。
また、employee
とdepartment
の関係は1対1とします。
id | first_name | last_name | department_id |
---|---|---|---|
1 | 一郎 | 山田 | 1 |
2 | 次郎 | 佐藤 | 2 |
3 | 三郎 | 田中 | 1 |
id | department_name |
---|---|
1 | 営業部 |
2 | 人事部 |
このとき、社員の一覧と所属部署のデータを取得したい場合、FROM
句で以下のように指定します。
SELECT
employee.first_name,
employee.last_name,
department.department_name
FROM
employee
JOIN department
ON employee.department_id = department.id
-- テーブルに別名を指定する場合
SELECT
T1.first_name,
T1.last_name,
T2.department_name
FROM
employee AS T1
JOIN department AS T2
ON T1.department_id = T2.id
first_name | last_name | department_name |
---|---|---|
一郎 | 山田 | 営業部 |
次郎 | 佐藤 | 人事部 |
三郎 | 田中 | 営業部 |
テーブルの結合
複数のテーブルを結合する場合はまず結合したいテーブルをJOIN
のあとに指定します。そしてON
のあとに結合条件を指定します。
結合条件とは
結合条件を指定せずにテーブルを2つ指定すると、指定した2つのテーブルの直積の結果が出力されてしまいます。
上記の例だとemployee
にはデータが3件、department
にはデータが2件あるので3×2
で6通りの組み合わせが考えられます。
なので以下のように6件が出力されます。(わかりやすくするためdepartment_id
も出力しています)
first_name | last_name | department_id(employee) | id(department) | department_name |
---|---|---|---|---|
一郎 | 山田 | 1 | 1 | 営業部 |
一郎 | 山田 | 1 | 2 | 人事部 |
次郎 | 佐藤 | 2 | 1 | 営業部 |
次郎 | 佐藤 | 2 | 2 | 人事部 |
三郎 | 田中 | 1 | 1 | 営業部 |
三郎 | 田中 | 1 | 2 | 人事部 |
このうち、取得したいデータはdepartment_id(employee)
とid(department)
が同じデータになります。
逆にdepartment_id(employee)
とid(department)
が異なるデータはテーブル間の関連性のない意味のないデータになるので取得する必要がありません。
よって、結合条件でemployee.department_id = department.id
と指定します。
結合のポイント
上記の例では結合するテーブル同士が1対1で、なおかつ結合先のデータが必ず存在していることが前提となっています。
そのため、混乱することはないかと思いますが、SQL
が複雑になってくると、結合の理解があいまいだと予期せぬ結果になってしまうことがあります。
最初にメインとなるテーブルを決め、結合するテーブルが何対何になるのかと、結合先のデータが必ず存在しているかどうか(id
で結合する場合はそのid
が結合先のテーブルに必ず存在しているかどうか)を必ず意識して結合していくと混乱せずにスムーズに実装できるかと思います。
例えば上記の例では社員単位(1社員1行)での出力になるはずですが、結合条件を正しく指定していないと、同一社員が2行出力されています。
そのような結果は仕様通りではないので結合条件を見なおす必要があります。