子查询
通常,需要根据从数据库中的数据派生的条件来检索数据。
通过子查询,可以将一个 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 表中检索至少下了一个订单的客户的 ID 和姓名。 它通过使用 WHERE 子句中的子查询来实现此目的。 子查询从 sales.orders 表中选择非重复 customer_id 值,表示已提交任何订单的客户。 然后,外部查询使用这些 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 列,将其乘以 1.1,表示与 WHERE 子句中的条件匹配的行。
WHERE 子句中的子查询通过按 category_id、计算每个组的平均值 price 以及按平均值 price 降序对产品进行分组来确定带有最高平均 price 的类别的 category_id。 LIMIT 1 确保仅选择最上面的结果(即具有最高平均值 price 的类别)并用于筛选更新的行。