はじめに
今回は、前回に引き続き「テーブル結合」のPart.2として、3種類のテーブル結合について説明していきます。前回で紹介した「内部結合」と「外部結合」を習得すれば、通常利用するSQL文の相当の範囲をカバーできますが、今回紹介するテーブル結合についても覚えておいて損はありません。内部・外部結合と合わせて、さらにサーチ力アップを目指しましょう。
訓練に使用するデータベースは、これまでに引き続き、いつもの「SQLite」を使用していきます。
それでは、今回も全力投球で訓練に行ってみましょう!
交差/自然/統合(色々なテーブル結合)
前回の解説で、テーブル結合の便利さを理解していただけたと思います。さらに今回は、覚えておくときっと役に立つ、下表に示す後半3種類のテーブル結合を紹介します。
(1)交差結合【CROSS JOIN】
交差結合(CROSS JOIN
)は、2つのテーブルの組み合わせを全て取得します。基本的な構文は下記のようになります。
それでは、交差結合の使用例を確認してみましょう。
ここで、確認のために新たにサイズテーブル(tbl_size)と色テーブル(tbl_color)の2つのテーブルを作成してデータを挿入します。
【サイズテーブルCREATEコマンド】
1 | CREATE TABLE tbl_size (id INTEGER , size TEXT); |
【サイズテーブルINSERTコマンド】
1 | INSERT INTO tbl_size (id , size) |
2 | VALUES ('1','S'), ('2','M'), ('3','L'); |
【色テーブルCREATEコマンド】
1 | CREATE TABLE tbl_color (id INTEGER , color TEXT); |
【色テーブルINSERTコマンド】
1 | INSERT INTO tbl_color (id , color) |
2 | VALUES ('1','赤'), ('2','青'), ('3','白'), ('4','黒'); |
作成したサイズテーブルの内容を確認してみましょう。
*「.headers」「.mode」は表示内容の設定コマンドなので、ログイン後に1回実行すればOKです。
INSERTコマンドで作成した、3件のデータが表示されています。次に、色テーブルの内容を確認してみましょう。
1 | SELECT * FROM tbl_color; |
INSERTコマンドで作成した、4件のデータが表示されています。それでは、サイズテーブルと色テーブルの2つのテーブルを交差結合してみましょう。
1 | SELECT T1.id , size , T2.id , color |
3 | CROSS JOIN tbl_color AS T2; |
サイズテーブル(3件)×色テーブル(4件)=12件の組み合わせデータが表示されていることが確認できます。使用例では全組み合わせが12件でしたが、大量データのテーブルを交差結合する場合は、処理に時間が掛かる可能性があるので注意してください。
(2)自然結合【NATURAL JOIN】
自然結合(NATURAL JOIN
)は、内部結合や外部結合を行うときに、結合する項目名を指定しなくても2つのテーブルの同じ名前の項目を結合してデータを取得します。
基本的な構文は下記のようになります。
2 | SELECT 項目X,・・・FROM テーブルY |
3 | NATURAL INNER JOIN テーブルZ; |
5 | SELECT 項目X,・・・FROM テーブルY |
6 | NATURAL LEFT OUTER JOIN テーブルZ; |
それでは、自然結合の使用例を確認してみましょう。
サンプルデータと同様の、社員テーブル(tbl_employees)と部署テーブル(tbl_dept)を用意しましょう。それぞれのCREATEコマンドとINSERTコマンドは以下となります。
【社員テーブルCREATEコマンド】
※前回までに社員テーブルを作成している場合は、DROPコマンドで削除してから作り直しましょう。
1 | DROP TABLE tbl_employees; |
3 | CREATE TABLE tbl_employees (emp_code INTEGER , emp_name TEXT , kana TEXT , gender TEXT , age INTEGER , dept_code INTEGER); |
【社員テーブルINSERTコマンド】
1 | INSERT INTO tbl_employees (emp_code,emp_name,kana,gender,age,dept_code) |
3 | ('1','HoriiTaro','ホリイタロウ','M','40','1') |
4 | , ('2','IshimuraHana','イシムラハナ','F','33','2') |
5 | , ('3','KitajimaRuna','キタジマルナ','F','45','3') |
6 | , ('4','MuroiYuri', 'ムロイユリ','F', '27','1') |
7 | , ('5','KitazawaAika','キタザワアイカ','F','33','1') |
8 | , ('6','MitaniKoukiti','ミタニコウキチ','M','23','2'); |
【部署テーブルCREATEコマンド】
前回までに部署テーブルを作成している場合は、DROPコマンドで削除してから作り直しましょう。
3 | CREATE TABLE tbl_dept (dept_code INTEGER , dept_name TEXT); |
【部署テーブルINSERTコマンド】
1 | INSERT INTO tbl_dept (dept_code,dept_name) |
2 | VALUES ('1','技術部'), ('2','人事部'), ('3','総務部'), ('4','経理部'); |
作成した社員テーブルの内容を確認してみましょう。
1 | SELECT * FROM tbl_employees; |
INSERTコマンドで作成した、6件のデータが表示されています。次に、部署テーブルの内容を確認してみましょう。
INSERTコマンドで作成した、4件のデータが表示されています。それでは、自然結合の内部結合を確認してみましょう。
1 | SELECT T1.emp_code,T1.emp_name,T2.dept_name |
2 | FROM tbl_employees AS T1 |
3 | NATURAL INNER JOIN tbl_dept AS T2; |
結果は、2つのテーブルの共通項目「dept_code」を指定していませんが、下図の「dept_code」を指定した内部結合の結果と同じ内容になります。
1 | SELECT T1.emp_code,T1.emp_name,T2.dept_name |
2 | FROM tbl_employees AS T1 |
3 | INNER JOIN tbl_dept AS T2 |
4 | ON T1.dept_code = T2.dept_code; |