跳到主要内容

SQL 子查询

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

什么是子查询?

子查询是一个查询语句,它嵌套在另一个查询语句中。子查询的结果可以作为外部查询的条件、值或表。子查询通常用于以下场景:

  • WHERE 子句中作为条件。
  • SELECT 子句中作为计算字段。
  • FROM 子句中作为临时表。

子查询的基本语法

子查询的基本语法如下:

sql
SELECT column_name(s)
FROM table_name
WHERE column_name OPERATOR (SELECT column_name FROM table_name WHERE condition);

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

子查询的类型

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

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

标量子查询

标量子查询返回单个值,通常用于 WHERE 子句中的条件判断。

示例:

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

在这个例子中,子查询 (SELECT AVG(salary) FROM employees) 返回所有员工的平均工资,外部查询则返回工资高于平均工资的员工姓名和工资。

行子查询

行子查询返回一行数据,通常用于 WHERE 子句中的多条件判断。

示例:

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

在这个例子中,子查询 (SELECT department, MAX(salary) FROM employees GROUP BY department) 返回每个部门的最高工资,外部查询则返回每个部门中工资最高的员工姓名和部门。

列子查询

列子查询返回一列数据,通常用于 INANY 等操作符的条件判断。

示例:

sql
SELECT name
FROM employees
WHERE department IN (SELECT department FROM departments WHERE location = 'New York');

在这个例子中,子查询 (SELECT department FROM departments WHERE location = 'New York') 返回位于纽约的部门名称,外部查询则返回这些部门中的员工姓名。

表子查询

表子查询返回一个表,通常用于 FROM 子句中的临时表。

示例:

sql
SELECT e.name, d.department_name
FROM (SELECT * FROM employees WHERE salary > 50000) AS e
JOIN departments AS d ON e.department_id = d.department_id;

在这个例子中,子查询 (SELECT * FROM employees WHERE salary > 50000) 返回工资大于50000的员工表,外部查询则将这些员工与部门表进行连接,返回员工姓名和部门名称。

实际应用场景

场景1:查找工资高于部门平均工资的员工

sql
SELECT name, salary, department
FROM employees e1
WHERE salary > (SELECT AVG(salary) FROM employees e2 WHERE e2.department = e1.department);

在这个例子中,子查询 (SELECT AVG(salary) FROM employees e2 WHERE e2.department = e1.department) 返回每个部门的平均工资,外部查询则返回工资高于部门平均工资的员工姓名、工资和部门。

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

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

在这个例子中,子查询 (SELECT customer_id FROM orders) 返回所有有订单的客户ID,外部查询则返回没有订单的客户姓名。

总结

SQL子查询是一种强大的工具,可以帮助你编写更复杂和灵活的查询语句。通过嵌套查询,你可以在一个查询中使用另一个查询的结果,从而实现更精细的数据检索和操作。掌握子查询的使用,将大大提升你的SQL技能。

附加资源

练习

  1. 编写一个SQL查询,查找工资高于公司平均工资的员工。
  2. 编写一个SQL查询,查找每个部门中工资最高的员工。
  3. 编写一个SQL查询,查找没有订单的产品。

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