sql语句的`FROM`子句中的句点是什么时候?

时间:2017-05-26 14:33:31

标签: sql

我有这个嵌套的SQL语句:

SELECT 
    SalesOrderID,
    LineTotal,
    (SELECT AVG(LineTotal)
     FROM Sales.SalesOrderDetail) AS AverageLineTotal,
    LineTotal - (SELECT AVG(LineTotal)
                 FROM Sales.SalesOrderDetail) AS Variance
FROM   
    Sales.SalesOrderDetail

Sales.SalesOrderDetail指的是什么?这张表怎么样?

是否有Sales表?

LineTotal - (SELECT AVG(LineTotal)
             FROM Sales.SalesOrderDetail) AS Variance

周围需要括号或不需要括号:

 (LineTotal - (SELECT AVG(LineTotal)
               FROM Sales.SalesOrderDetail)) AS Variance

3 个答案:

答案 0 :(得分:3)

“。”用于分隔不同的元素。

SQL Server中的表名最多包含4个元素:

  • 服务器(您可以在链接的单独服务器上寻址表)
  • 数据库
  • 架构名称
  • 表名称

在您的情况下,您有2个元素 - 架构名称和表名。

模式类似于(一级)文件夹,用于对相应的元素(表,视图,所有内容)进行分组。如果你有一个非平凡的数据库(数百个表),一些组织是好的。例如,此组织还允许您设置架构级别的权限。

您可以在https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql

的文档中阅读有关schemata的更多信息

答案 1 :(得分:0)

SalesOrderDetail是表名,Sales是模式名称(在其下创建SalesOrderDetail)。

销售是架构名称。

LineTotal - (SELECT AVG(LineTotal)                     来自Sales.SalesOrderDetail)AS Variance 将使用括号或不使用括号。两者都会给出相同的结果。

答案 2 :(得分:0)

销售是一种架构,就像dbo一样。

我将Sales.SalesOrderDetail更改为@Sales_SalesOrderDetail只是为了让您更容易理解查询。

下面的子查询将计算LineTotal的平均值

SELECT AVG(LineTotal)FROM @Sales_SalesOrderDetail)

declare @Sales_SalesOrderDetail table (SalesOrderID int identity , LineTotal int) 

insert @Sales_SalesOrderDetail(LineTotal) select 10
insert @Sales_SalesOrderDetail(LineTotal) select 20
insert @Sales_SalesOrderDetail(LineTotal) select 30
insert @Sales_SalesOrderDetail(LineTotal) select 40

SELECT SalesOrderID,
       LineTotal,
       (SELECT AVG(LineTotal)
          FROM   @Sales_SalesOrderDetail) AS AverageLineTotal,
       LineTotal - (SELECT AVG(LineTotal)
                    FROM   @Sales_SalesOrderDetail) AS Variance
FROM   @Sales_SalesOrderDetail

enter image description here

此代码的替代版本是:

declare @Sales_SalesOrderDetail table (SalesOrderID int identity , LineTotal int) 

insert @Sales_SalesOrderDetail(LineTotal) select 10
insert @Sales_SalesOrderDetail(LineTotal) select 20
insert @Sales_SalesOrderDetail(LineTotal) select 30
insert @Sales_SalesOrderDetail(LineTotal) select 40

DECLARE @AverageLineTotal int  = (SELECT AVG(LineTotal) FROM   @Sales_SalesOrderDetail) 


SELECT SalesOrderID,
       LineTotal,
       @AverageLineTotal,
LineTotal - @AverageLineTotal AS Variance


FROM   @Sales_SalesOrderDetail

结果相同,但性能更好,因为AVG只计算一次而不是每一行。