①サブクエリとは
サブクエリとは、SQL文の中に入れ子で書かれる「別のSELECT文」のこと。
結果を一時的なテーブルのように扱えるため、複雑な検索や集計を柔軟に実現できる。
一般的には SELECT、FROM、WHERE、HAVING などさまざまな場所で使われる。
SELECT *
FROM products
WHERE price > (SELECT AVG(price) FROM products);
この例では「平均価格より高い商品」を抽出している。
②WHERE句で使うサブクエリ
最も基本的な使い方は、WHERE句で条件を他の検索結果と比較するもの。
単一行サブクエリ(結果が1行1列)としてよく使われる。サブクエリは外側のクエリより先に実行され、その結果を用いてフィルタリングする。
SELECT name, price
FROM products
WHERE price = (SELECT MIN(price) FROM products);
この例では最も安い商品を取得する。
③FROM句で使うサブクエリ(派生テーブル)
FROM句に置いたサブクエリは、仮のテーブル(派生テーブル)として扱われる。
複雑な集計結果をさらにフィルタしたい場合などに有効。派生テーブルには必ずエイリアス(別名)が必要。
SELECT *
FROM (
SELECT category, AVG(price) AS avg_price
FROM products
GROUP BY category
) AS cat_avg
WHERE avg_price > 1000;
カテゴリ別平均価格が1000を超えるものを抽出している。
④SELECT句で使うサブクエリ
SELECT句に置くと、各行に別の計算結果を付加できる。
ただし行ごとに実行されるため、重い処理には注意が必要。
値を1つ返すスカラサブクエリとして扱われる。
SELECT name,
price,
(SELECT AVG(price) FROM products) AS avg_price
FROM products;
全商品を表示しつつ、平均価格も同時に出す例。
⑤相関サブクエリ(外側の値を使用する)
相関サブクエリは、外側のクエリの値を参照しながら行ごとに評価されるサブクエリである。
実行回数が増えるため重くなりがちだが、行ごとの比較などに便利
SELECT p1.name, p1.price
FROM products p1
WHERE p1.price >
(SELECT AVG(p2.price)
FROM products p2
WHERE p2.category = p1.category);
同じカテゴリ内の平均より高い商品を抽出する例