SQLのサブクエリは概念を理解した後、実際にどう活用すればいいのかが重要です。
「EXISTS・IN・ANYってどう使い分けるの?」という疑問もよく聞かれます。
この記事では、サブクエリのSQLでの実践的な活用方法について、WHERE条件・EXISTS・IN・ANY・ALL演算子を使った具体的な使用例を豊富に解説しています。
実際の業務でサブクエリを活かせるようになりたい方はぜひ参考にしてください。
WHERE条件でのサブクエリの実践的な活用例
それではまず、WHERE条件でのサブクエリの実践的な活用例について解説していきます。
WHERE句でのサブクエリは最も活用頻度が高く、実務でも頻繁に登場します。
最大値・最小値を条件に使う活用例
最も高額な商品を取得する例:
SELECT 商品名, 価格 FROM 商品
WHERE 価格 = (SELECT MAX(価格) FROM 商品);
最も古い注文を取得する例:
SELECT * FROM 注文
WHERE 注文日 = (SELECT MIN(注文日) FROM 注文);
MAX・MIN・AVGなどの集計関数はWHERE句では直接使えないため、サブクエリで計算してから条件に使う方法が有効です。
条件に合致しないデータを取得する活用例
一度も注文したことのない顧客を取得する例:
SELECT 顧客名 FROM 顧客
WHERE 顧客ID NOT IN (SELECT 顧客ID FROM 注文);
— EXISTSで書く場合:
SELECT 顧客名 FROM 顧客
WHERE NOT EXISTS (SELECT 1 FROM 注文 WHERE 注文.顧客ID = 顧客.顧客ID);
EXISTS・NOT EXISTSの実践的な活用例
続いては、EXISTS・NOT EXISTSの実践的な活用例を確認していきます。
EXISTSは「サブクエリが1行以上の結果を返すか」を確認する演算子で、相関サブクエリとの組み合わせで強力に機能します。
EXISTSで関連データの存在を確認する例
レビューを投稿したことがある会員を取得する例:
SELECT 会員名 FROM 会員
WHERE EXISTS
(SELECT 1 FROM レビュー WHERE レビュー.会員ID = 会員.会員ID);
在庫がある商品だけを取得する例:
SELECT 商品名 FROM 商品
WHERE EXISTS
(SELECT 1 FROM 在庫 WHERE 在庫.商品ID = 商品.商品ID AND 在庫数 > 0);
NOT EXISTSで存在しないデータを取得する例
NOT EXISTSはサブクエリが結果を返さない(存在しない)場合にTRUEになる演算子で、NULLを含む場合でもNOT INより安全に動作します。
フォロワーがいないユーザーを取得する例:
SELECT ユーザー名 FROM ユーザー
WHERE NOT EXISTS
(SELECT 1 FROM フォロー WHERE フォロー.フォロー先ID = ユーザー.ユーザーID);
ANY・ALL演算子とサブクエリの活用例
続いては、ANY・ALL演算子とサブクエリの活用例を確認していきます。
ANY・ALLはサブクエリが返す複数の値と比較するための演算子です。
ANY演算子の使い方と活用例
ANY演算子はサブクエリが返す値のうち、いずれか1つでも条件を満たせばTRUEになります。
ANY演算子の例(いずれかの部署の平均給与より高い社員を取得):
SELECT 社員名, 給与 FROM 社員
WHERE 給与 > ANY (SELECT AVG(給与) FROM 社員 GROUP BY 部署ID);
「= ANY」はINと同じ意味になります。
ALL演算子の使い方と活用例
ALL演算子はサブクエリが返すすべての値に対して条件を満たす場合にTRUEになります。
ALL演算子の例(すべての部署の平均給与より高い社員を取得):
SELECT 社員名, 給与 FROM 社員
WHERE 給与 > ALL (SELECT AVG(給与) FROM 社員 GROUP BY 部署ID);
「<> ALL」はNOT INと同じ意味になります。
実務でのサブクエリ活用のコツ
実務でサブクエリを活用する際は、まずEXPLAIN(実行計画)で処理効率を確認する習慣をつけることが重要です。
複雑なサブクエリはCTEに分解して可読性を高めることも有効なアプローチです。
NULLが混在するデータを扱う場合はNOT INよりNOT EXISTSの方が安全に動作することも覚えておくと良いでしょう。
まとめ
この記事では、サブクエリのSQLでの実践的な活用方法について、WHERE条件・EXISTS・IN・ANY・ALL演算子を使った具体的な使用例とともに詳しく解説しました。
サブクエリはWHERE条件での動的な値取得・EXISTSによる存在確認・ANY・ALLを使った複数値との比較など、SQLの表現力を大幅に高める重要な機能です。
今回紹介した実践例を参考に、実際のSQLで積極的にサブクエリを活用してみてください。