子查詢
通常,您必須根據衍生自資料庫中數據的條件擷取數據。
子查詢可讓您執行這項操作,方法是讓您將一個語句的結果作為另一個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子查詢,從price數據表中選取 AVG(price) 來計算平均值sales.products。 接著,此子查詢的結果會與 price 外部查詢中的數據行進行比較,以篩選並只顯示價格超過此計算平均值的產品。
SELECT customer_id, customer_name
FROM sales.customers
WHERE customer_id IN (
SELECT DISTINCT customer_id
FROM sales.orders
);
此查詢會從sales.customers表格中查詢至少有一筆訂單的客戶的標識碼和名稱。 它會使用 子句內的 WHERE 子查詢來達成此目的。 子查詢會從customer_id數據表中選取不同的sales.orders值,代表已發出任何訂單的客戶。 然後,外部查詢會使用這些標識符來篩選和顯示客戶資訊,確保結果中只會包含與訂單相關聯的客戶。
SELECT supplier_id, AVG (price) AS avg_price
FROM (
SELECT supplier_id, price
FROM sales.products
) AS product_prices
GROUP BY supplier_id;
此查詢會計算每個供應商的平均產品價格。 它會使用 子句中的FROM子查詢,從supplier_id中選取 sales.products table 和 價格。 然後,外部查詢會依據 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 語句會修改資料表 price 中的欄位 sales.products,對符合 WHERE 條件的列以 1.1 倍進行乘算。
子句內的WHERE子查詢將決定具有最高平均category_id的類別的price,藉由依產品category_id分組,計算每個群組的平均值price,並以平均price遞減順序排列。 LIMIT 1 可確保只會選取熱門搜尋結果 (即平均 price 最高的類別),並將其用來篩選要更新的資料列。