跳到主要内容

SQL 子查询过滤

在SQL中,子查询(Subquery)是一个嵌套在其他查询中的查询。子查询可以用于过滤数据、计算值或作为其他查询的一部分。通过子查询,我们可以更灵活地处理复杂的数据过滤需求。本文将详细介绍SQL子查询过滤的概念、语法和实际应用。

什么是子查询?

子查询是一个嵌套在 SELECTINSERTUPDATEDELETE 语句中的查询。它通常用于在主查询中执行一些中间计算或过滤操作。子查询可以返回单个值、单行或多行数据,具体取决于其使用场景。

子查询的基本语法

子查询通常出现在 WHERE 子句中,用于过滤数据。其基本语法如下:

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

其中,OPERATOR 可以是 =><IN 等比较运算符。

子查询的类型

子查询可以分为以下几种类型:

  1. 标量子查询:返回单个值的子查询。
  2. 行子查询:返回单行数据的子查询。
  3. 列子查询:返回单列数据的子查询。
  4. 表子查询:返回多行多列数据的子查询。

标量子查询示例

假设我们有一个 employees 表,其中包含员工的姓名和薪水信息。我们想要查询薪水高于平均薪水的员工:

sql
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

在这个例子中,子查询 (SELECT AVG(salary) FROM employees) 返回一个标量值(平均薪水),主查询使用这个值来过滤出薪水高于平均值的员工。

行子查询示例

假设我们有一个 orders 表,其中包含订单的客户ID和订单金额。我们想要查询与某个特定订单金额相同的订单:

sql
SELECT customer_id, order_amount
FROM orders
WHERE order_amount = (SELECT order_amount FROM orders WHERE order_id = 101);

在这个例子中,子查询 (SELECT order_amount FROM orders WHERE order_id = 101) 返回一个单行数据(订单金额),主查询使用这个值来过滤出金额相同的订单。

列子查询示例

假设我们有一个 products 表,其中包含产品的名称和类别。我们想要查询属于某个特定类别的所有产品:

sql
SELECT name
FROM products
WHERE category_id IN (SELECT category_id FROM categories WHERE category_name = 'Electronics');

在这个例子中,子查询 (SELECT category_id FROM categories WHERE category_name = 'Electronics') 返回一个单列数据(类别ID),主查询使用这个值来过滤出属于该类别的产品。

表子查询示例

假设我们有一个 sales 表,其中包含销售记录。我们想要查询每个销售员的最高销售额:

sql
SELECT salesperson_id, MAX(sales_amount) AS max_sales
FROM (SELECT salesperson_id, sales_amount FROM sales) AS subquery
GROUP BY salesperson_id;

在这个例子中,子查询 (SELECT salesperson_id, sales_amount FROM sales) 返回一个多行多列的数据表,主查询对这个表进行分组和聚合操作。

实际应用场景

场景1:查找薪水最高的员工

假设我们有一个 employees 表,其中包含员工的姓名和薪水信息。我们想要查找薪水最高的员工:

sql
SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);

在这个例子中,子查询 (SELECT MAX(salary) FROM employees) 返回薪水最高的值,主查询使用这个值来过滤出薪水最高的员工。

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

假设我们有一个 customers 表和一个 orders 表。我们想要查找没有下过订单的客户:

sql
SELECT customer_id, name
FROM customers
WHERE customer_id NOT IN (SELECT customer_id FROM orders);

在这个例子中,子查询 (SELECT customer_id FROM orders) 返回所有下过订单的客户ID,主查询使用 NOT IN 来过滤出没有下过订单的客户。

总结

SQL子查询是一种强大的工具,可以帮助我们在复杂的查询中进行数据过滤和计算。通过子查询,我们可以更灵活地处理数据,并实现复杂的查询逻辑。本文介绍了子查询的基本概念、语法和实际应用场景,希望对你理解和使用子查询有所帮助。

附加资源

练习

  1. 编写一个SQL查询,查找薪水高于部门平均薪水的员工。
  2. 编写一个SQL查询,查找订单金额高于平均订单金额的订单。
  3. 编写一个SQL查询,查找没有购买过任何产品的客户。

通过完成这些练习,你将更好地掌握SQL子查询的使用方法。