一、简介
在 SQL 查询语句中,子查询(subquery)是一个查询嵌套在另一个查询中的形式。它们作为表达式出现在主查询的条件或 SELECT 语句中。子查询可以返回单个值、列或结果集。
子查询的使用可以带来更高效的查询结果,因为它们可以限制主查询的结果范围,从而使查询的处理更迅速。
二、WHERE 子句中使用子查询
使用 WHERE 子句中的子查询,可以根据某些条件过滤主查询的结果。例如:
SELECT * FROM orders WHERE customer_id IN
(SELECT id FROM customers WHERE country = 'China');
在上面的例子中,子查询会返回一个包含国家为“China”的客户的 ID 的结果集。这个结果集随后被传递给主查询的 WHERE 子句,查询订单列表中的这些客户。
可以使用多个 WHERE 子句中的子查询实现更复杂的过滤条件:
SELECT * FROM orders WHERE customer_id IN
(SELECT id FROM customers WHERE country = 'China') AND
status = 'shipped';
这个查询将返回中国客户的所有已发货订单。
三、FROM 子句中使用子查询
使用 FROM 子句中的子查询,可以将子查询的结果作为查询中的“虚拟表”。这些表可以用作主查询中的另一个表与之 JOIN 来查询,在实现一些复杂查询时非常有用。例如:
SELECT * FROM
(SELECT customer_id, COUNT(*) total_orders FROM orders GROUP BY customer_id) AS order_totals
LEFT JOIN
(SELECT id, name FROM customers) AS customers
ON order_totals.customer_id = customers.id;
在这个查询中,FROM 子句中的子查询检索并计算每个客户的订单总数。主查询将这个子查询的结果作为表“order_totals”导入,并将其与一个包含所有客户信息的子查询 JOIN 起来,返回所有客户及其订单总数。
四、使用子查询进行插入和更新
子查询还可以在 INSERT 和 UPDATE 语句中使用,以便基于其他数据源更新表中的数据。
例如,下面的查询会向“orders_received_today”表插入今天接收到的订单,并使用子查询检查其他表中是否有该订单:
INSERT INTO orders_received_today (order_id, customer_id, order_date)
SELECT orders.id, orders.customer_id, orders.order_date
FROM orders
WHERE order_date = CURRENT_DATE;
与此类似,可以使用子查询更新表中的数据,在 UPDATE 语句中使用:
UPDATE products SET price = price * 1.1
WHERE id IN
(SELECT product_id FROM product_categories WHERE category = 'Electronics');
在这个例子中,只有 Electronics 类别中的产品的价格会被更新。
五、总结
Subquery 是一种有用的 SQL 技术,可用于在查询中限制结果范围、实现高效的数据过滤、排序和求和,以及在插入和更新操作中基于其他数据源更新表中的数据。它对于 SQL 查询优化和数据处理非常有用。