2017-05-26 48 views
-2

我有這樣的嵌套的SQL語句:sql語句的`FROM`子句中的句點是什麼?

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 
+5

'Sales'是模式,'SalesOrderDetail'是表格。架構和表名由句點分隔。 – ollie

+0

單個數據庫可以包含多個模式。這是將表邏輯分組在一起的一種方式。 –

+2

您是在編寫** SQL **(結構化查詢語言)並且真正意味着Microsoft ** SQL Server **(實際產品)嗎?如果是:請添加'sql-server'標籤來清除。如果不是:**數據庫系統是用來做什麼的? –

回答

3

的 「」用於分隔不同的元素。

在SQL Server中的表名稱最多由4個部分組成:

  • 服務器(你可以解決一個協作的獨立服務器上表)
  • 數據庫
  • 架構名稱
  • 表名

就你而言,你有2個元素 - 模式名稱和表名。

模式類似於(一個級別)文件夾,用於對相關元素(表,視圖,所有內容)進行分組。如果你有一個不重要的數據庫(數百個表),一些組織是很好的。例如,該組織還允許您在架構級別設置權限。

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

0

的SalesOrderDetail閱讀更多有關文檔中的圖式是表名,銷售爲模式名(在其下創建的SalesOrderDetail)。

Sales是一個模式名稱。

LineTotal - (SELECT AVG(LineTotal) FROM Sales.SalesOrderDetail)AS Variance 將使用括號或不使用括號。兩者都會得到相同的結果。

0

銷售與dbo一樣也是Schema。

我將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 

結果是s ame,但性能更好,因爲AVG只會計算一次,而不是每行。