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で記述するなどの工夫が考えられる