MySQLのleft joinサンプルコード onとusingの結合条件指定の違いは?
  • facebookページ
  • twitterページ
  • 2019.11.18

    MySQLのleft joinサンプルコード onとusingの結合条件指定の違いは?

    MySQLのleft joinのサンプルSQLコードをまとめて、使い方を解説しています。

    以下、データベースとして、MySQLのサンプルデータベースEmployeesを使っています。SQL実行結果の表示にはphpMyAdminを使用しています。

    MySQLのleft joinの構文

    left joinは結合の一種で、外部結合とも呼ばれます。

    【関連記事】
    SQL 外部結合サンプルコード 3テーブル結合とパフォーマンス比較

    MySQLのleft joinは以下のように記述します。

    上記のSQLは、dept_manager(部署マネージャー)テーブルとdepartments(部署)テーブルをdept_no(部署番号)で外部結合し、emp_no(社員番号)、from_date(有効日付 開始)、to_date(有効日付 終了)、dept_name(部署名)を取得します。

    複数のテーブルに対してleft joinをおこなうには、対象テーブルの数だけleft joinを続けて記述します。

    上記SQLは、employees(社員)テーブルとdept_emp(部署・社員紐付け)テーブルをemp_no(社員番号)で外部結合し、さらにdept_emp(部署・社員紐付け)テーブルとdepartments(部署)テーブルを外部結合して、emp_no(社員番号)、first_name(姓名の名)、last_name(姓名の姓)、dept_name(部署名)を取得します。

    外部結合の条件は、以下のようにusingを使って記述することも可能です。

    なお、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%’」と指定することが可能です。

    実行結果はこうなります。

    結合前の条件にfirst_name like ‘G%’が適用されます。結果として、first_nameがGで始まるデータ以外は、dept_nameがNULLになっています。

    joinとwhereの条件指定では、結果が変わる

    joinの条件指定と、whereの条件指定では結果が異なります。

    以下のSQLは、外部結合した結果に対して、first_nameがGで始まるデータのみに絞り込みをかけることになります。

    実行結果はこうなります。

    結合済みのデータに対して、「first_name like ‘G%’」で絞り込みをおこなう指定になります。

    left joinのusingとonの指定の違い

    left joinの結合条件を指定する場合usingとonは全く同じです。しかし、select * 指定したときのカラム展開に差があるので注意しましょう。

    上記の結合条件をon指定したSQLを実行するとこうなります。

    結合している3テーブルの全カラムが、重複関係なく取得されてます。

    上記の結合条件をusing指定したSQLを実行するとこうなります。

    カラムの重複なく、結合に使われたカラムが先頭になった状態でデータが取得されます。

    このため、「select *」指定しているSQLを使うプログラムの場合、結合条件をon指定からusing指定に変えることで動作しなくなってしまいます。

    まとめ

    ポテパンダの一言メモ
    • 複数テーブルのleft joinは、left joinを続けて記述
    • left joinの条件指定とwhereの条件指定は結果が異なる
    • 外部結合条件にはon以外にusingを使える
    • usingを使った場合、select * のカラム展開に違いが出る


    優良フリーランス案件多数掲載中!
    フリーランスエンジニアの案件をお探しなら
    ポテパンフリーランス

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア
    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE