T-SQL子查询
精华
小牛编辑
168浏览
2023-03-14
子查询与其他 SQL Server 查询一起使用并嵌入 WHERE 子句。子查询用于返回数据,在主问题中用作限制要检索的数据的条件。
子查询与语句 SELECT、INSERT、UPDATE 和 DELETE 一起使用,并带有运算符 =
、<
、>
、>=
、<=
、IN
和 BETWEEN
等。
子查询遵循的规则很少 -
- 子查询括在括号中。
- 子查询包括 FROM 子句和 SELECT 子句。
- 子查询中还使用了可选的 GROUP BY、WHERE 和 HAVING 子句。
- 子查询不包括 COMPUTE 和 FOR BROWSE 子句。
- 当包含 TOP 关键字/术语时,包含 ORDER BY 子句。
- 最多可有 32 个子查询
带有 SELECT 语句的子查询
子查询与 SELECT 语句一起使用,语法如下 -
SELECT column_name [, column_name]
FROM table1 [, table2]
WHERE column_name OPERATOR
(SELECT column_name [, column_name]
FROM table1 [, table2]
[WHERE])
示例
假设 EMPLOYEES 表有以下记录 -
ID NAME AGE ADDRESS SALARY
1 Hamilton 23 Australia 34000
2 Warner 34 England 22000
3 Martin 28 China 25000
4 Twinkle 30 Turkey 50000
5 Tinu 32 Nepal 45000
6 Michal 31 Bhutan 20000
7 Harper 20 Bangladesh 15000
执行下面 SELECT 语句应用子查询 -
SELECT * FROM EMPLOYEES
WHERE ID IN (SELECT ID FROM CUSTOMER WHERE SALARY > 45000)
得到以下结果 -
ID NAME AGE ADDRESS SALARY
1 Hamilton 23 Australia 34000
4 Twinkle 30 Turkey 50000
5 Tinu 32 Nepal 45000
带有 INSERT 语句的子查询
子查询可以与 INSERT 语句一起使用。子查询选中的数据可以修改字符、数字或日期功能。
INSERT 语句的语法是:
INSERT INTO table_name [ (column1 [, column2 ]) ]
SELECT [ *|column1 [ column2 ]
FROM table1 [table2 ]
[ WHERE VALUE OPERATOR ]
示例
下面语句用于将完整的 EMPLOYEES 表复制到 EMPLOYEES_BKP 中。
INSERT INTO EMPLOYEES_BKP
SELECT * FROM EMPLOYEES
WHERE ID IN (SELECT ID FROM EMPLOYEES)
带有 UPDATE 语句的子查询
当我们使用带有 UPDATE 语句单列或多列的子查询时,子查询与 UPDATE 语句结合使用。
语法
UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
例子
以下命令将 AGE> =31 的 EMPLOYEES 的 SALARY 更新为 EMPLOYEES 表的 0.25 倍。
UPDATE EMPLOYEES
SET SALARY = SALARY * 0.35
WHERE AGE IN (SELECT AGE FROM EMPLOYEES_BKP WHERE AGE >= 31 )
执行上面语句,得到以下结果 -
ID NAME AGE ADDRESS SALARY
1 Hamilton 23 Australia 34000
2 Warner 34 England 22000
3 Martin 28 China 25000
4 Twinkle 30 Turkey 50000
5 Tinu 32 Nepal 45000
6 Michal 31 Bhutan 20000
7 Harper 20 Bangladesh 15000
带有 DELETE 语句的子查询
子查询与 DELETE 语句结合使用,以及上面生成的其他注释。语法如下所示 -
DELETE FROM TABLE_NAME
[WHERE OPERATOR [VALUE] (SELECT COLUMN_NAME FROM TABLE_NAME)
[ WHERE) ]
例子:
查询删除表 EMPLOYEES 中 AGE 大于等于 31 的记录。
DELETE FROM EMPLOYEES
WHERE AGE IN (SELECT AGE FROM EMPLOYEES_BKP WHERE AGE >=31)
它将删除两行,EMPLOYEES 表当前有以下记录 -
ID NAME AGE ADDRESS SALARY
1 Hamilton 23 Australia 34000
3 Martin 28 China 25000
4 Twinkle 30 Turkey 50000
7 Harper 20 Bangladesh 15000