SQL Serverのサブクエリの基本:SELECT文で使うサブクエリの理解と活用

SQL Serverを使う中で、サブクエリ(Subquery)は非常に便利で強力なツールです。

本記事では、SQL Serverにおけるサブクエリの基本的な概念から具体的な使い方までを解説します。さらに、理解を深めるための演習問題とその解答例もご用意しました。


サブクエリとは?

サブクエリとは、SQL文の中に埋め込まれた別のSQLクエリのことを指します。通常、括弧 ( ) で囲まれ、メインのクエリ(外部クエリ)の一部として機能します。

例えば、以下のようなシナリオでサブクエリが使用されます:

  • 条件として他のテーブルのデータを参照したい場合
  • 計算結果をフィルタリング条件や列値として利用したい場合
  • 集約データを外部クエリで利用したい場合

サブクエリの基本構文

サブクエリは、主に以下のような構文で使用されます:

SELECT文の中で使用

SELECT 列名
FROM テーブル名
WHERE 列名 = (SELECT 列名 FROM テーブル名 WHERE 条件);

FROM句の中で使用

SELECT 列名
FROM (SELECT 列名 FROM テーブル名 WHERE 条件) AS 別名;

HAVING句の中で使用

SELECT 列名, COUNT(*)
FROM テーブル名
GROUP BY 列名
HAVING COUNT(*) > (SELECT COUNT(*) FROM 別のテーブル WHERE 条件);

これらの形式を理解することで、さまざまな場面で柔軟にサブクエリを活用できるようになります。


サブクエリの種類

サブクエリには、用途や特徴によっていくつかの種類があります。それぞれの例を見ていきましょう。

単一行サブクエリ

単一の値を返すサブクエリです。条件式内で使用されることが多いです。

SELECT 商品名
FROM 商品
WHERE 価格 = (SELECT MAX(価格) FROM 商品);

複数行サブクエリ

複数の値を返すサブクエリです。INやANY、ALLといったキーワードと組み合わせて使用されます。

SELECT 商品名
FROM 商品
WHERE カテゴリID IN (SELECT カテゴリID FROM カテゴリ WHERE 親カテゴリID = 1);

相関サブクエリ

外部クエリの値に依存して実行されるサブクエリです。

SELECT 商品名
FROM 商品 A
WHERE 価格 > (SELECT AVG(価格) FROM 商品 B WHERE A.カテゴリID = B.カテゴリID);

スカラーサブクエリ

単一の値を返し、SELECT句や計算式内で利用されます。

SELECT 商品名, 
       (SELECT MAX(価格) FROM 商品 WHERE カテゴリID = 商品.カテゴリID) AS カテゴリ最高価格
FROM 商品;

サブクエリを使う際の注意点

  1. パフォーマンスの考慮
    サブクエリは強力ですが、複雑になるとパフォーマンスに影響を与えることがあります。場合によっては、結合(JOIN)の方が効率的な場合もあります。
  2. 結果の正確性
    サブクエリが返すデータ型や値の形式が、外部クエリの期待する形式と一致していることを確認しましょう。
  3. 適切な使用場面を選ぶ
    単純なクエリにはサブクエリを使わず、読みやすさを優先しましょう。

演習問題

以下の演習問題で、サブクエリの理解を深めましょう。

演習問題1: 最高価格の商品を取得する

次の「商品」テーブルから、最も価格が高い商品の名前を取得するクエリを作成してください。

商品テーブルの構造
  • 商品ID (ProductID)
  • 商品名 (ProductName)
  • 価格 (Price)

演習問題2: 特定カテゴリの商品を取得する

次の「商品」テーブルと「カテゴリ」テーブルを使用して、親カテゴリIDが1のすべての商品名を取得してください。

商品テーブルの構造
  • 商品ID (ProductID)
  • 商品名 (ProductName)
  • カテゴリID (CategoryID)
  • 価格 (Price)
カテゴリテーブルの構造
  • カテゴリID (CategoryID)
  • カテゴリ名 (CategoryName)
  • 親カテゴリID (ParentCategoryID)

演習問題3: カテゴリごとの平均価格を超える商品を取得する

次の「商品」テーブルを使用して、カテゴリごとの平均価格を超える商品の名前を取得してください。


解答例

解答例1: 最高価格の商品を取得する

SELECT 商品名
FROM 商品
WHERE 価格 = (SELECT MAX(価格) FROM 商品);

解答例2: 特定カテゴリの商品を取得する

SELECT 商品名
FROM 商品
WHERE カテゴリID IN (SELECT カテゴリID FROM カテゴリ WHERE 親カテゴリID = 1);

解答例3: カテゴリごとの平均価格を超える商品を取得する

SELECT 商品名
FROM 商品 A
WHERE 価格 > (SELECT AVG(価格) FROM 商品 B WHERE A.カテゴリID = B.カテゴリID);

まとめ

サブクエリは、SQL Serverにおいて複雑なデータ操作を簡潔に実現するための強力なツールです。

本記事で紹介した基本概念や構文を参考に、実務での利用に役立ててください。さらに、演習問題を解くことで、サブクエリの実践的な使い方をマスターしましょう。