跳到主要内容

SQL 不相关子查询

在SQL中,子查询(Subquery)是一个嵌套在其他查询中的查询。子查询可以分为相关子查询不相关子查询。本文将重点介绍不相关子查询,帮助初学者理解其概念、语法和实际应用。

什么是SQL不相关子查询?

不相关子查询是指子查询的执行不依赖于外部查询的结果。换句话说,子查询可以独立运行并返回一个结果集,外部查询再基于这个结果集进行进一步的操作。不相关子查询通常用于过滤、计算或提供外部查询所需的数据。

备注

关键点:不相关子查询可以独立执行,且不依赖于外部查询。

不相关子查询的语法

不相关子查询通常出现在 WHEREHAVINGSELECT 子句中。以下是一个基本语法示例:

sql
SELECT column1, column2
FROM table1
WHERE column1 = (SELECT column1 FROM table2 WHERE condition);

在这个例子中,子查询 (SELECT column1 FROM table2 WHERE condition) 可以独立运行,并返回一个值或一组值,外部查询再基于这个结果进行过滤。

不相关子查询的示例

示例1:使用不相关子查询过滤数据

假设我们有两个表:employeesdepartments。我们想要查询所有在 "Sales" 部门的员工信息。

sql
SELECT employee_id, first_name, last_name
FROM employees
WHERE department_id = (
SELECT department_id
FROM departments
WHERE department_name = 'Sales'
);

输入数据

  • employees 表:

    employee_idfirst_namelast_namedepartment_id
    1JohnDoe1
    2JaneSmith2
    3AliceJohnson1
  • departments 表:

    department_iddepartment_name
    1Sales
    2HR

输出结果

employee_idfirst_namelast_name
1JohnDoe
3AliceJohnson

在这个例子中,子查询 (SELECT department_id FROM departments WHERE department_name = 'Sales') 返回 1,外部查询再基于这个结果过滤出 department_id1 的员工。

示例2:使用不相关子查询计算聚合值

假设我们想要查询所有工资高于平均工资的员工。

sql
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);

输入数据

  • employees 表:
    employee_idfirst_namelast_namesalary
    1JohnDoe5000
    2JaneSmith6000
    3AliceJohnson4500

输出结果

employee_idfirst_namelast_namesalary
2JaneSmith6000

在这个例子中,子查询 (SELECT AVG(salary) FROM employees) 返回 5166.67,外部查询再基于这个结果过滤出工资高于平均工资的员工。

不相关子查询的实际应用场景

不相关子查询在实际应用中非常常见,尤其是在需要基于某些条件过滤数据或计算聚合值时。以下是一些常见的应用场景:

  1. 数据过滤:如示例1所示,使用子查询过滤出符合特定条件的记录。
  2. 聚合计算:如示例2所示,使用子查询计算聚合值(如平均值、最大值、最小值等),并在外部查询中使用这些值。
  3. 数据验证:在插入或更新数据时,使用子查询验证数据的有效性。

总结

不相关子查询是SQL中一个强大的工具,它允许我们在查询中嵌套另一个查询,并且子查询可以独立执行。通过不相关子查询,我们可以轻松地过滤数据、计算聚合值或验证数据的有效性。

提示

提示:在使用不相关子查询时,确保子查询返回的结果是唯一的或与外部查询的条件匹配,否则可能会导致错误。

附加资源与练习

为了巩固你对不相关子查询的理解,建议你尝试以下练习:

  1. 编写一个查询,找出所有工资高于部门平均工资的员工。
  2. 使用不相关子查询,找出所有没有订单的客户。
  3. 尝试在 SELECT 子句中使用不相关子查询,计算每个部门的员工数量。

通过这些练习,你将更好地掌握不相关子查询的使用方法,并能够在实际项目中灵活应用。