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 表中所有 AGE 大于或等于 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 表中删除 AGE 大于或等于 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