MySQLのleft joinのサンプルSQLコードをまとめて、使い方を解説しています。
以下、データベースとして、MySQLのサンプルデータベースEmployeesを使っています。SQL実行結果の表示にはphpMyAdminを使用しています。
MySQLのleft joinの構文
left joinは結合の一種で、外部結合とも呼ばれます。
【関連記事】
▶SQL 外部結合サンプルコード 3テーブル結合とパフォーマンス比較
MySQLのleft joinは以下のように記述します。
SELECT emp_no, from_date, to_date, dept_name FROM `dept_manager` left join departments on dept_manager.dept_no = departments.dept_no
上記のSQLは、dept_manager(部署マネージャー)テーブルとdepartments(部署)テーブルをdept_no(部署番号)で外部結合し、emp_no(社員番号)、from_date(有効日付 開始)、to_date(有効日付 終了)、dept_name(部署名)を取得します。
複数のテーブルに対してleft joinをおこなうには、対象テーブルの数だけleft joinを続けて記述します。
SELECT employees.emp_no, first_name, last_name, dept_name FROM employees left join dept_emp on employees.emp_no = dept_emp.emp_no left join departments on dept_emp.dept_no = departments.dept_no
上記SQLは、employees(社員)テーブルとdept_emp(部署・社員紐付け)テーブルをemp_no(社員番号)で外部結合し、さらにdept_emp(部署・社員紐付け)テーブルとdepartments(部署)テーブルを外部結合して、emp_no(社員番号)、first_name(姓名の名)、last_name(姓名の姓)、dept_name(部署名)を取得します。
外部結合の条件は、以下のようにusingを使って記述することも可能です。
SELECT employees.emp_no, first_name, last_name, dept_name FROM employees left join dept_emp on using(emp_no) left join departments on using(dept_no)
なお、join条件に使うカラムが複数ある場合は、using(a,b,c)と、カンマで区切って指定します。
usingを使うと、スッキリとシンプルに書けるため、単純なバグが発生しにくいメリットがあります。その反面、joinに結合条件以外の絞り込み条件を記述できないというデメリットもあります。
開発現場でのコーディング規約には、単純な結合条件の指定はusingを使用、結合前データの絞り込みをおこなうなど、やむを得ない場合にはonを使用など、決めておくの良いでしょう。
なお、MySQLのleft joinは、SQL:2003 標準に準拠して処理されます。
【関連記事】
▶SQLとはどういうもの? 独自拡張と標準SQLの大きな違いって、何?
MySQLのleft joinのサンプルコード集
複数の条件でleft joinするには andで条件を記述
left joinの条件は、andで接続して複数条件を記述できます。
例えば、以下のSQLのように、dept_empの結合条件に「employees.emp_no = dept_emp.emp_no and first_name like ‘G%’」と指定することが可能です。
SELECT employees.emp_no, first_name, last_name, dept_name FROM employees left join dept_emp on employees.emp_no = dept_emp.emp_no and first_name like 'G%' left join departments on dept_emp.dept_no = departments.dept_no
実行結果はこうなります。
結合前の条件にfirst_name like ‘G%’が適用されます。結果として、first_nameがGで始まるデータ以外は、dept_nameがNULLになっています。
joinとwhereの条件指定では、結果が変わる
joinの条件指定と、whereの条件指定では結果が異なります。
以下のSQLは、外部結合した結果に対して、first_nameがGで始まるデータのみに絞り込みをかけることになります。
SELECT employees.emp_no, first_name, last_name, dept_name FROM employees left join dept_emp on employees.emp_no = dept_emp.emp_no left join departments on dept_emp.dept_no = departments.dept_no WHERE first_name like 'G%'
実行結果はこうなります。
結合済みのデータに対して、「first_name like ‘G%’」で絞り込みをおこなう指定になります。
left joinのusingとonの指定の違い
left joinの結合条件を指定する場合usingとonは全く同じです。しかし、select * 指定したときのカラム展開に差があるので注意しましょう。
SELECT * FROM employees left join dept_emp on employees.emp_no = dept_emp.emp_no left join departments on dept_emp.dept_no = departments.dept_no
上記の結合条件をon指定したSQLを実行するとこうなります。
結合している3テーブルの全カラムが、重複関係なく取得されてます。
SELECT * FROM employees left join dept_emp using (emp_no) left join departments using (dept_no)
上記の結合条件をusing指定したSQLを実行するとこうなります。
カラムの重複なく、結合に使われたカラムが先頭になった状態でデータが取得されます。
このため、「select *」指定しているSQLを使うプログラムの場合、結合条件をon指定からusing指定に変えることで動作しなくなってしまいます。
まとめ
- 複数テーブルのleft joinは、left joinを続けて記述
- left joinの条件指定とwhereの条件指定は結果が異なる
- 外部結合条件にはon以外にusingを使える
- usingを使った場合、select * のカラム展開に違いが出る