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

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

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

(1)IN句で存在チェック

IN句は、複数の値のいずれかと一致するとデータを取得します。指定した値との比較や、前述のようにサブクエリで取得した値と比較できます。また「NOT IN」のようにNOTを前に付加すると、指定した値以外のデータを取得してくれます。

[使用例1]の値を直接指定した場合について、それぞれ確認してみましょう。

SELECT emp_name , dept_code
FROM tbl_employees
 WHERE dept_code IN ( 2 , 3 );

部署コードが2または3のデータが抽出されています。

WHERE句を「dept_code = 2 OR dept_code = 3」と記述した場合と同じ結果ですが、IN句を使用するとシンプルに記述できます。

「NOT IN」も確認してみましょう。

SELECT emp_name , dept_code
FROM tbl_employees
 WHERE dept_code NOT IN ( 2 , 3 );

NOT INでは、部署コードが2、3以外のデータが抽出されているのが確認できます。

[使用例2]は、WHERE句の始めの説明で紹介したクエリになりますが、サブクエリでテーブルから取得した値と比較しています。

サブクエリで取得される値を直接指定すると、以下のクエリになります。

SELECT emp.emp_name,emp.dept_code
  FROM tbl_employees AS emp
WHERE emp.dept_code IN ( 1 , 2 , 3 );

結果は、もちろんサブクエリを使用した場合と同じになります。

(2)EXISTS句で存在チェック

ここで、IN句と同様に存在チェックによく利用されるEXISTS句を紹介します。EXISTS句はサブクエリで指定した条件のデータが存在するかどうかをチェックします。存在する場合は「TRUE」、存在しない場合は「FALSE」を返します。TRUEとなった場合に、該当するメインテーブルのデータが抽出されます。

確認の準備として、部署テーブルからデータを1件削除します。削除後の結果も確認してみましょう。

DELETE FROM tbl_dept WHERE dept_code = 4;

SELECT * FROM tbl_dept;

部署コード = 4 のデータが削除されていることが確認できます。

それでは、使用例を確認してみましょう。サブクエリで社員テーブルの部署コードと部署テーブルの部署コードを比較して、存在する場合はTRUE、存在しない場合はFALSEが返されます。

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

先ほど部署テーブルから削除した部署コード = 4 の社員テーブルのデータは、EXISTS句でのチェック結果がFALSEになるため表示されていないことが確認できます。

EXISTS句にも「NOT」を使用できます。

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

NOTを付加すると、部署テーブルに存在しない部署コード = 4 のデータが表示されます。

参考までに、EXISTS句を内部結合で書き換えた場合と、NOT EXISTS句を外部結合で書き換えた場合を紹介します。

【EXISTSを内部結合で書き換えた場合】
SELECT emp.emp_name,emp.dept_code
  FROM tbl_employees AS emp
INNER JOIN tbl_dept AS dp ON dp.dept_code = emp.dept_code;

部署コードで内部結合しているので、部署コードが両方のテーブルに存在するデータが表示されます。

【NOT EXISTSを外部結合で書き換えた場合】
SELECT emp.emp_name,emp.dept_code
  FROM tbl_employees AS emp
LEFT OUTER JOIN tbl_dept AS dp ON dp.dept_code = emp.dept_code
WHERE dp.dept_code IS NULL;

外部結合先の部署テーブルに部署コードが存在しない場合、部署コードがNULLとなるので、WHERE句でIS NULLの条件を記述しています。

おわりに

本連載では、今回までSQLの基礎となる内容を説明してきました。皆さんの戦闘力アップの一助となれたなら幸いですが、いかがでしたか。SQLは様々な記述方法がありますので、ぜひ、訓練場でトライ&エラーを繰り返しながらスキルアップに励んでみてください。

さて、本連載も次回は最終回となります。次回は、SQLの腕試しができるオンラインコンテスト「TOPSIC SQL CONTEST(TSC)」の練習問題を解説をしていきます。もちろん、次回の解説前の事前チャレンジ大歓迎です!

TOPSIC SQL CONTEST(TSC)は、簡単な会員登録をするだけで、だれでも無料でコンテストに参加できます。コンテストは不定期に開催されますが、過去のコンテスト問題も解答できます。

TOPSIC SQL CONTEST(TSC)サイト内にある、下記のアイコンから会員登録ができます。

それでは、また次回のSQL-BOOTCAMPでまた、お会いしましょう!

株式会社システムインテグレータ
長年にわたり、基幹システム構築プロジェクトにおいて全工程を経験。その際、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メルマガ会員のサービス内容を見る

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