神出鬼没!サブクエリについて(Part.2)
(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でまた、お会いしましょう!