SQL 子查询

2024 年 8 月 29 日 | 阅读 6 分钟

子查询或内部查询是嵌套在另一个 SQL 查询中的 SQL 查询。它嵌入在 SQL 语句的 HAVING 或 WHERE 子句中。

以下是 SQL 子查询必须遵循的重要规则

1. SQL 子查询可以与以下语句以及 SQL 表达式运算符一起使用

  • SELECT 语句,
  • UPDATE 语句,
  • INSERT 语句,和
  • DELETE 语句。

2. SQL 中的子查询始终用括号括起来,并放在 SQL 运算符的右侧。

3. 我们不能在子查询中使用 ORDER BY 子句。但是,我们可以使用 GROUP BY 子句,它执行与 ORDER BY 子句相同的功能。

4. 如果子查询返回多个记录,我们必须在子查询前使用多值运算符。

5. 我们可以在子查询中使用 BETWEEN 运算符,但不能与子查询一起使用。

带 SELECT 语句的子查询

在 SQL 中,内部查询或嵌套查询最常与 SELECT 语句一起使用。带 SELECT 语句的子查询的语法在以下块中描述

带 SELECT 语句的子查询示例

示例 1:此示例将大于比较运算符与子查询一起使用。

我们以名为 Student_Details 的表为例,该表包含 Student_RollNo.、Stu_Name、Stu_Marks 和 Stu_City 列。

Student_RollNo.学生姓名 (Stu_Name)学生分数 (Stu_Marks)Stu_City
1001阿希尔 (Akhil)85阿格拉
1002巴尔拉姆 (Balram)78德里
1003Bheem87Gurgaon
1004切坦 (Chetan)95Noida
1005迪克莎 (Diksha)99阿格拉
1006拉曼 (Raman)90Ghaziabad
1007Sheetal68德里

以下 SQL 查询返回那些分数大于总平均分数的学生的记录

输出

Student_RollNo.学生姓名 (Stu_Name)学生分数 (Stu_Marks)Stu_City
1003Bheem87Gurgaon
1004切坦 (Chetan)95Noida
1005迪克莎 (Diksha)99阿格拉
1006拉曼 (Raman)90Ghaziabad

示例 2:此示例将 IN 运算符与子查询一起使用。

我们以 Faculty_DetailsDepartment 这两个表为例。Faculty_Details 表包含教职员工的 ID、姓名、Dept_ID 和地址。而 Department 表包含 Dept_ID、Faculty_ID 和 Dept_Name。

Faculty_ID名称Dept_ID地址
101Bheem1Gurgaon
102切坦 (Chetan)2Noida
103迪克莎 (Diksha)NULL阿格拉
104拉曼 (Raman)4Ghaziabad
105Yatin3Noida
106AnujNULL阿格拉
107Rakes5Gurgaon
Dept_IDFaculty_IDDept_Name
1101BCA
2102B.Tech
3105BBA
4104MBA
5107MCA

输出

Dept_IDFaculty_IDDept_Name
1101BCA
2102B.Tech
3105BBA
5107MCA

带 INSERT 语句的子查询

我们也可以在结构化查询语言的 INSERT 语句中使用子查询和嵌套查询。我们可以将子查询的结果插入到外部查询的表中。带 INSERT 语句的子查询的语法在以下块中描述

带 INSERT 语句的子查询示例

示例 1:此示例使用带 WHERE 子句的子查询将一个表中的记录插入到另一个表中。

我们以 Old_Employee 和 New_Employee 表为例。Old_Employee 和 New_Employee 表包含相同数量的列。但是,两个表包含不同的记录。

Emp_IDEmp_NameEmp_Salary地址
1001阿希尔 (Akhil)50000阿格拉
1002巴尔拉姆 (Balram)25000德里
1003Bheem45000Gurgaon
1004切坦 (Chetan)60000Noida
1005迪克莎 (Diksha)30000阿格拉
1006拉曼 (Raman)50000Ghaziabad
1007Sheetal35000德里

表:Old_Employee

Emp_IDEmp_NameEmp_Salary地址
1008Sumit50000阿格拉
1009Akash55000德里
1010Devansh65000Gurgaon

表:New_Employee

New_Employee 包含新员工的详细信息。如果您想将薪资大于 40000 的员工的详细信息从 Old_Employee 表移动到 New_Employee 表。那么对于这个问题,您需要在 SQL 中键入以下查询

现在,您可以使用以下 SELECT 查询检查更新后的 New_Employee 表的详细信息

输出

Emp_IDEmp_NameEmp_Salary地址
1008Sumit50000阿格拉
1009Akash55000德里
1010Devansh65000Gurgaon
1001阿希尔 (Akhil)50000阿格拉
1003Bheem45000Gurgaon
1004切坦 (Chetan)60000Noida
1006拉曼 (Raman)50000Ghaziabad

表:New_Employee

示例 2:此示例描述了如何在 INSERT 语句中使用 ANY 运算符与子查询。

这里我们使用了 New_Employee、old_Employee 和 Department 表。

New_Employee 表的数据如下图所示

Emp_IDEmp_NameEmp_SalaryDept_ID
1008Sumit50000401

表:New_Employee

old_Employee 表的数据如下表所示

Emp_IDEmp_NameEmp_SalaryDept_ID
1001阿希尔 (Akhil)50000404
1002巴尔拉姆 (Balram)25000403
1003Bheem45000405
1004切坦 (Chetan)60000402
1005Ram65000407
1006Shyam55500NULL
1007Shobhit60000NULL

表:Old_Employee

Department 表的数据如下表所示
Dept_IDDept_NameEmp_ID
401管理1008
402HR1004
403测试1002
404编码1001
405销售1003
406营销NULL
407会计1005

INSERT INTO New_Employee

SELECT * FROM Old_Employee

WHERE Emp_ID = ANY( SELECT Emp_ID FROM Department WHERE Dept_ID = 407 OR Dept_ID = 406 );

现在,使用以下 SELECT 语句检查 New_Employee 表的详细信息

输出

Emp_IDEmp_NameEmp_SalaryDept_ID
1008Sumit50000401
1005Ram65000407

带 UPDATE 语句的子查询

子查询和嵌套查询可以在结构化查询语言的 UPDATE 语句中使用,用于更新现有表的列。我们可以使用带 UPDATE 语句的子查询轻松更新一个或多个列。

带 UPDATE 语句的子查询语法

带 UPDATE 语句的子查询示例

此示例在 UPDATE 语句中使用 IN 运算符与子查询来更新表中的记录。

我们以 Employee_Details 和 Department 表为例。

Employee_Details 表的数据如下表所示

Emp_IDEmp_NameEmp_SalaryDept_ID
1001阿希尔 (Akhil)50000404
1002巴尔拉姆 (Balram)25000403
1003Bheem45000405
1004切坦 (Chetan)60000402
1005Ram65000407
1006Shyam55500NULL
1007Shobhit60000NULL

表:Employee_Details

Department 表的数据如下表所示

Dept_IDDept_NameEmp_IDDept_Grade
401管理1008B
402HR1004A
403测试1002A
404编码1001B
405销售1003A
406营销NULLC
407会计1005A

以下语句更新部门等级为 A 的员工的薪资

以下查询将在输出中显示 Employee_Details 表的更新数据

输出

Emp_IDEmp_NameEmp_SalaryDept_ID
1001阿希尔 (Akhil)50000404
1002巴尔拉姆 (Balram)30000403
1003Bheem50000405
1004切坦 (Chetan)65000402
1005Ram70000407
1006Shyam55500NULL
1007Shobhit60000NULL

表:Employee_Details

带 DELETE 语句的子查询

我们可以使用结构化查询语言的 DELETE 语句中的子查询轻松地从 SQL 表中删除一条或多条记录。

带 DELETE 语句的子查询语法

带 DELETE 语句的子查询示例

此示例在 DELETE 语句中使用 IN 运算符与子查询从表中删除记录。

我们以 Employee_Details 和 Department 表为例。

Employee_Details 表的数据如下表所示

Emp_IDEmp_NameEmp_SalaryDept_ID
1001阿希尔 (Akhil)50000404
1002巴尔拉姆 (Balram)25000403
1003Bheem45000405
1004切坦 (Chetan)60000402
1005Ram65000407
1006Shyam55500NULL
1007Shobhit60000NULL
1008Ankit48000401

表:Employee_Details

Department 表的数据如下表所示

Dept_IDDept_NameEmp_IDDept_Grade
401管理1008C
402HR1004A
403测试1002C
404编码1001B
405销售1003A
406营销NULLC
407会计1005C

以下查询从 Employee_Details 中删除部门等级为 C 的员工的记录

以下查询将在输出中显示 Employee_Details 表的更新数据

输出

Emp_IDEmp_NameEmp_SalaryDept_ID
1001阿希尔 (Akhil)50000404
1003Bheem45000405
1004切坦 (Chetan)60000402
1006Shyam55500NULL
1007Shobhit60000NULL

表:Employee_Details


下一个主题SQL 视图