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

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

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

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

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

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

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

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

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

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

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

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

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