T-SQL 子查询 嵌套查询

2018-12-14 14:50 更新

子查询或内部查询或嵌套查询是另一个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_BKP的表,表结构与CUSTOMERS表相同,并将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表中AGE大于或等于27的所有客户的SALARY乘以0.25。

UPDATE CUSTOMERS 
   SET SALARY = SALARY * 0.25 
   WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >= 27 )

上述命令将产生以下结果集:

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表中所有的年龄大于或等于27的客户的记录。

DELETE FROM CUSTOMERS 
   WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP WHERE AGE >=27 )

上述命令将产生以下结果集:

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 

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号