SQL:テーブル結合

テーブル結合

  • INNER JOIN:内部結合(共通部分のみ)

データがある列のみ結合
外部結合より、高速

$ SELECT <列名>, ...
  FROM <テーブル名1> INNER JOIN <テーブル名2>
    ON <テーブル名1.列名> = <テーブル名2.列名>;

AS構文:
hoge AS a これの意味は、hoge を a と名づける。


例:
$ SELECT *
   FROM hoge AS a INNER JOIN piyo AS b
    ON a.columnA = b.columnB;
  • LEFT OUTER JOIN:外部結合(元のテーブルと結合先の共通部分)

データがない列の値は、「NULL」にして結合

$ SELECT <列名>, ...
  FROM <テーブル名1> LEFT OUTER JOIN <テーブル名2>
    ON <テーブル名1.列名> = <テーブル名2.列名>;

・ LEFT OUTER JOIN テーブル名1 が元のテーブルになる。
・ RIGHT OUTER JOIN テーブル名2 が元のテーブルになる。

例:
$ SELECT *
   FROM hoge AS a 
    LEFT OUTER JOIN piyo AS b
      ON a.columnA = b.columnB;
mysql>  SELECT
    ->   e.emp_no,
    ->   e.first_name,
    ->   e.gender,
    ->   d.dept_no
    -> FROM
    ->   employees AS e INNER JOIN dept_manager AS d
    ->     ON e.emp_no = d.emp_no
    -> ;
+--------+-------------+--------+---------+
| emp_no | first_name  | gender | dept_no |
+--------+-------------+--------+---------+
| 110022 | Margareta   | M      | d001    |
| 110039 | Vishwani    | M      | d001    |
| 110085 | Ebru        | M      | d002    |
| 110114 | Isamu       | F      | d002    |
| 110183 | Shirish     | F      | d003    |
| 110228 | Karsten     | F      | d003    |
| 110303 | Krassimir   | F      | d004    |
| 110344 | Rosine      | F      | d004    |
| 110386 | Shem        | M      | d004    |
| 110420 | Oscar       | M      | d004    |
| 110511 | DeForest    | M      | d005    |
| 110567 | Leon        | F      | d005    |
| 110725 | Peternela   | F      | d006    |
| 110765 | Rutger      | F      | d006    |
| 110800 | Sanjoy      | F      | d006    |
| 110854 | Dung        | M      | d006    |
| 111035 | Przemyslawa | M      | d007    |
| 111133 | Hauke       | M      | d007    |
| 111400 | Arie        | M      | d008    |
| 111534 | Hilary      | F      | d008    |
| 111692 | Tonny       | F      | d009    |
| 111784 | Marjo       | F      | d009    |
| 111877 | Xiaobin     | F      | d009    |
| 111939 | Yuchang     | M      | d009    |
+--------+-------------+--------+---------+
24 rows in set
SELECT
  d.dept_name,
  e.first_name,
  e.last_name,
  dm.from_date,
  dm.to_date
FROM
  departments AS d
  INNER JOIN dept_manager AS dm
    ON d.dept_no = dm.dept_no
  INNER JOIN employees AS e
    ON dm.emp_no = e.emp_no
;

解説:
d テーブル の dept_no と dm テーブル の dept_no の共通部分をもつレコードを抽出。
さらに、
dm の emp_no と e テーブルの emp_no の共通部分をもつレコードを抽出。

その上で、以下の列を表示する
d.dept_name,
e.first_name,
e.last_name,
dm.from_date,
dm.to_date

+--------------------+-------------+--------------+------------+------------+
| dept_name          | first_name  | last_name    | from_date  | to_date    |
+--------------------+-------------+--------------+------------+------------+
| Customer Service   | Tonny       | Butterworth  | 1985-01-01 | 1988-10-17 |
| Customer Service   | Marjo       | Giarratana   | 1988-10-17 | 1992-09-08 |
| Customer Service   | Xiaobin     | Spinelli     | 1992-09-08 | 1996-01-03 |
| Customer Service   | Yuchang     | Weedman      | 1996-01-03 | 9999-01-01 |
| Development        | DeForest    | Hagimont     | 1985-01-01 | 1992-04-25 |
| Development        | Leon        | DasSarma     | 1992-04-25 | 9999-01-01 |