サブクエリの概念は理解できたものの、「実際にどう書けばいいの?」と迷う方も多いのではないでしょうか。
構文のルールや各句での使い方を押さえておくことで、サブクエリを正確に活用できるようになります。
この記事では、サブクエリの書き方について、WHERE句・SELECT文・FROM句・HAVING句など句ごとの構文と記述方法を具体的な例を交えてわかりやすく解説しています。
SQLの実践力を高めたい方はぜひ参考にしてください。
サブクエリの基本的な構文ルールとポイント
それではまず、サブクエリの基本的な構文ルールとポイントについて解説していきます。
サブクエリを書く際の基本ルール:1.サブクエリは必ず括弧()で囲む 2.サブクエリは単独で実行可能なSELECT文である 3.ORDER BY句はサブクエリ内では通常使用しない(データベースによっては使用可能) 4.スカラーサブクエリは必ず1行1列の結果を返す必要がある
WHERE句でサブクエリを使う書き方
最もよく使われるのがWHERE句でのサブクエリです。
WHERE句にサブクエリを使うことで、固定値ではなく動的に計算された値を条件に指定できます。
WHERE句でのサブクエリの例:
— 社員テーブルから平均給与より高い給与の社員を取得
SELECT 社員名, 給与 FROM 社員
WHERE 給与 > (SELECT AVG(給与) FROM 社員);
— 特定の部署に所属する社員だけを取得(IN演算子との組み合わせ)
SELECT 社員名 FROM 社員
WHERE 部署ID IN (SELECT 部署ID FROM 部署 WHERE 部署名 = ‘開発部’);
比較演算子とサブクエリの組み合わせ
WHERE句のサブクエリでは、比較演算子(=、>、<、>=、<=、<>)と組み合わせてスカラーサブクエリを使うことが多いです。
IN演算子を使う場合はサブクエリが複数行を返してもOKですが、=演算子を使う場合は必ず1行の結果を返す必要があります。
FROM句とSELECT句でのサブクエリの書き方
続いては、FROM句とSELECT句でのサブクエリの書き方を確認していきます。
WHERE句以外の場所でサブクエリを使うことで、より複雑なデータ操作が可能になります。
FROM句でのサブクエリ(インラインビュー)の書き方
FROM句にサブクエリを配置すると、その結果を仮想テーブルとして使えます。
FROM句でのサブクエリ(インラインビュー)の例:
SELECT カテゴリ, 平均価格
FROM
(SELECT カテゴリ, AVG(価格) AS 平均価格
FROM 商品
GROUP BY カテゴリ) AS カテゴリ別集計
WHERE 平均価格 > 3000;
FROM句のサブクエリには必ずエイリアス(別名)を付ける必要があります。
上の例では「カテゴリ別集計」がエイリアスにあたります。
SELECT句でのスカラーサブクエリの書き方
SELECT句にサブクエリを使うと、各行に対して別テーブルから値を取得して列として追加できます。
SELECT句でのスカラーサブクエリの例:
SELECT
社員名,
給与,
(SELECT AVG(給与) FROM 社員) AS 全社平均給与,
給与 – (SELECT AVG(給与) FROM 社員) AS 平均との差
FROM 社員;
このようにSELECT句のスカラーサブクエリを使うと、各行に集計値を並べて比較するような出力ができます。
HAVING句とEXISTS・INを使ったサブクエリの書き方
続いては、HAVING句とEXISTS・INを使ったサブクエリの書き方を確認していきます。
サブクエリの活用範囲をさらに広げる重要な構文です。
HAVING句でのサブクエリの書き方
HAVING句はGROUP BYの集計結果に条件を指定する句ですが、ここでもサブクエリを使えます。
HAVING句でのサブクエリの例(全カテゴリの平均を上回るカテゴリのみを抽出):
SELECT カテゴリ, AVG(価格) AS 平均価格
FROM 商品
GROUP BY カテゴリ
HAVING AVG(価格) > (SELECT AVG(価格) FROM 商品);
EXISTSを使ったサブクエリの書き方
EXISTSは、サブクエリが1件以上の結果を返す場合にTRUEとなる演算子で、相関サブクエリとの組み合わせでよく使われます。
EXISTSを使ったサブクエリの例(注文が1件以上ある顧客を取得):
SELECT 顧客名 FROM 顧客
WHERE EXISTS
(SELECT 1 FROM 注文
WHERE 注文.顧客ID = 顧客.顧客ID);
EXISTSは結果の値ではなく「存在するかどうか」だけを確認するため、「SELECT 1」のようにダミーの値を使うことが一般的です。
INとNOT INの使い方
IN演算子はサブクエリが返す複数の値のいずれかに一致するかどうかを判定します。
IN・NOT INの例:
— 東京か大阪の倉庫の商品を取得
SELECT 商品名 FROM 在庫
WHERE 倉庫ID IN (SELECT 倉庫ID FROM 倉庫 WHERE 場所 IN (‘東京’, ‘大阪’));
— 注文履歴のない顧客を取得
SELECT 顧客名 FROM 顧客
WHERE 顧客ID NOT IN (SELECT 顧客ID FROM 注文);
NOT INを使う場合、サブクエリの結果にNULLが含まれると全行がFALSEになってしまう点に注意が必要です。
まとめ
この記事では、サブクエリの書き方について、WHERE句・FROM句・SELECT句・HAVING句・EXISTS・INなど句ごとの構文と記述方法を具体的な例とともに解説しました。
サブクエリは括弧で囲み、どの句に配置するかによって動作と用途が変わります。
各句での使い方をしっかり把握することで、より柔軟で表現力の高いSQLが書けるようになるでしょう。
今回紹介した例を参考に、実際のSQL記述に活用してみてください。