SQL JOINを使いこなす: WHERE句とON句の使い分け
SQL JOIN: WHERE句とON句の違い
SQL JOINは、複数のテーブルからデータを結合する強力な機能です。結合条件を指定する方法は2つあり、WHERE句とON句があります。一見似ているように見えますが、それぞれ異なる役割を果たします。
WHERE句は、結合されたテーブル全体に適用されるフィルター条件です。結合結果から特定の行を抽出するために使用されます。
例:
SELECT *
FROM employees
JOIN departments
ON employees.department_id = departments.id
WHERE employees.salary > 100000;
この例では、従業員の給与が10万円以上の従業員のみが抽出されます。
ON句は、結合するテーブル間の行をどのように一致させるかを指定します。結合条件を指定するために使用されます。
SELECT *
FROM employees
JOIN departments
ON employees.department_id = departments.id;
この例では、従業員の部門IDと部門のIDが一致する行のみが結合されます。
WHERE句とON句の違い
項目 | WHERE句 | ON句 |
---|---|---|
役割 | 結合結果のフィルタリング | 結合条件の指定 |
適用範囲 | 結合されたテーブル全体 | 結合するテーブル間 |
処理順序 | ON句の後 | ON句の前 |
例
-- WHERE句で結合結果をフィルタリング
SELECT *
FROM employees
JOIN departments
ON employees.department_id = departments.id
WHERE departments.name = 'Sales';
-- ON句で結合条件を指定
SELECT *
FROM employees
JOIN departments
ON employees.department_id = departments.id AND departments.name = 'Sales';
上記の2つの例は同じ結果を返しますが、WHERE句とON句の使い方が異なります。
WHERE句とON句は、SQL JOINで重要な役割を果たします。それぞれの役割を理解し、適切に使い分けることが重要です。
-- employeesテーブルとdepartmentsテーブルを結合する
-- 全ての列を選択
SELECT *
-- employeesテーブルとdepartmentsテーブルを結合
FROM employees
JOIN departments
-- 結合条件: employees.department_id = departments.id
ON employees.department_id = departments.id;
-- WHERE句で抽出条件を追加
-- WHERE employees.salary > 100000;
このコードは、employeesテーブルとdepartmentsテーブルを結合し、全ての列を選択します。結合条件は、employeesテーブルのdepartment_id列とdepartmentsテーブルのid列が一致することです。
WHERE句
コメントアウトされているWHERE句を追加すると、給与が10万円以上の従業員のみが抽出されます。
実行結果
| employee_id | department_id | name | salary | department_name |
|---|---|---|---|---|
| 1 | 1 | John Doe | 120000 | Sales |
| 2 | 2 | Jane Doe | 110000 | Marketing |
| 3 | 1 | Peter Smith | 100000 | Sales |
補足
- このサンプルコードは、MySQLで動作確認しています。
- WHERE句とON句のどちらを使用しても、同じ結果を取得できます。
- WHERE句とON句を両方使用することも可能です。
- 結合条件は、複数の列を比較することもできます。
SQL JOIN: WHERE句とON句以外の方法
USING句は、結合するテーブル間で共通する列を指定するために使用されます。
SELECT *
FROM employees
JOIN departments
USING (department_id);
この例では、employeesテーブルとdepartmentsテーブルのdepartment_id列が共通なので、USING句を使用して結合しています。
NATURAL JOINは、結合するテーブル間で共通する列に基づいて自動的に結合を行う方法です。
SELECT *
FROM employees
NATURAL JOIN departments;
CROSS JOINは、結合するテーブルのすべての行を結合する方法です。
SELECT *
FROM employees
CROSS JOIN departments;
この例では、employeesテーブルとdepartmentsテーブルのすべての行が結合されます。
LATERAL JOINは、サブクエリを実行した結果に基づいて結合を行う方法です。
SELECT *
FROM employees
JOIN LATERAL (
SELECT *
FROM departments
WHERE department_id = employees.department_id
) AS departments
ON TRUE;
外部結合は、結合するテーブルの一方のテーブルのすべての行を結合結果に含める方法です。
-- LEFT JOIN: employeesテーブルのすべての行を結合結果に含める
SELECT *
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.id;
-- RIGHT JOIN: departmentsテーブルのすべての行を結合結果に含める
SELECT *
FROM employees
RIGHT JOIN departments
ON employees.department_id = departments.id;
-- FULL JOIN: employeesテーブルとdepartmentsテーブルのすべての行を結合結果に含める
SELECT *
FROM employees
FULL JOIN departments
ON employees.department_id = departments.id;
WHERE句とON句は、SQL JOINで結合条件を指定する最も一般的な方法です。しかし、USING句、NATURAL JOIN、CROSS JOIN、LATERAL JOIN、外部結合など、他にもさまざまな方法があります。
それぞれの特徴を理解し、状況に応じて適切な方法を選択することが重要です。
sql join where-clause