子查询是另一个SQL查询中的查询,并嵌入在WHERE子句中。
重要规则:
- 子查询可以放在许多SQL子句中,如
WHERE子句,FROM子句,HAVING子句。 - 可以将子查询与
SELECT,UPDATE,INSERT,DELETE语句以及=,<,>,>=,<=,IN,BETWEEN等运算符一起使用。 - 子查询是另一个查询中的查询。外部查询称为主查询,内部查询称为子查询。
- 子查询位于比较运算符的右侧。
- 子查询括在括号中。
- 在子查询中,不能使用
ORDER BY命令。 但GROUP BY命令可用于执行与ORDER BY命令相同的功能。
1.带有Select语句的子查询
SQL子查询最常与Select语句一起使用。
语法
SELECT column_name
FROM table_name
WHERE column_name expression operator
( SELECT column_name from table_name WHERE ... );
示例
假设EMPLOYEE表有以下记录:
| ID | NAME | AGE | ADDRESS | SALARY |
|---|---|---|---|---|
| 1 | John | 20 | US | 2000.00 |
| 2 | Stephan | 26 | Dubai | 1500.00 |
| 3 | David | 27 | Bangkok | 2000.00 |
| 4 | Alina | 29 | UK | 6500.00 |
| 5 | Kathrin | 34 | Bangalore | 8500.00 |
| 6 | Harry | 42 | China | 4500.00 |
| 7 | Jackson | 25 | Mizoram | 10000.00 |
带有SELECT语句的子查询将是:
SELECT *
FROM EMPLOYEE
WHERE ID IN (SELECT ID
FROM EMPLOYEE
WHERE SALARY > 4500);
这将产生以下结果:
| ID | NAME | AGE | ADDRESS | SALARY |
|---|---|---|---|---|
| 4 | Alina | 29 | UK | 6500.00 |
| 5 | Kathrin | 34 | Bangalore | 8500.00 |
| 7 | Jackson | 25 | Mizoram | 10000.00 |
2.带有INSERT语句的子查询
SQL子查询也可以与Insert语句一起使用。 在insert语句中,子查询返回的数据用于插入另一个表。
在子查询中,可以使用任何字符,日期函数修改所选数据。
语法:
INSERT INTO table_name (column1, column2, column3....)
SELECT *
FROM table_name
WHERE VALUE OPERATOR
示例
假设有一个与EMPLOYEE类似的表EMPLOYEE_BKP。现在使用以下语法将完整的EMPLOYEE表复制到EMPLOYEE_BKP表中。
INSERT INTO EMPLOYEE_BKP
SELECT * FROM EMPLOYEE
WHERE ID IN (SELECT ID
FROM EMPLOYEE);
3.带有UPDATE语句的子查询
SQL的子查询可以与Update语句一起使用。 当子查询与Update语句一起使用时,可以更新表中的单个列或多个列。
语法
UPDATE table
SET column_name = new_value
WHERE VALUE OPERATOR
(SELECT COLUMN_NAME
FROM TABLE_NAME
WHERE condition);
示例
假设有一个EMPLOYEE_BKP表,它是EMPLOYEE表的备份。要在EMPLOYEE表中为所有AGE大于或等于29的员工更新SALARY值更新增加 0.25 倍。
UPDATE EMPLOYEE
SET SALARY = SALARY * 0.25
WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP
WHERE AGE >= 29);
上面命令将影响三行,最后,EMPLOYEE表的记录更新为如下。
| ID | NAME | AGE | ADDRESS | SALARY |
|---|---|---|---|---|
| 1 | John | 20 | US | 2000.00 |
| 2 | Stephan | 26 | Dubai | 1500.00 |
| 3 | David | 27 | Bangkok | 2000.00 |
| 4 | Alina | 29 | UK | 1625.00 |
| 5 | Kathrin | 34 | Bangalore | 2125.00 |
| 6 | Harry | 42 | China | 1125.00 |
| 7 | Jackson | 25 | Mizoram | 10000.00 |
4.带有DELETE语句的子查询
SQL的子查询可以与Delete语句一起使用,就像上面提到的任何其他语句一样。
语法
DELETE FROM TABLE_NAME
WHERE VALUE OPERATOR
(SELECT COLUMN_NAME
FROM TABLE_NAME
WHERE condition);
示例
假设有一张EMPLOYEE_BKP表,它是EMPLOYEE表的备份。要从EMPLOYEE表中删除AGE大于或等于29的所有记录。参考以下语句 -
DELETE FROM EMPLOYEE
WHERE AGE IN (SELECT AGE FROM EMPLOYEE_BKP
WHERE AGE >= 29 );
这将影响三行,最后,EMPLOYEE表将具有以下记录。
| ID | NAME | AGE | ADDRESS | SALARY |
|---|---|---|---|---|
| 1 | John | 20 | US | 2000.00 |
| 2 | Stephan | 26 | Dubai | 1500.00 |
| 3 | David | 27 | Bangkok | 2000.00 |
| 7 | Jackson | 25 | Mizoram | 10000.00 |
