Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

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 * のカラム展開に違いが出る

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。