T-SQL - 子查询



子查询(也称为内部查询嵌套查询)是在另一个 SQL Server 查询中的查询,并嵌入在 WHERE 子句中。子查询用于返回数据,这些数据将在主查询中用作条件,以进一步限制要检索的数据。

子查询可以与 SELECT、INSERT、UPDATE 和 DELETE 语句一起使用,以及诸如 =、<、>、>=、<=、IN、BETWEEN 等运算符一起使用。

子查询必须遵循一些规则:

  • 必须将子查询括在括号中。

  • 子查询必须包含 SELECT 子句和 FROM 子句。

  • 子查询可以包含可选的 WHERE、GROUP BY 和 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]) 

示例

考虑具有以下记录的 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 

带 INSERT 语句的子查询

子查询也可以与 INSERT 语句一起使用。INSERT 语句使用子查询返回的数据插入到另一个表中。子查询中的选定数据可以使用任何字符、日期或数字函数进行修改。

语法

以下是基本语法。

INSERT INTO table_name [ (column1 [, column2 ]) ] 
   SELECT [ *|column1 [, column2 ] 
   FROM table1 [, table2 ] 
   [ WHERE VALUE OPERATOR ]

示例

考虑一个与 CUSTOMERS 表结构相似的 CUSTOMERS_BKP 表。以下是将完整 CUSTOMERS 表复制到 CUSTOMERS_BKP 的语法。

INSERT INTO CUSTOMERS_BKP 
   SELECT * FROM CUSTOMERS  
   WHERE ID IN (SELECT ID FROM CUSTOMERS)

带 UPDATE 语句的子查询

子查询可以与 UPDATE 语句结合使用。使用子查询与 UPDATE 语句时,可以更新表中的单个列或多个列。

语法

以下是基本语法。

UPDATE table 
SET column_name = new_value 
[ WHERE OPERATOR [ VALUE ] 
   (SELECT COLUMN_NAME 
   FROM TABLE_NAME) 
   [ WHERE) ] 

示例

让我们假设我们有可用的 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 

带 DELETE 语句的子查询

子查询可以与 DELETE 语句结合使用,就像上面提到的任何其他语句一样。

语法

以下是基本语法。

DELETE FROM TABLE_NAME 
[ WHERE OPERATOR [ VALUE ] 
   (SELECT COLUMN_NAME 
   FROM TABLE_NAME) 
   [ WHERE) ] 

示例

让我们假设我们有可用的 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 
广告