跳到主要内容

SQL子查询

SQL子查询(Subquery)是指嵌套在其他SQL查询中的查询。它允许我们在一个查询中使用另一个查询的结果,从而实现更复杂的数据操作。子查询可以出现在 SELECTINSERTUPDATEDELETE 语句中,甚至可以嵌套在其他子查询中。

子查询的基本概念

子查询通常用于以下场景:

  1. 过滤数据:在 WHERE 子句中使用子查询来过滤主查询的结果。
  2. 计算字段:在 SELECT 子句中使用子查询来计算新的字段。
  3. 表连接:在 FROM 子句中使用子查询作为临时表。

子查询可以返回单个值(标量子查询)、单列(列子查询)或多行多列(表子查询)。

备注

子查询必须用括号 () 包裹,并且可以出现在 SQL 语句的多个位置。

子查询的语法

子查询的基本语法如下:

sql
SELECT column1, column2, ...
FROM table_name
WHERE column_name OPERATOR (SELECT column_name FROM table_name WHERE condition);

其中,OPERATOR 可以是比较运算符(如 =>< 等)或逻辑运算符(如 INEXISTS 等)。

子查询的示例

示例 1:在 WHERE 子句中使用子查询

假设我们有两个表:orderscustomers。我们想要查询所有来自特定城市的客户的订单。

sql
SELECT order_id, order_date, amount
FROM orders
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE city = 'New York'
);

输入:

  • orders 表:

    order_idcustomer_idorder_dateamount
    11012023-01-01100
    21022023-01-02200
    31032023-01-03150
  • customers 表:

    customer_idnamecity
    101AliceNew York
    102BobLos Angeles
    103CharlieNew York

输出:

order_idorder_dateamount
12023-01-01100
32023-01-03150

示例 2:在 SELECT 子句中使用子查询

假设我们想要查询每个订单的金额以及该订单所属客户的总订单金额。

sql
SELECT order_id, amount, (
SELECT SUM(amount)
FROM orders
WHERE customer_id = o.customer_id
) AS total_amount
FROM orders o;

输出:

order_idamounttotal_amount
1100250
2200200
3150250
提示

SELECT 子句中使用子查询时,子查询必须返回单个值(标量子查询)。

示例 3:在 FROM 子句中使用子查询

我们可以将子查询的结果作为临时表,然后在主查询中使用它。

sql
SELECT avg_amount
FROM (
SELECT AVG(amount) AS avg_amount
FROM orders
) AS temp_table;

输出:

avg_amount
150

实际应用场景

场景 1:查找高于平均值的订单

假设我们想要查找所有金额高于平均订单金额的订单。

sql
SELECT order_id, amount
FROM orders
WHERE amount > (
SELECT AVG(amount)
FROM orders
);

场景 2:查找没有订单的客户

我们可以使用 NOT EXISTS 来查找没有下过订单的客户。

sql
SELECT customer_id, name
FROM customers c
WHERE NOT EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
);

总结

SQL子查询是一种强大的工具,可以帮助我们在一个查询中嵌套另一个查询,从而实现更复杂的数据操作。通过本文的学习,你应该已经掌握了子查询的基本概念、语法以及实际应用场景。

警告

在使用子查询时,务必注意性能问题。复杂的子查询可能会导致查询性能下降,尤其是在处理大量数据时。

附加资源与练习

  1. 练习:尝试在 UPDATEDELETE 语句中使用子查询。
  2. 深入学习:了解相关子查询(Correlated Subquery)的概念及其应用。
  3. 扩展阅读:学习如何使用 EXISTSNOT EXISTS 进行更复杂的查询。

希望本文能帮助你更好地理解和使用SQL子查询!如果你有任何问题,欢迎在评论区留言讨论。