T-SQL子查询

精华
小牛编辑
172浏览
2023-03-14

子查询与其他 SQL Server 查询一起使用并嵌入 WHERE 子句。子查询用于返回数据,在主问题中用作限制要检索的数据的条件。

子查询与语句 SELECT、INSERT、UPDATE 和 DELETE 一起使用,并带有运算符 =<>>=<=INBETWEEN 等。

子查询遵循的规则很少 -

  • 子查询括在括号中。
  • 子查询包括 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