頻出高 ⏱ 7分 ★★★★★

サブクエリ

SELECT文の中に埋め込むクエリの全パターン

SELECT 文の中に埋め込まれた別の SELECT 文。括弧で囲み、外側クエリの条件・列・テーブルとして使用できる。

サブクエリの種類
位置名称
WHERE 句スカラー/行サブクエリWHERE 金額 > (SELECT AVG(金額) FROM 受注)
FROM 句インラインビュー(派生テーブル)FROM (SELECT ...) AS t
SELECT 句スカラーサブクエリSELECT (SELECT COUNT(*) FROM ...) AS cnt
WITH 句CTE(共通テーブル式)WITH cte AS (SELECT ...) SELECT * FROM cte
-- 平均金額より高い受注を取得
SELECT 受注ID, 金額
FROM   受注
WHERE  金額 > (SELECT AVG(金額) FROM 受注);

-- IN を使った複数値サブクエリ
SELECT 顧客名
FROM   顧客
WHERE  顧客ID IN (SELECT 顧客ID FROM 受注 WHERE 金額 >= 10000);
-- 受注がある顧客だけを取得
SELECT 顧客名
FROM   顧客 c
WHERE EXISTS (
  SELECT 1
  FROM   受注 o
  WHERE  o.顧客ID = c.顧客ID
);
EXISTS は行が 1 件でも存在すれば TRUE を返す。SELECT 1 で十分(列は何でもよい)。
WITH high_orders AS (
  SELECT 顧客ID, SUM(金額) AS 合計
  FROM   受注
  GROUP BY 顧客ID
  HAVING SUM(金額) >= 50000
)
SELECT c.顧客名, h.合計
FROM   顧客 c
JOIN   high_orders h ON c.顧客ID = h.顧客ID;

CTE は可読性が高く、同じサブクエリを複数回参照するときに有効。

📝 理解度チェック

スカラーサブクエリが返せる行・列の数として正しいのはどれか?
NOT IN にNULLが含まれる列を使うと問題が起きる理由はどれか?

読了ボタンを押すとトップページの進捗に反映されます