連載 [第6回] :
  初心者のための SQL-BOOTCAMP

テーブル結合について (Part.2) -「交差結合」「自然結合」「統合結合」

2023年3月23日(木)
久保 司
第6回となる今回は、前回に引き続き、複数のテーブルを使用するためのテーブル結合、「交差結合」「自然結合」「統合結合」について紹介します。

はじめに

今回は、前回に引き続き「テーブル結合」のPart.2として、3種類のテーブル結合について説明していきます。前回で紹介した「内部結合」と「外部結合」を習得すれば、通常利用するSQL文の相当の範囲をカバーできますが、今回紹介するテーブル結合についても覚えておいて損はありません。内部・外部結合と合わせて、さらにサーチ力アップを目指しましょう。

訓練に使用するデータベースは、これまでに引き続き、いつもの「SQLite」を使用していきます。

それでは、今回も全力投球で訓練に行ってみましょう!

交差/自然/統合(色々なテーブル結合)

前回の解説で、テーブル結合の便利さを理解していただけたと思います。さらに今回は、覚えておくときっと役に立つ、下表に示す後半3種類のテーブル結合を紹介します。

(1)交差結合【CROSS JOIN】

交差結合(CROSS JOIN)は、2つのテーブルの組み合わせを全て取得します。基本的な構文は下記のようになります。

SELECT 項目,… FROM テーブル1
  CROSS JOIN テーブル2;

それでは、交差結合の使用例を確認してみましょう。

ここで、確認のために新たにサイズテーブル(tbl_size)と色テーブル(tbl_color)の2つのテーブルを作成してデータを挿入します。

【サイズテーブルCREATEコマンド】
CREATE TABLE tbl_size (id INTEGER , size TEXT);
【サイズテーブルINSERTコマンド】
INSERT INTO tbl_size (id , size)
VALUES ('1','S'), ('2','M'), ('3','L');
【色テーブルCREATEコマンド】
CREATE TABLE tbl_color (id INTEGER , color TEXT);
【色テーブルINSERTコマンド】
INSERT INTO tbl_color (id , color)
VALUES ('1','赤'), ('2','青'), ('3','白'), ('4','黒');

作成したサイズテーブルの内容を確認してみましょう。

.headers on
.mode column

SELECT *  FROM tbl_size;

*「.headers」「.mode」は表示内容の設定コマンドなので、ログイン後に1回実行すればOKです。

INSERTコマンドで作成した、3件のデータが表示されています。次に、色テーブルの内容を確認してみましょう。

SELECT *  FROM tbl_color;

INSERTコマンドで作成した、4件のデータが表示されています。それでは、サイズテーブルと色テーブルの2つのテーブルを交差結合してみましょう。

SELECT T1.id , size , T2.id , color
FROM tbl_size AS T1
CROSS JOIN tbl_color AS T2;

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

(2)自然結合【NATURAL JOIN】

自然結合(NATURAL JOIN)は、内部結合や外部結合を行うときに、結合する項目名を指定しなくても2つのテーブルの同じ名前の項目を結合してデータを取得します。

基本的な構文は下記のようになります。

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

それでは、自然結合の使用例を確認してみましょう。

サンプルデータと同様の、社員テーブル(tbl_employees)と部署テーブル(tbl_dept)を用意しましょう。それぞれのCREATEコマンドとINSERTコマンドは以下となります。

【社員テーブルCREATEコマンド】
※前回までに社員テーブルを作成している場合は、DROPコマンドで削除してから作り直しましょう。
DROP TABLE tbl_employees; 

CREATE TABLE tbl_employees (emp_code INTEGER , emp_name TEXT , kana TEXT , gender TEXT , age INTEGER , dept_code INTEGER);
【社員テーブルINSERTコマンド】
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');
【部署テーブルCREATEコマンド】
前回までに部署テーブルを作成している場合は、DROPコマンドで削除してから作り直しましょう。
DROP TABLE tbl_dept; 

CREATE TABLE tbl_dept (dept_code INTEGER , dept_name TEXT);
【部署テーブルINSERTコマンド】
INSERT INTO tbl_dept (dept_code,dept_name)
VALUES ('1','技術部'), ('2','人事部'), ('3','総務部'), ('4','経理部');

作成した社員テーブルの内容を確認してみましょう。

SELECT *  FROM tbl_employees;

INSERTコマンドで作成した、6件のデータが表示されています。次に、部署テーブルの内容を確認してみましょう。

SELECT *  FROM tbl_dept;

INSERTコマンドで作成した、4件のデータが表示されています。それでは、自然結合の内部結合を確認してみましょう。

SELECT T1.emp_code,T1.emp_name,T2.dept_name
FROM tbl_employees AS T1
NATURAL INNER JOIN tbl_dept AS T2;

結果は、2つのテーブルの共通項目「dept_code」を指定していませんが、下図の「dept_code」を指定した内部結合の結果と同じ内容になります。

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;
株式会社システムインテグレータ
長年にわたり、基幹システム構築プロジェクトにおいて全工程を経験。その際、OracleやSQLServer等のDBMSでSQLを使用したプログラム開発を実施。現在は、製品企画室でスキル判定サービス「TOPSIC-SQL」のコンテンツ作成を主に担当。

連載バックナンバー

データベース技術解説
第10回

実践! 「TOPSIC SQL CONTEST」の練習問題にチャレンジしよう

2023/7/25
最終回となる今回は、これまでの訓練の成果を計るために、SQLの腕試しができるオンラインコンテスト「TOPSIC SQL CONTEST(TSC)」の練習問題にチャレンジしてみましょう。
データベース技術解説
第9回

神出鬼没!サブクエリについて(Part.2)

2023/6/29
第9回となる今回は、前回に引き続き、SQL文の中でも神出鬼没でさまざまな出現パターンを持つサブクエリについて解説していきます。
データベース技術解説
第8回

神出鬼没! サブクエリについて(Part.1)

2023/5/30
第8回となる今回からは、SQL文の中でも神出鬼没でさまざまな出現パターンを持つサブクエリについて解説していきます。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています