SQLの結合についてまとめています。
SQLの結合とは
2つのテーブルを関連付ける共通の値が入ったカラム(外部キー)で突き合わせ、1つに合成することを結合と言います。
例えば、以下の2つのテーブルemployees(社員)テーブルと、salaries(年収)テーブルは、emp_no(社員番号)というカラムで結合が可能です。salariesテーブルは年収(salary)と有効期限の開始日(from_date)と終了日(to_date)が保管されるテーブル。そのため、emp_noに加えてfrom_dateもしくはto_dateを指定することでユニークなレコードを指定可能。
mysql> select * from employees limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 | | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 | | 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | | 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 | | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | | 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 | | 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 | | 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 | +--------+------------+------------+-----------+--------+------------+ 10 rows in set (0.03 sec) mysql> select * from salaries limit 10; +--------+--------+------------+------------+ | emp_no | salary | from_date | to_date | +--------+--------+------------+------------+ | 10001 | 60117 | 1986-06-26 | 1987-06-26 | | 10001 | 62102 | 1987-06-26 | 1988-06-25 | | 10001 | 66074 | 1988-06-25 | 1989-06-25 | | 10001 | 66596 | 1989-06-25 | 1990-06-25 | | 10001 | 66961 | 1990-06-25 | 1991-06-25 | | 10001 | 71046 | 1991-06-25 | 1992-06-24 | | 10001 | 74333 | 1992-06-24 | 1993-06-24 | | 10001 | 75286 | 1993-06-24 | 1994-06-24 | | 10001 | 75994 | 1994-06-24 | 1995-06-24 | | 10001 | 76884 | 1995-06-24 | 1996-06-23 | +--------+--------+------------+------------+ 10 rows in set (0.08 sec)
【関連記事】
▶SQLの基本とも言えるテーブル結合、その種類と使い方について解説
テーブルの結合を行なうには、join句を使います。employeesテーブルとsalariesテーブルをemp_noで結合してみましょう。
SELECT * FROM employees LEFT JOIN salaries ON salaries.emp_no = employees.emp_no WHERE salaries.to_date = '9999-01-01' LIMIT 10; +--------+------------+------------+-----------+--------+------------+--------+--------+------------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | emp_no | salary | from_date | to_date | +--------+------------+------------+-----------+--------+------------+--------+--------+------------+------------+ | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 | 10001 | 88958 | 2002-06-22 | 9999-01-01 | | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | 10002 | 72527 | 2001-08-02 | 9999-01-01 | | 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 | 10003 | 43311 | 2001-12-01 | 9999-01-01 | | 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | 10004 | 74057 | 2001-11-27 | 9999-01-01 | | 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 | 10005 | 94692 | 2001-09-09 | 9999-01-01 | | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | 10006 | 59755 | 2001-08-02 | 9999-01-01 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | 10007 | 88070 | 2002-02-07 | 9999-01-01 | | 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 | 10009 | 94409 | 2002-02-14 | 9999-01-01 | | 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 | 10010 | 80324 | 2001-11-23 | 9999-01-01 | | 10012 | 1960-10-04 | Patricio | Bridgland | M | 1992-12-18 | 10012 | 54423 | 2001-12-16 | 9999-01-01 | +--------+------------+------------+-----------+--------+------------+--------+--------+------------+------------+ 10 rows in set (0.00 sec)
2つのテーブルの全カラムが合成された結果が抽出できました。なお、where句のsalaries.to_date=’9999-01-01’という条件は最新の年収を取得するためのものです。
SQLの結合の種類
SQLの結合には、内部結合(inner join)、外部結合(outer join)、交差結合(cross join)の3つがあります。
【関連記事】
▶SQLで利用される結合の種類を知ろう!内部結合・外部結合・クロス結合の違いとは?
内部結合は、2テーブル双方に同一のキーカラムが存在するデータのみを抽出します。外部結合は、2テーブルのうち軸となるテーブルにキーカラムが存在するデータをすべて抽出します。クロス結合は、2テーブルの全組み合わせを抽出します。
外部結合には、軸となるテーブルを左辺にするか、右辺にするかで、left joinとright joinの2つがあります。right joinはleft joinで置き換えが可能です。
実際の開発では、クロス結合はほとんど使いませんし、right joinはleft joinに置き換えて記述することが多いです。実質、内部結合とleft joinによる外部結合の2つを覚えておけば、ほとんどのケースに対応可能です。
まとめ
- SQLの結合は2テーブルを共通の値が入ったカラムで突き合わせ、1つに合成する
- SQLの結合にはjoin句を使う
- SQLの結合には、内部結合、外部結合、クロス結合の3種類がある