SQLのテーブル結合(JOIN, UNION, NATURAL)を覚えよう!基本構文と使用例を解説

 2024.05.10  株式会社システムインテグレータ

今回は初心者訓練所#07として、SQLで避けては通れない「テーブル結合」について説明していきます。「テーブル結合」を理解すれば、SQLの利用範囲が大幅にアップし、初心者の称号も返上間近です。また、結合方法は1つではなく複数ありますので、それぞれの結合方法についての基本を紹介していきます。
テーブル結合に関する基本をまとめた無料資料もご用意していますので、ぜひこちらもご覧ください。

テーブル結合の種類(JOIN, UNION, NATURAL) 

欲しい情報が複数のテーブルにある場合、それぞれのテーブルの情報をSELECT文で取得してから組み合わせるのは大変手間がかかってしまいます。テーブル結合は、1つのSELECT文で複数のテーブルを結合して情報を取得出来るので、大変便利な方法です。今回は、下表の5種類のテーブル結合を紹介していきます。

種類 処理内容
内部結合(INNER JOIN) 指定したそれぞれのテーブルの項目の値が一致するデータを取得します。
外部結合(OUTER JOIN) 指定したそれぞれのテーブルの項目の値が一致するデータだけではなく、どちらかのテーブルに存在するデータも取得します。
交差結合(CROSS JOIN) 2つのテーブルの組合せを全て取得します。
自然結合(NATURAL) 項目名を指定しなくても、2つのテーブルの同じ名前の項目を結合してデータを取得します。
統合結合(UNION/UNION ALL) 2つ以上のSELECTの結果を統合して取得します。
 

内部結合(INNER JOIN)の基本構文

内部結合は、指定したそれぞれのテーブルの項目が一致するデータを取得します。
基本的な構文は下記となります。

SELECT 項目X,・・・FROM テーブルY
 INNER JOIN テーブルZ
 ON テーブルY.項目A = テーブルZ.項目A;

 

内部結合(INNER JOIN)の使用例

お馴染みの社員テーブル(tbl_employees)と、新たに部署テーブル(tbl_dept)を使用して説明していきます。それぞれのcreate文とinsert文は以下となります。

【社員テーブルのcreate文とinsert文】

create table tbl_employees (emp_code integer , emp_name text , kana text , gender text , age integer , dept_code integer);
insert into tbl_employees (emp_code,emp_name,kana,gender,age,dept_code) values
('1','HoriiTaro','ホリイタロウ','M','40','1')
, ('2','IshimuraHana','イシムラハナ','F','33','2')
, ('3','KitajimaRuna','キタジマルナ','F','45','3')
, ('4','MuroiYuri', 'ムロイユリ','F', '27','1')
, ('5','KitazawaAika','キタザワアイカ','F','33','1')
, ('6','MitaniKoukiti','ミタニコウキチ','M','23','2');

sql07-01

出力フォーマットを調整して、select文で登録内容を確認してみましょう。

.headers on (ヘッダ情報を出力)
.mode column (カラム毎に左揃え出力)

select * from tbl_employees;

sql07-02

insert文で作成した6件のデータを確認できます。

【部署テーブルのcreate文とinsert文】

create table tbl_dept (dept_code integer , dept_name text);
insert into tbl_dept (dept_code,dept_name)
values ('1','技術部'), ('2','人事部'), ('3','総務部'), ('4','経理部');

 

sql07-03

select文で登録内容を確認してみましょう。

select * from tbl_dept;

sql07-04

insert文で作成した4件のデータを確認できます。

それでは、内部結合を使用して社員が所属している部署名の一覧を表示してみましょう。

select T1.emp_code,T1.emp_name,T2.dept_name
from tbl_employees as T1
  INNER JOIN tbl_dept as T2
  ON T1.dept_code = T2.dept_code;

取得元のテーブルを分かり易くするためas句を使用してtbl_employeesを「T1」、tbl_deptを「T2」と別名を付けています。

sql07-05

tbl_employeesにtbl_deptを内部結合しています。結合の条件は両方のテーブルにあるdept_codeとなっています。dept_nameがtbl_employeesのdept_codeと同じtbl_deptのdept_codeのdept_nameになっていることが確認できます。

外部結合(OUTER JOIN)の基本構文

外部結合は、指定したそれぞれのテーブルの項目の値が一致するデータだけではなく、どちらかのテーブルに存在するデータも取得します。また、外部結合は以下のように3種類あります。今回はよく利用される、「左外部結合」で説明していきます。
  ①    左外部結合(LEFT OUTER JOIN)
    左側のテーブルにしかないデータも取得する方法
  ②    右外部結合(RIGHT OUTER JOIN)
    右側のテーブルにしかないデータも取得する方法
  ③    完全外部結合(FULL OUTER JOIN)
    左側のテーブルにしかないデータも右側のテーブルにしかないデータもすべて取得する方法

基本的な構文は下記となります。

SELECT 項目X,・・・FROM テーブルY
 LEFT OUTER JOIN テーブルZ
 ON テーブルY.項目A = テーブルZ.項目A;

外部結合(OUTER JOIN)の使用例

次は、外部結合を確認してみましょう。左外部結合を確認するためにtbl_employeesの情報を更新します。update文でtbl_employeesの「emp_code = 4」のデータのdept_codeにtbl_deptに存在しない値「5」を設定して、select文で更新内容を確認してみましょう。

update tbl_employees set dept_code = 5 where emp_code = 4;

select  *  from tbl_employees;
 
sql07-06

確認できましたので、内部結合と同様に今度は左外部結合で部署名の一覧を表示してみましょう。

select T1.emp_code,T1.emp_name,T2.dept_name
from tbl_employees as T1
  LEFT OUTER JOIN tbl_dept as T2
  ON T1.dept_code = T2.dept_code;

sql07-07

表示された結果で、「emp_code = 4」のdept_nameがNULLとなっていることが確認できます。このように結合したテーブルに該当データが存在しない場合は、NULLが返されます。
同じデータで、内部結合した場合も確認してみましょう。

select T1.emp_code,T1.emp_name,T2.dept_name
from tbl_employees as T1
  INNER JOIN tbl_dept as T2
  ON T1.dept_code = T2.dept_code;

sql07-08

外部結合で表示されていた「emp_code = 4」のデータが、内部結合では結合したテーブルに該当するデータが存在しないので、表示されないことが確認できます。

交差結合(CROSS JOIN)の基本構文

交差結合は、2つのテーブルの組合せを全て取得します。
基本的な構文は下記となります。

SELECT 項目X,・・・FROM テーブルY
 CROSS JOIN テーブルZ;

交差結合(CROSS JOIN)の使用例

確認のために、新たにサイズテーブル(tbl_size)と色テーブル(tbl_color)の2つのテーブルを作成します。そして、それぞれにデータを挿入して内容を確認してみましょう。

【サイズテーブルのcreate文とinsert文】

create table tbl_size (id integer , size text);
insert into tbl_size (id , size) values ('1','S'), ('2','M'), ('3','L');
select  *  from tbl_size;

sql07-09

insert文で作成した3件のデータを確認できます。

【色テーブルのcreate文とinsert文】

create table tbl_color (id integer , color text);
insert into tbl_color (id , color) values ('1','赤'), ('2','青'), ('3','白'), ('4','黒');
select * from tbl_color;

sql07-10

insert文で作成した4件のデータを確認できます。

それでは、サイズテーブルと色テーブルの2つのテーブルを交差結合してみましょう。

select T1.id , size , T2.id , color
from tbl_size as T1
  CROSS JOIN tbl_color as T2;

sql07-11

サイズテーブル(3件)×色テーブル(4件)=12件のデータが表示されているのが確認できます。使用例では全組合せが12件でしたが、大量データのテーブルを交差結合する場合は時間が掛かる可能性がありますので注意してください。

自然結合(NATURAL)の基本構文

自然結合は、内部結合や外部結合を行うときに項目名を指定しなくても、2つのテーブルの同じ名前の項目を結合してデータを取得します。
基本的な構文は下記となります。

内部結合の場合:
SELECT 項目X,・・・FROM テーブルY
 NATURAL INNER JOIN テーブルZ;

外部結合の場合:
SELECT 項目X,・・・FROM テーブルY
 NATURAL LEFT OUTER JOIN テーブルZ;

自然結合(NATURAL)の使用例

続きまして、自然結合の使用例を、先程と同様にtbl_employeesとtbl_deptの内部結合で確認してみましょう。

select T1.emp_code,T1.emp_name,T2.dept_name
from tbl_employees as T1
  NATURAL INNER JOIN tbl_dept as T2;

sql07-12

結果は、2つのテーブルの項目名(dept_code)を指定していませんが、先程の外部結合で確認した内部結合のバターンと同じ内容になります。

統合結合(UNION/UNION ALL)の基本構文

統合結合は、2つ以上のSELECTの結果を統合して取得します。取得結果を統合して表示するので、ここでは「統合結合」と呼んでいきます。通常は「ユニオン」「ユニオンオール」と呼ばれています。「UNION」は、統合した結果で重複したデータをまとめて表示し、「UNION ALL」は、重複したデータもそのまま全て表示します。
基本的な構文は下記となります。

SELECT句
UNIONUNION ALL
SELECT句

統合結合(UNION/UNION ALL)の使用例

最後の説明に入る前に、社員テーブルと同じ構造の社員バックアップ(bkup_employees)を作成して確認の準備をしたいと思います。

【社員バックアップのcreate文とinsert文】

create table bkup_employees (emp_code integer , emp_name text , kana text , gender text , age integer , dept_code integer);

insert into bkup_employees (emp_code,emp_name,kana,gender,age,dept_code) values
('1','HoriiTaro','ホリイタロウ','M','40','1')
, ('2','IshimuraHana','イシムラハナ','F','33','2')
, ('3','KitajimaRuna','キタジマルナ','F','45','3')
, ('4','MuroiYuri', 'ムロイユリ','F', '27','1');

sql07-13

select文で登録内容を確認してみましょう。

select * from bkup_employees;

sql07-14

insert文で作成した4件のデータを確認できます。

次に社員テーブルから、emp_codeが「3」と「4」のデータを2件削除します。

delete from tbl_employees where emp_code in ( 3 , 4 );

select文で削除した結果を確認してみましょう。

select * from tbl_employees;

sql07-15

2件のデータが削除されていることが、確認できます。

それでは、統合結合の使用例を確認してみましょう。
初めに、社員テーブルと社員バックアップを「UNION」して確認してみましょう。「UNION」はselect文で抽出したデータの内容が重複している場合はまとめて表示します。

select emp_code from tbl_employees
UNION
select emp_code from bkup_employees;

sql07-16

社員テーブルと社員バックアップで重複している、「emp_code = 1 ,2」 のデータがそれぞれ1件表示されています。

続いて、同じサンプルデータを利用して「UNION ALL」を確認してみましょう。「UNION ALL」は重複データがまとめられることはなく、抽出した全てのデータを表示します。

select emp_code from tbl_employees
UNION ALL
select emp_code from bkup_employees;

sql07-17

2つのselect文で抽出された全てのデータが表示されています。「UNION」でまとめられていた、「emp_code = 1 ,2」のデータもそれぞれ2件表示されています。

統合結合の注意点として、select句で指定する項目は、結果の数や型が同じである必要があります。上記の例では、emp_codeの1項目のみでしたが、複数の項目を扱う場合は注意してください。

テーブル結合の紹介は以上となります。

おすすめの学習コンテンツ

本記事を読み終わって、さらに学びたい方、次は問題にチャレンジしてみたい方には、以下の無料コンテンツをご用意しておりますので、ぜひ活用してみてください!

SQLiteについて
・本記事で使用したデータベース「SQLite」について解説する資料です。
 SQLiteとは?他のデータベースとの違いも解説

SQLの教科書
・一般的な解説から、実際にSQLを動かす操作イメージまで幅広く解説する資料です。
 「SQLの教科書」ビックデータ時代の必須科目

SQL無料トライアルテスト
・TOPSIC-SQLの無料トライアルテストをご受験していただけます。
 TOPSIC-SQL無料トライアルテスト

SQLコンテスト
・簡単な会員登録をするだけでSQLのオンラインコンテストに無料で参加できます。
    過去に開催されたコンテストの問題にもチャレンジできます。
 TTOPSIC SQL CONTEST

SQL基礎解説YouTube
・「TOPSIC-SQL」を元にしたオンラインウェビナーです。
 SQL-BOOT CAMP #1 
 ビッグデータ時代の必須科目SQLを学ぶ「実戦で通用する武器を身につけよう!」

まとめ

本記事では、初心者訓練所の第7弾として、SQLを学ぶ上で避けては通れないテーブル結合について説明してきました。テーブル結合を習得すれば、作業効率アップ間違いなしです!今回は基本的な説明となりましたが、次回は内部結合について深掘りしたいと考えています。是非、皆さんもご自身で色々試してテーブル結合を習得してください。それでは、次の初心者訓練所でまたお会いしましょう!

(株)システムインテグレータ 製品企画室 元鬼軍曹 久保 司


RELATED POST関連記事


RECENT POST「SQL‐BOOTCAMP」の最新記事


SQL‐BOOTCAMP

SQLのEXISTS句とサブクエリで存在チェック!

SQL‐BOOTCAMP

SQLの便利な関数(NULLIF、IIF)を使ってみよう!

SQL‐BOOTCAMP

SQLのNULLを扱う関数(IFNULL、COALESCE)を使ってみよう!

SQL‐BOOTCAMP

SQLの日付・時間関数(DATE、TIME、DATETIME、JULIANDAY、STRFTIME)を使ってみよう!

SQLのテーブル結合(JOIN, UNION, NATURAL)を覚えよう!基本構文と使用例を解説

TOPSIC TOPへ