使用子查询
子查询可以嵌套在 SELECT、FROM、WHERE 和 HAVING 子句中,以实现更复杂的数据检索和分析。在使用子查询时,需要注意以下几点:
- 子查询必须始终放在括号中;
- 子查询可以是标量、列或表子查询;
- 子查询可以使用运算符、聚合函数和其他 SQL 语句;
- 子查询的结果必须与主查询的数据类型兼容。
以下是一些常见的子查询用法示例:
- 在 WHERE 子句中使用子查询
SELECT customer_name, credit_limit
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_date BETWEEN '2022-01-01' AND '2022-12-31');
在这个例子中,子查询 (SELECT customer_id FROM orders WHERE order_date BETWEEN '2022-01-01' AND '2022-12-31') 返回在 2022 年下单的客户 ID,然后将其与客户表进行比较,以获取这些客户的信用限制
- 在 SELECT 子句中使用子查询
SELECT customer_name, (SELECT COUNT(*) FROM orders WHERE customer_id = customers.customer_id) AS order_count
FROM customers;
在这个例子中,子查询 (SELECT COUNT(*) FROM orders WHERE customer_id = customers.customer_id) 返回每个客户的订单数量,然后将其作为别名 order_count 的一部分返回。
- 在 FROM 子句中使用子查询
SELECT c.customer_name, o.order_number, o.order_date
FROM (SELECT customer_id, customer_name FROM customers WHERE country = 'USA') c
JOIN (SELECT order_id, order_number, order_date, customer_id FROM orders) o
ON c.customer_id = o.customer_id;
在这个例子中,子查询 (SELECT customer_id, customer_name FROM customers WHERE country = 'USA') 返回来自美国的客户表的一部分,然后将其与订单表进行连接,以获取来自美国的客户的订单信息。
- 在 HAVING 子句中使用子查询
SELECT category_name, AVG(product_price) AS avg_price
FROM products
JOIN categories
ON products.category_id = categories.category_id
GROUP BY category_name
HAVING AVG(product_price) > (SELECT AVG(product_price) FROM products);
在这个例子中,子查询 (SELECT AVG(product_price) FROM products) 返回产品表中的平均价格,然后将其与每个类别的平均价格进行比较,并将结果过滤为只包含平均价格高于产品表平均价格的类别。