SQLのON句についてまとめています。


SQLのONは、JOINの条件を記述
ON句は、joinをおこなう場合の条件を記述する際に使います。
以下のSQLは、employees(社員)テーブルとsalaries(年収)テーブルをemp_no(社員番号)でleft joinする例です。on句にjoin条件employees.emp_no = salaries.emp_no 、を記述しています。
- SELECT
- employees.first_name,
- employees.last_name,
- salaries.salary
- FROM
- employees
- left join salaries on employees.emp_no = salaries.emp_no
- WHERE
- salaries.to_date = "9999-01-01"
- +------------+-------------+--------+
- | first_name | last_name | salary |
- +------------+-------------+--------+
- | Georgi | Facello | 88958 |
- | Bezalel | Simmel | 72527 |
- | Parto | Bamford | 43311 |
- | Chirstian | Koblick | 74057 |
- | Kyoichi | Maliniak | 94692 |
- | Anneke | Preusig | 59755 |
- | Tzvetan | Zielinski | 88070 |
- | Sumant | Peac | 94409 |
- | Duangkaew | Piveteau | 80324 |
- | Patricio | Bridgland | 54423 |
- | Eberhardt | Terkki | 68901 |
- | Berni | Genin | 60598 |
- | Kazuhito | Cappelletti | 77935 |
- | Cristinel | Bouloucos | 99651 |
- | Kazuhide | Peha | 84672 |
- | Lillian | Haddadi | 50032 |
- | Mayuko | Warwick | 47017 |
- | Shahaf | Famili | 41348 |
- | Bojan | Montemayor | 50113 |
- | Suzette | Pettey | 96646 |
- :
- :
インデックスがついていないカラムでjoinをおこなうと、テーブルのサイズが大きいほど速度低下の原因になります。explainで実行計画をチェックしておくのが良いでしょう。
【関連記事】
▶SQL Joinサンプル集 Joinで遅いSQLの原因を調べる方法
on句で複数の条件を指定する場合は、andやorで条件指定を接続します。
- 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
- +--------+------------+-------------+-------------+
- | emp_no | first_name | last_name | dept_name |
- +--------+------------+-------------+-------------+
- | 10001 | Georgi | Facello | Development |
- | 10002 | Bezalel | Simmel | NULL |
- | 10003 | Parto | Bamford | NULL |
- | 10004 | Chirstian | Koblick | NULL |
- | 10005 | Kyoichi | Maliniak | NULL |
- | 10006 | Anneke | Preusig | NULL |
- | 10007 | Tzvetan | Zielinski | NULL |
- | 10008 | Saniya | Kalloufi | NULL |
- | 10009 | Sumant | Peac | NULL |
- | 10010 | Duangkaew | Piveteau | NULL |
- | 10011 | Mary | Sluis | NULL |
- | 10012 | Patricio | Bridgland | NULL |
- | 10013 | Eberhardt | Terkki | NULL |
- | 10014 | Berni | Genin | NULL |
- | 10015 | Guoxiang | Nooteboom | Research |
- | 10016 | Kazuhito | Cappelletti | NULL |
- | 10017 | Cristinel | Bouloucos | NULL |
- | 10018 | Kazuhide | Peha | NULL |
- | 10019 | Lillian | Haddadi | NULL |
- | 10020 | Mayuko | Warwick | NULL |
- :
- :
on句にも複雑な条件が記述できてしまうので、場合によってはバグが発生しやすい要因になることがあります。コーディング規約で、on句にはusingでシンプルな条件指定しかしないようにし、絞り込み条件はwhereでおこなうなどの対策を検討すると良いでしょう。
【関連記事】
▶MySQLのleft joinサンプルコード onとusingの結合条件指定の違いは?
まとめ

- on句にはjoin条件を記述する
- andやorを使って、複雑な条件を指定することが可能
- バグを発生しにくくするため、on句ではusingのみ使い複雑な条件はwhereで記述するなどの工夫が考えられる