• 子查询 派生表


    子查询是一个嵌套在 SELECT、INSERT、UPDATE 或 DELETE 语句或其他子查询中的查询。任何允许使用表达式的地方都可以使用子查询。在此示例中,子查询用作 SELECT 语句中名为 MaxUnitPrice 的列表达式。

     
    USE AdventureWorks2008R2;
    GO
    SELECT Ord.SalesOrderID, Ord.OrderDate,
        (SELECT MAX(OrdDet.UnitPrice)
         FROM AdventureWorks.Sales.SalesOrderDetail AS OrdDet
         WHERE Ord.SalesOrderID = OrdDet.SalesOrderID) AS MaxUnitPrice
    FROM AdventureWorks2008R2.Sales.SalesOrderHeader AS Ord
    

    子查询也称为内部查询或内部选择,而包含子查询的语句也称为外部查询或外部选择。

    许多包含子查询的 Transact-SQL 语句都可以改用联接表示。其他问题只能通过子查询提出。在 Transact-SQL 中,包含子查询的语句和语义上等效的不包含子查询的语句在性能上通常没有差别。但是,在一些必须检查存在性的情况中,使用联接会产生更好的性能。否则,为确保消除重复值,必须为外部查询的每个结果都处理嵌套查询。所以在这些情况下,联接方式会产生更好的效果。以下示例显示了返回相同结果集的 SELECT 子查询和 SELECT 联接:

     
    /* SELECT statement built using a subquery. */
    SELECT Name
    FROM AdventureWorks2008R2.Production.Product
    WHERE ListPrice =
        (SELECT ListPrice
         FROM AdventureWorks2008R2.Production.Product
         WHERE Name = 'Chainring Bolts' );
    
    /* SELECT statement built using a join that returns
       the same result set. */
    SELECT Prd1. Name
    FROM AdventureWorks2008R2.Production.Product AS Prd1
         JOIN AdventureWorks2008R2.Production.Product AS Prd2
           ON (Prd1.ListPrice = Prd2.ListPrice)
    WHERE Prd2. Name = 'Chainring Bolts';
    

    嵌套在外部 SELECT 语句中的子查询包括以下组件:

    • 包含常规选择列表组件的常规 SELECT 查询。

    • 包含一个或多个表或视图名称的常规 FROM 子句。

    • 可选的 WHERE 子句。

    • 可选的 GROUP BY 子句。

    • 可选的 HAVING 子句。

    子查询的 SELECT 查询总是使用圆括号括起来。它不能包含 COMPUTE 或 FOR BROWSE 子句,如果同时指定了 TOP 子句,则只能包含 ORDER BY 子句。

    子查询可以嵌套在外部 SELECT、INSERT、UPDATE 或 DELETE 语句的 WHERE 或 HAVING 子句内,也可以嵌套在其他子查询内。尽管根据可用内存和查询中其他表达式的复杂程度的不同,嵌套限制也有所不同,但嵌套到 32 层是可能的。个别查询可能不支持 32 层嵌套。任何可以使用表达式的地方都可以使用子查询,只要它返回的是单个值。

    如果某个表只出现在子查询中,而没有出现在外部查询中,那么该表中的列就无法包含在输出(外部查询的选择列表)中。

    包含子查询的语句通常采用以下格式中的一种:

    • WHERE expression [NOT] IN (subquery)

    • WHERE expression comparison_operator [ANY | ALL] (subquery)

    • WHERE [NOT] EXISTS (subquery)

    派生表是子查询的一种

    派生表是一个查询结果生成的表,类似于临时表。

    派生表可以简化查询,避免使用临时表。相比手动生成临时性能更优越。派生表与其他表一样出现在查询的FROM子句中

    select * from (select * from athors)  temp
    temp 就是派生表
    Every derived table must have its own alias(每个派生表必须有自己的别名)

    派生出来的表必须要是一个有效的表.因此,它必须遵守以下几条规则:

      1. 所有列必须要有名称

      2. 列名称必须是要唯一

      3. 不允许使用ORDER BY(除非指定了TOP)

  • 相关阅读:
    2.5 tensorflow2.3--变量Variable声明和初始化
    2.4 tensorflow 2.3学习--- 矩阵
    2.3 tensorflow 2.3学习--向量
    C++11最新特性总结
    c++多态和虚函数表实现原理
    Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理
    Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理9
    Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理7
    Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理5
    Vue快速学习_第一节
  • 原文地址:https://www.cnblogs.com/javaleon/p/4128568.html
Copyright © 2020-2023  润新知