T Sql 简明教程
T-SQL - Sub-Queries
sub-query 、 Inner query 或 Nested query 是另一个 SQL Server 查询内的一个查询,并且嵌入在 WHERE 子句中。子查询用于返回将用作主查询中一个条件的数据,以便进一步限制要检索的数据。
子查询可与 SELECT、INSERT、UPDATE 和 DELETE 语句以及 =、<、>、>=、⇐、IN、BETWEEN 等运算符搭配使用。
子查询必须遵循一些规则:
-
必须在括号中将子查询括起来。
-
子查询必须包括一个 SELECT 子句和一个 FROM 子句。
-
子查询可以包含可选的 WHERE、GROUP BY 和 HAVING 子句。
-
子查询不能包含 COMPUTE 或 FOR BROWSE 子句。
-
只有在包含 TOP 子句时,才可包含 ORDER BY 子句。
-
可以最多将子查询嵌套 32 层。
Subqueries with SELECT Statement
Syntax
子查询最常与 SELECT 语句一起使用。以下是基本语法。
SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE column_name OPERATOR
(SELECT column_name [, column_name ]
FROM table1 [, table2 ]
[WHERE])
Example
可以将 CUSTOMERS 表视为包含以下记录。
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
让我们对 SELECT 语句应用以下子查询。
SELECT *
FROM CUSTOMERS
WHERE ID IN (SELECT ID FROM CUSTOMERS WHERE SALARY > 4500)
以上命令将生成以下输出。
ID NAME AGE ADDRESS SALARY
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 8500.00
7 Muffy 24 Indore 10000.00
Subqueries with INSERT Statement
子查询还可以与 INSERT 语句一起使用。INSERT 语句使用从子查询返回的数据插入另一个表。子查询中所选的数据可以使用任何字符、日期或数字函数进行修改。
Subqueries with UPDATE Statement
子查询可以与 UPDATE 语句联合使用。在使用 UPDATE 语句与子查询时,可以更新表中的单个或多个列。
Syntax
以下是基本语法。
UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
Example
我们假设我们有可用的是 CUSTOMERS_BKP 表,它是 CUSTOMERS 表的备份。
以下命令示例将对 CUSTOMERS 表中所有年龄大于或等于 27 的客户更新 SALARY,更新幅度为 0.25 倍。
UPDATE CUSTOMERS
SET SALARY = SALARY * 0.25
WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 27 )
这将影响两行,并且最终 CUSTOMERS 表将拥有以下记录。
ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 500.00
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
5 Hardik 27 Bhopal 2125.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00
Subqueries with DELETE Statement
与上面提到的其他任何语句一样,子查询可与 DELETE 语句一起使用。
Syntax
以下是基本语法。
DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
Example
我们假设我们有可用的是 CUSTOMERS_BKP 表,它是 CUSTOMERS 表的备份。
以下命令示例将删除 CUSTOMERS 表中所有年龄大于或等于 27 的客户的记录。
DELETE FROM CUSTOMERS
WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >=27 )
这将影响两行,并且最终 CUSTOMERS 表将拥有以下记录。
ID NAME AGE ADDRESS SALARY
2 Khilan 25 Delhi 1500.00
3 kaushik 23 Kota 2000.00
4 Chaitali 25 Mumbai 6500.00
6 Komal 22 MP 4500.00
7 Muffy 24 Indore 10000.00