サブクエリ
データベース内のデータから派生した条件に基づいてデータを取得する必要がある場合がよくあります。
サブクエリは、1 つの SELECT ステートメントの結果を別のステートメントの一部として使用できるようにすることで、これを実現します。 これは、特定の平均を超える注文を行ったすべての顧客を検索したり、特定のサプライヤー セットから供給された製品を特定したりするなどのタスクに役立ちます。
サブクエリは、次のコンテキストで使用できます。
SELECT ステートメントの句 (FROM、WHERE、HAVING 句) 内
データ操作ステートメント (INSERT、 UPDATE、 DELETE ステートメント) 内
強調する重要なポイント
サブクエリは常に SELECT ステートメントです。
サブクエリはかっこ () で囲みます。
サブクエリの結果は、外部クエリによって使用されます。
サブクエリの例
SELECT product_name, price
FROM sales.products
WHERE price > (
SELECT AVG(price)
FROM sales.products
);
このクエリでは、sales.products テーブルから、price が同じテーブル内のすべての製品の平均 price を超える製品の名前と価格を取得します。 WHERE 句内でサブクエリを使用し、sales.products テーブルから AVG(price) を選択して平均 price を計算します。 次に、このサブクエリの結果を外部クエリの price 列と比較して、この計算された平均を超える価格の製品のみをフィルター処理して表示します。
SELECT customer_id, customer_name
FROM sales.customers
WHERE customer_id IN (
SELECT DISTINCT customer_id
FROM sales.orders
);
このクエリでは、sales.customers テーブルから少なくとも 1 件の注文を行った顧客の ID と名前を取得します。 これを行うには、WHERE 句内でサブクエリを使用します。 サブクエリでは、注文を行った顧客を表す一意の customer_id 値を sales.orders テーブルから選択します。 次に、外部クエリはこれらの ID を使用して顧客情報をフィルター処理して表示します。これにより、注文と関連付けられた顧客のみが結果に含まれるようになります。
SELECT supplier_id, AVG (price) AS avg_price
FROM (
SELECT supplier_id, price
FROM sales.products
) AS product_prices
GROUP BY supplier_id;
このクエリでは、各サプライヤーの平均製品価格を計算します。 FROM 句のサブクエリを使用して、sales.products table から supplier_id と価格を選択します。 次に、外部クエリは結果を supplier_id 別にグループ化し、各グループの平均 price を計算します。 この方法は、フィルター処理または前処理されたデータ セットに対して集計を実行する場合に役立ちます。
UPDATE sales.products
SET price = price * 1.1
WHERE category_id = (
SELECT category_id
FROM sales.products
GROUP BY category_id
ORDER BY AVG(price) DESC LIMIT 1
);
このクエリでは、平均価格が最も高いカテゴリの製品の価格を 10% 増加させます。 UPDATE ステートメントは、sales.products テーブルの price 列を変更し、WHERE 句の条件に一致する行の列を 1.1 倍します。
WHERE 句内のサブクエリは、製品を category_id 別にグループ化し、各グループの平均 price を計算し、平均 price の降順で並べ替えることで、平均 price が最も高いカテゴリの category_id を決定します。 LIMIT 1 では、上位の結果 (平均 price が最も高いカテゴリ) のみが選択され、更新対象の行をフィルター処理するために使用されます。