初心者のための SQL-BOOTCAMP 5

テーブル結合について(Part.1) ー「内部結合」と「外部結合」

第5回となる今回は、複数のテーブルを使用するためのテーブル結合、「内部結合」と「外部結合」について紹介します。

久保 司

2023年2月15日 9:17

目次

  1. はじめに
  2. サーチ力アップ(テーブル結合) 欲しい情報が複数のテーブルにある場合、それぞれのテーブルの情報をSELECT文で取得してから組み合わせるのは大変手間がかかってしまいます。テーブル結合は、1つのSELECT文で複数のテーブルを結合して情報を取得できるため、大変便利な方法です。 今回は、下表で示す5種類のテーブル結合のうち「内部結合」と「外部結合」の2つを紹介します。残りの3つの結合については、次回のPart.2で紹介します。
    今回も、お馴染みの社員テーブル(tbl_employees)と、新たに部署テーブル(tbl_dept)を使用して説明していきます。それぞれのCREATEコマンドとINSERTコマンドは以下となります。 【社員テーブルCREATEコマンド】 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コマンド】 CREATE TABLE tbl_dept (dept_code INTEGER , dept_name TEXT); 【部署テーブルINSERTコマンド】 INSERT INTO tbl_dept (dept_code,dept_name) VALUES ('1','技術部'), ('2','人事部'), ('3','総務部'), ('4','経理部');
    作成した社員テーブルの内容を確認してみましょう。 .headers on .mode column SELECT * FROM tbl_employees; *「.headers」「.mode」は表示内容の設定コマンドなので、ログイン後に1回実行すればOKです。
    INSERTコマンドで作成した6件のデータを確認できます。 次に、部署テーブルの内容を確認してみましょう。 SELECT * FROM tbl_dept;
    INSERTコマンドで作成した4件のデータを確認できます。 それでは、2つのテーブル結合について説明していきます。 (1)内部結合【INNER JOIN】 内部結合(INNER JOIN)は、指定したそれぞれのテーブルの項目の値が一致するデータを取得します。基本的な構文は、下記のようになります。 SELECT 項目, … FROM テーブル1 INNER JOIN テーブル2  ON テーブル1.項目名1 = テーブル2.項目名1; 内部結合を使用した、社員が所属している部署名一覧の使用例を確認してみましょう。
    使用例のSELECT文を、取得元のテーブルを分かりやすくするため、AS句を使用して社員テーブルを「T1」、部署テーブルを「T2」と別名を付けて記述してみましょう。 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;
    社員テーブルに部署テーブルを内部結合しています。結合の条件は両方のテーブルにある部署コードとなっています。部署名が社員テーブルの部署コードと同じ部署テーブルの部署コードの部署名になっていることが確認できます。 (2)外部結合【OUTER JOIN】 外部結合(OUTER JOIN)は、指定したそれぞれのテーブルの項目の値が一致するデータだけではなく、どちらかのテーブルに存在するデータも取得します。基本的な構文は下記のようになります。 SELECT 項目, … FROM テーブル1 LEFT OUTER JOIN テーブル2  ON テーブル1.項目名1 = テーブル2.項目名1; また、外部結合は下図にあるように、さらに3種類あります。今回は、よく利用される「左外部結合」を使用して説明していきます。
    それでは、左外部結合を確認するために社員テーブルの情報を更新してみましょう。UPDATE文で社員テーブルの社員コード = 4のデータの部署コードに部署テーブルに存在しない値「5」を設定して、SELECT文で更新内容を確認してみます。 UPDATE tbl_employees SET dept_code = 5 WHERE emp_code = 4; SELECT * FROM tbl_employees;
    確認できたので、下図の使用例のように社員テーブルと部署テーブルを外部結合で連結してみましょう。
    先ほどの内部結合で使用したスクリプトの「INNER」を「LEFT OUTER」に変更するだけです。 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;
    結果は図の使用例にあるように、社員コード = 4の部署名が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;
    外部結合で表示されていた社員コード = 4のデータが、内部結合では結合したテーブルに該当するデータが存在しないため、表示されないことが確認できます。 おわりに 今回は、テーブル結合でよく利用される「内部結合」と「外部結合」について説明しました。次回も、引き続き残りの3つのテーブル結合を紹介します。また、その次の回では、内部結合についてさらに掘り下げて説明していきますので、しっかり身に付けていきましょう。テーブル結合も習得できたら、SQL-BOOTCAMPも卒業間近です。 そこで、SQLの腕試しができるオンラインコンテスト「TOPSIC SQL CONTEST (TSC)」を紹介します。簡単な会員登録をするだけで、だれでも無料でコンテストに参加できるのでお手軽です。コンテストは不定期に開催されますが、過去のコンテスト問題も解答できるので、ぜひ、チャレンジしてみてください。 上記「TOPSIC SQL CONTEST (TSC)」サイト内にある、下記のアイコンから会員登録ができます。
    それでは、また次回のSQL-BOOTCAMPでお会いしましょう!
  3. おわりに

はじめに

前回までのSQL-BOOTCAMPでは、1つのSQL文で1つのテーブルを使用して説明してきました。しかし、実際にデータを取得する際には、複数のテーブルを使用する場合がほとんどです。

そこで今回は、複数のテーブルを使用する「テーブル結合」を覚えてサーチ力をアップしましょう。テーブル結合と言っても、結合方法は1つではありません。今回は、その中でもよく利用される2つの結合方法を紹介します。

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

それでは、今回も集中して訓練に行ってみましょう!

サーチ力アップ(テーブル結合)

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

今回は、下表で示す5種類のテーブル結合のうち「内部結合」と「外部結合」の2つを紹介します。残りの3つの結合については、次回のPart.2で紹介します。

今回も、お馴染みの社員テーブル(tbl_employees)と、新たに部署テーブル(tbl_dept)を使用して説明していきます。それぞれのCREATEコマンドとINSERTコマンドは以下となります。

【社員テーブルCREATEコマンド】
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コマンド】
CREATE TABLE tbl_dept (dept_code INTEGER , dept_name TEXT);
【部署テーブルINSERTコマンド】
INSERT INTO tbl_dept (dept_code,dept_name)
VALUES ('1','技術部'), ('2','人事部'), ('3','総務部'), ('4','経理部');

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

.headers on
.mode column

SELECT *  FROM tbl_employees;

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

INSERTコマンドで作成した6件のデータを確認できます。

次に、部署テーブルの内容を確認してみましょう。

SELECT *  FROM tbl_dept;

INSERTコマンドで作成した4件のデータを確認できます。

それでは、2つのテーブル結合について説明していきます。

(1)内部結合【INNER JOIN】

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

SELECT 項目, … FROM テーブル1
  INNER JOIN テーブル2 
 ON テーブル1.項目名1 = テーブル2.項目名1;

内部結合を使用した、社員が所属している部署名一覧の使用例を確認してみましょう。

使用例のSELECT文を、取得元のテーブルを分かりやすくするため、AS句を使用して社員テーブルを「T1」、部署テーブルを「T2」と別名を付けて記述してみましょう。

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;

社員テーブルに部署テーブルを内部結合しています。結合の条件は両方のテーブルにある部署コードとなっています。部署名が社員テーブルの部署コードと同じ部署テーブルの部署コードの部署名になっていることが確認できます。

この記事のキーワード

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る