📜  SQL-子查询(1)

📅  最后修改于: 2023-12-03 15:05:19.492000             🧑  作者: Mango

SQL-子查询

在 SQL 中,子查询也称为嵌套查询,是指在一个外层查询中嵌套了另一个查询语句。

子查询就是在查询的基础上,再次进行查询,获取更精确、更详细的结果。

子查询的作用

子查询的作用是通过 SELECT 语句嵌套 SELECT 语句,实现更复杂的查询语句,提供更多的查询条件,使查询结果更加精确,提高查询效率。

子查询可以用于以下场景:

  • 在 WHERE 子句中使用子查询,过滤数据
  • 在 SELECT 语句中使用子查询,统计数据
  • 在 FROM 子句中使用子查询,生成虚拟表格
  • 在 UPDATE 和 DELETE 语句中使用子查询,更新或删除数据
子查询的语法

子查询的语法可以嵌套多次,但是不要超过三层嵌套,因为过多的嵌套可能会导致查询效率降低。

子查询的基本语法如下:

SELECT column_name
FROM table_name
WHERE column_name operator (SELECT column_name FROM table_name WHERE condition);

例如,在 Employee 表中查询薪水高于平均薪水的员工姓名:

SELECT EmployeeName 
FROM Employee
WHERE Salary > (SELECT AVG(Salary) FROM Employee);
子查询的注意事项

在使用子查询时,需要特别注意以下事项:

  • 子查询必须位于括号内
  • 子查询的结果必须与主查询可以进行比较的列进行比较
  • 子查询返回的结果必须是单行单列,即只能返回一个值
  • 子查询不能使用 ORDER BY 语句
子查询的示例

假设有以下几张表:

  • Employee 表

| EmployeeID | EmployeeName | Salary | |------------|--------------|---------| | 1 | Tom | 5000 | | 2 | Jack | 4000 | | 3 | Lucy | 6000 | | 4 | Lily | 7000 | | 5 | Sam | 4500 |

  • Department 表

| DepartmentID | DepartmentName | |--------------|----------------| | 1 | HR | | 2 | Finance | | 3 | IT | | 4 | Sales | | 5 | Marketing |

  • EmployeeDepartment 表

| EmployeeDepartmentID | EmployeeID | DepartmentID | |----------------------|------------|--------------| | 1 | 1 | 1 | | 2 | 1 | 2 | | 3 | 2 | 2 | | 4 | 3 | 3 | | 5 | 4 | 4 | | 6 | 5 | 5 |

使用子查询获取部门名称

如果想查询员工所在的部门名称,可以使用子查询:

SELECT EmployeeName, 
       (SELECT DepartmentName 
        FROM Department 
        WHERE DepartmentID = EmployeeDepartment.DepartmentID) AS DepartmentName
FROM EmployeeDepartment 
INNER JOIN Employee ON Employee.EmployeeID = EmployeeDepartment.EmployeeID;
使用子查询获取部门薪水总和

如果想查询每个部门的薪水总和,可以使用子查询:

SELECT DepartmentName, 
       (SELECT SUM(Salary) 
        FROM EmployeeDepartment 
        INNER JOIN Employee ON Employee.EmployeeID = EmployeeDepartment.EmployeeID 
        WHERE EmployeeDepartment.DepartmentID = Department.DepartmentID) AS SalaryTotal
FROM Department;
小结

通过子查询,我们可以在一个 SELECT 语句中嵌套另一个 SELECT 语句,获取更加精确、详细的查询结果,以达到更高效的数据分析和处理的目的。在使用子查询时,需要注意一些语法和使用技巧,同时不能忽略查询效率和性能问题。