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

SQLの複数テーブル使用についてまとめてます。

サンプルには、MySQLのサンプルデータベースEmployeesを使用しています。

JOINでSQLの複数テーブル使用が可能

まず、単純に複数テーブルからselectすると、こうなります。

mysql> SELECT employees.emp_no, first_name, last_name, dept_name 
FROM employees ,dept_emp,departments limit 10;

+--------+------------+-----------+--------------------+
| emp_no | first_name | last_name | dept_name          |
+--------+------------+-----------+--------------------+
|  10211 | Vishu      | Strehl    | Research           |
|  10211 | Vishu      | Strehl    | Sales              |
|  10210 | Yuping     | Alpin     | Customer Service   |
|  10210 | Yuping     | Alpin     | Development        |
|  10210 | Yuping     | Alpin     | Finance            |
|  10210 | Yuping     | Alpin     | Human Resources    |
|  10210 | Yuping     | Alpin     | Marketing          |
|  10210 | Yuping     | Alpin     | Production         |
|  10210 | Yuping     | Alpin     | Quality Management |
|  10210 | Yuping     | Alpin     | Research           |
+--------+------------+-----------+--------------------+

employees、dept_emp、departmentsテーブルから総当りでデータを取って来たような形になりました。これは意図した動きではありませんね。

内部結合(inner join)

テーブル間の紐付け条件を指定すると、employees(社員)テーブルに対応したdept_name(部署名)を取得するようになりました。

これをinner joinと言います。条件に指定したカラムの値が一致するデータのみを結合します。

内部結合では、相手テーブルに対応するデータがない場合、データ抽出を行いません。

mysql> SELECT employees.emp_no, first_name, last_name, dept_name
FROM employees ,dept_emp,departments
where employees.emp_no = dept_emp.emp_no
 and departments.dept_no = dept_emp.dept_no
 limit 10;

+--------+-------------+-------------+------------------+
| emp_no | first_name  | last_name   | dept_name        |
+--------+-------------+-------------+------------------+
|  10011 | Mary        | Sluis       | Customer Service |
|  10038 | Huan        | Lortz       | Customer Service |
|  10049 | Basil       | Tramer      | Customer Service |
|  10060 | Breannda    | Billingsley | Customer Service |
|  10088 | Jungsoon    | Syrzycki    | Customer Service |
|  10098 | Sreekrishna | Servieres   | Customer Service |
|  10112 | Yuichiro    | Swick       | Customer Service |
|  10115 | Chikara     | Rissland    | Customer Service |
|  10126 | Kayoko      | Valtorta    | Customer Service |
|  10128 | Babette     | Lamba       | Customer Service |

外部結合(outer join)

場合によっては、相手テーブルに対応するデータがなくても、NULL表示で良いからデータ取得したいケースがあります。

その場合は、外部結合(outer join)を使いましょう。

left joinは、left outer joinの略です。

以下の場合は、employeesテーブルに対応するdept_empやdepartmentsのデータがなくても、データを取得します。

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 limit 10;

+--------+------------+-----------+--------------------+
| emp_no | first_name | last_name | dept_name          |
+--------+------------+-----------+--------------------+
|  10001 | xGeorgi    | Facello   | Development        |
|  10002 | Bezalel    | Simmel    | Sales              |
|  10003 | Parto      | Bamford   | Production         |
|  10004 | Chirstian  | Koblick   | Production         |
|  10005 | Kyoichi    | Maliniak  | Human Resources    |
|  10006 | Anneke     | Preusig   | Development        |
|  10007 | Tzvetan    | Zielinski | Research           |
|  10008 | Saniya     | Kalloufi  | Development        |
|  10009 | Sumant     | Peac      | Quality Management |
|  10010 | Duangkaew  | Piveteau  | Production         |
+--------+------------+-----------+--------------------+

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

なぜ外部結合でleft joinを使うのかは、ベン図をイメージすると理解しやすいと思います。以下の記事を参考にしてください。

【関連記事】
SQL Joinサンプル集 Joinで遅いSQLの原因を調べる方法

まとめ

ポテパンダの一言メモ
  • 複数テーブルを取り扱うには、joinを使う
  • 内部結合(inner join)は、where節に結合条件を記述
  • 外部結合(outer join)は、where節にleft joinで結合条件を記述

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

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

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

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

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

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

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

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

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

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

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