【SQL】副問い合わせ

副問い合わせ(サブクエリ)

複数の問い合わせを一度に行うときは、IN内にサブクエリを記述する。

SELECT
  MOVIE_TITLE_JP,
  SERIES_CD
FROM
  movies
WHERE
  SERIES_CD IN (
  SELECT
    SERIES_CD
  FROM
    movies
  WHERE
    MOVIE_TITLE_JP = 'アベンジャーズ');

タイトルが「アベンジャーズ」であるレコードのSERIES_CDを取得し、それとSERIES_CDが等しいレコードを取得している。

相関副問合せ

外側のSQLで抽出される1行ごとに内側の副問い合わせがその都度実行される。

SELECT DISTINCT A.PRODUCTID, B.PRODUCTNAME, MAX(A.QUANTITY)
FROM sales AS A
  JOIN products AS B
    ON A.PRODUCTID = B.PRODUCTID
WHERE A.QUANTITY = (
  SELECT MAX(QUANTITY)
  FROM sales AS C
  WHERE A.PRODUCTID = C.PRODUCTID
);

1行ごとにQUANTITYがPRODUCTIDごとの最大値であるかの検証が行われる。

SELECT PRODUCTID, PRODUCTNAME
FROM products AS A
WHERE EXISTS (
  SELECT 'X'
  FROM sales AS B
  WHERE A.PRODUCTID = B.PRODUCTID
);

一行ごとにsalesテーブルに各productsのレコードが存在するか検証される。EXISTはレコードが存在すればTRUEを返すので、慣習的にどのカラムとも関係ない'X'をセレクトする。

SELECT PRODUCTID, PRODUCTNAME
FROM products AS A
WHERE PRODUCTID IN (
  SELECT PRODUCTID
  FROM sales AS B
  WHERE A.PRODUCTID = B.PRODUCTID
  GROUP BY PRODUCTID
  HAVING MAX(QUANTITY)/10 > AVG(QUANTITY)
);

各productsの最大販売量/10が平均販売量より大きいかの検証が行われる。