テーブル結合について (Part.2) -「交差結合」「自然結合」「統合結合」
はじめに
今回は、前回に引き続き「テーブル結合」の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;