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

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

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

はじめに

今回からは「サブクエリ」について解説していきます。サブクエリは神出鬼没で、SQL文のさまざまな箇所に出現します。しかし、敬遠されがちなサブクエリも、出現パターンを覚えてしまえば怖くはありません。パターンが複数におよぶため、今回と次回の2回に分けて紹介しますが、出現する場所ごとに使い方を解説しますので、しっかり習得してください。

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

それでは、今回もパワフルに訓練へ行ってみましょう!

「サブクエリ」って何?

SQL文の問い合わせのことを「クエリ」と呼びますが、サブクエリとは、その名の通りSQL文の中に入れ子でSQL文を記述することを指し、「副問い合わせ」とも呼ばれます。SELECT文やFROM句、WHERE句はもちろん、INSERT文やUPDATE文など、さまざまなところで使用できます。

サブクエリのメリットとして、複数のSELECT文を1つにまとめて記述できたり、複雑なテーブル結合を使わずに記述できたりという点があります。一方、デメリットとして処理速度が遅くなる場合があるので、使用には注意が必要です。

下図が、サブクエリの使われ方のイメージになります。

マーカーの部分がサブクエリです。それぞれ、以下の場合で使われています。

  1. SELECT文の項目として使用する場合
  2. UPDATE文の項目を別テーブルの値で更新する場合
  3. 別テーブルの値でデータをINSERTする場合
  4. FROM句で別テーブルの値をテーブルとして使用する場合
  5. WHERE句で別テーブルの存在チェックに使用する場合

それでは、それぞれ使われ方の詳細を説明していきます。

1. SELECT文で使用するケース

はじめに、SELECT文で別テーブルから値を取得する使用例を確認してみましょう。

サンプルデータと同様の社員テーブル(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 , valid_flg INTEGER , update_user_id TEXT);
【部署テーブルINSERTコマンド】
INSERT INTO tbl_dept (dept_code,dept_name,valid_flg,update_user_id)
VALUES
 ('1','技術部','1','YAMADA'), ('2','人事部','1','YAMADA')
, ('3','総務部','1','TANAKA'), ('4','経理部','0','SATO');

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

.headers on
.mode column

SELECT *  FROM tbl_employees;

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

INSERTコマンドで作成した、6件のデータが表示されています。

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

SELECT *  FROM tbl_dept;

INSERTコマンドで作成した、4件のデータが表示されています。

それでは、使用例のSELECT文を確認してみましょう。

SELECT emp_name
    , ( SELECT dept_name FROM tbl_dept AS dp 
        WHERE  dp.dept_code = emp.dept_code)  AS dept_name
FROM tbl_employees AS emp;

社員テーブルの「dept_code」に一致する、部署テーブルの「dept_name」を取得していることが確認できます。

ここで、3点ポイントがあります。

  1. SELECT文でサブクエリを使用する場合は、結果が見やすいようにAS句を使用して別名にする
  2. サブクエリの結果は必ず1行となるクエリを記述する
  3. サブクエリはカッコ()で囲む

参考までに、サブクエリを使用しない内部結合で記述した場合は、以下のようになります。

SELECT emp_name , dept_name
 FROM tbl_employees AS emp
 INNER JOIN tbl_dept AS dp 
    ON dp.dept_code = emp.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メルマガ会員のサービス内容を見る

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