子查询是 SQL Server 数据库查询中的一种强大工具,它们可以用来执行复杂的数据检索任务。通过合理使用子查询,我们可以实现数据过滤、数据转换以及执行基于数据的逻辑判断。
子查询是 SQL 查询中的一个嵌套查询,它在一个查询语句内部包含另一个查询语句。子查询通常用于返回一个值或一组值,这些值将被主查询用来执行比较或作为数据源。
1. 单行子查询
单行子查询返回单个值,通常用于 WHERE
子句中进行比较。
示例:
SELECT EmployeeID, Name, Salary FROM Employees WHERE Salary > (SELECT MIN(Salary) FROM Employees WHERE Department = 'Sales');
这条查询语句将返回 Employees
表中工资高于 Sales
部门最低工资的所有员工的详细信息。
2. 多行子查询
多行子查询返回一组值,通常与 IN
、ANY
或 ALL
关键字一起使用。
示例:
SELECT EmployeeID, Name, Department FROM Employees WHERE Department IN (SELECT Department FROM Employees WHERE Salary > 50000);
这条查询语句将返回 Employees
表中工资超过 50000 的所有员工的部门。
3. 相关子查询
相关子查询是一种依赖于外部查询的子查询,其结果依赖于外部查询的行。
示例:
SELECT EmployeeID, Name, Department, Salary FROM Employees e WHERE Salary > (SELECT AVG(Salary) FROM Employees WHERE Department = e.Department);
这条查询语句将返回 Employees
表中工资高于其所在部门平均工资的所有员工的详细信息。
4. 存在子查询
存在子查询用于检查子查询是否返回任何行,通常与 EXISTS
关键字一起使用。
示例:
SELECT Department FROM Departments WHERE EXISTS (SELECT * FROM Employees WHERE DepartmentID = Departments.DepartmentID);
这条查询语句将返回有员工存在的所有部门。
5. 非存在子查询
非存在子查询与存在子查询相反,它检查子查询是否没有返回任何行,通常与 NOT EXISTS
关键字一起使用。
示例:
SELECT Department FROM Departments WHERE NOT EXISTS (SELECT * FROM Employees WHERE DepartmentID = Departments.DepartmentID);
这条查询语句将返回没有员工的所有部门。
6. 从子查询
从子查询是从外部查询中派生出的表,通常在 FROM
子句中使用。
示例:
SELECT Department, AVG(Salary) AS AverageSalary FROM (SELECT Department, Salary FROM Employees) AS Emp GROUP BY Department;
这条查询语句将返回每个部门的平均工资,它首先从 Employees
表中派生出一个包含部门和工资的临时表。