久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

SQL?Server子查詢的規(guī)則是什么

175次閱讀
沒有評論

共計 4439 個字符,預計需要花費 12 分鐘才能閱讀完成。

這篇文章主要介紹“SQL Server 子查詢的規(guī)則是什么”的相關知識,丸趣 TV 小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“SQL Server 子查詢的規(guī)則是什么”文章能幫助大家解決問題。

一、子查詢基礎知識

子查詢是嵌套在 SELECT、INSERT、UPDATE、DELETE 語句中或另一個子查詢中的查詢。
可以在允許表達式的任何位置使用子查詢。

示例:

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

子查詢也稱為內(nèi)部查詢或內(nèi)部選擇,而包含子查詢的語句也稱為外部查詢或外部選擇。

許多包含子查詢的 Transact-SQL 語句也可以表述為聯(lián)接。其他問題只能用子查詢提出。在 Transact-SQL 中,包含子查詢的語句與不包含子查詢的語義等效版本之間通常沒有性能差異。但是,在某些必須檢查是否存在的情況下,聯(lián)接會產(chǎn)生更好的性能。否則,必須為外部查詢的每個結果處理嵌套查詢,以確保消除重復項。在這種情況下,聯(lián)接方法將產(chǎn)生更好的結果。

以下示例顯示了返回相同結果集和執(zhí)行計劃的子查詢和聯(lián)接:

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

嵌套在外部 SELECT 語句中的子查詢具有以下組件:

包含常規(guī)選擇列表組件的常規(guī)查詢。

包含一個或多個表或視圖名稱的常規(guī)子句。

可選:WHERE、GROUP BY、HAVING。

子查詢的 SELECT 查詢始終括在括號中。它不能包含 or 子句,并且只能在還指定 TOP 子句時才包含子句。

子查詢可以嵌套在外部 WHERE、HAVING、SELECT、INSERT、UPDATE、DELETE 或語句的 or 子句中,也可以嵌套在另一個子查詢中。最多可以嵌套 32 個級別,但限制因可用內(nèi)存和查詢中其他表達式的復雜性而異。單個查詢可能不支持嵌套多達 32 個級別。如果子查詢返回單個值,則子查詢可以出現(xiàn)在可以使用表達式的任何位置。

如果表僅出現(xiàn)在子查詢中而不出現(xiàn)在外部查詢中,則該表中的列不能包含在輸出(外部查詢的選擇列表)中。

包含子查詢的語句通常采用以下格式之一:

WHERE expression [NOT] IN (subquery)

WHERE expression comparison_operator [ANY | ALL] (subquery)

WHERE [NOT] EXISTS (subquery)

在某些 Transact-SQL 語句中,可以像計算獨立查詢一樣計算子查詢。從概念上講,子查詢結果被替換到外部查詢中(盡管這不一定是 SQL Server 實際處理帶有子查詢的 Transact-SQL 語句的方式)。

有三種基本類型的子查詢:

對引入的列表進行操作,或者比較運算符由 INANY 或 ALL 修改的列表。
使用未修改的比較運算符引入,并且必須返回單個值。
是否使用 EXISTS 引入存在性測試。

二、子查詢規(guī)則

使用比較運算符引入的子查詢的選擇列表只能包含一個表達式或列名。

如果外部查詢的子句包含列名,則該子句必須與子查詢選擇列表中的列連接兼容。

ntext、text 和 image 數(shù)據(jù)類型不能在子查詢的選擇列表中使用。

由于它們必須返回單個值,因此由未修改的比較運算符(不后跟關鍵字或)引入的子查詢不能包含 and 子句。

關鍵字不能與包含 的子查詢一起使用。

不能指定 and 子句。

ORDER BY 只有在也指定 TOP 時才能指定。

無法使用子查詢創(chuàng)建的視圖進行更新。

三、限定子查詢中的列名

示例:外部查詢子句中的 BusinessEntityID 列由外部查詢子句(Sales.Store)中的表名隱式限定。子查詢的選擇列表中對 CustomerID 的引用由子查詢子句(即 Sales.Customer 表)限定。

USE AdventureWorks2016;
SELECT [Name]
FROM Sales.Store
WHERE BusinessEntityID NOT IN
 (SELECT CustomerID
 FROM Sales.Customer
 WHERE TerritoryID = 5);
GO

一般,語句中的列名由同一級別的子句中引用的表隱式限定。如果子查詢子句中引用的表中不存在列,則外部查詢子句中引用的表將隱式限定該列。

下面是指定這些隱式假設的查詢的外觀:

USE AdventureWorks2016;
SELECT [Name]
FROM Sales.Store
WHERE Sales.Store.BusinessEntityID NOT IN
 (SELECT Sales.Customer.CustomerID
 FROM Sales.Customer
 WHERE TerritoryID = 5);
GO

顯式聲明表名永遠不會錯,并且始終可以使用顯式限定覆蓋有關表名的隱式假設。

四、子查詢的多層嵌套

子查詢本身可以包含一個或多個子查詢。任意數(shù)量的子查詢可以嵌套在一個語句中。

示例:查詢查找同時也是銷售人員的員工的姓名。

USE AdventureWorks2016;
SELECT LastName, FirstName
FROM Person.Person
WHERE BusinessEntityID IN
 (SELECT BusinessEntityID
 FROM HumanResources.Employee
 WHERE BusinessEntityID IN
 (SELECT BusinessEntityID
 FROM Sales.SalesPerson)
 );
GO

輸出:

最里面的查詢返回銷售人員 ID。下一個更高級別查詢使用這些銷售人員 ID 進行評估,并返回員工的聯(lián)系人 ID 號。最后,外部查詢使用聯(lián)系人 ID 查找員工的姓名。

還可以將此查詢表示為聯(lián)接:

USE AdventureWorks2016;
SELECT LastName, FirstName
FROM Person.Person c
INNER JOIN HumanResources.Employee e
ON c.BusinessEntityID = e.BusinessEntityID
JOIN Sales.SalesPerson s
ON e.BusinessEntityID = s.BusinessEntityID;
GO

五、相關子查詢

可以通過執(zhí)行一次子查詢并將結果值替換到外部查詢的子句中來計算許多查詢。在包含相關子查詢(也稱為重復子查詢)的查詢中,子查詢依賴于其值的外部查詢。這意味著子查詢將重復執(zhí)行,外部查詢可能選擇的每一行執(zhí)行一次。

示例:

USE AdventureWorks2016;
SELECT DISTINCT c.LastName, c.FirstName, e.BusinessEntityID
FROM Person.Person AS c JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = c.BusinessEntityID
WHERE 5000.00 IN
 (SELECT Bonus
 FROM Sales.SalesPerson sp
 WHERE e.BusinessEntityID = sp.BusinessEntityID) ;
GO

輸出結果:

此語句中的上一個子查詢不能獨立于外部查詢進行計算。它需要 Employee.BusinessEntityID 的值,但此值會隨著 SQL Server 檢查 Employee 中的不同行而更改。這正是計算此查詢的方式:SQL Server 通過將每行中的值替換為內(nèi)部查詢來考慮將 Employee 表的每一行包含在結果中。例如,如果 SQL Server 首先檢查 的行,則變量 Employee.BusinessEntityID 采用值 285,SQL Server 將其替換到內(nèi)部查詢中。這兩個查詢示例表示具有相關子查詢的前一個示例的分解。

USE AdventureWorks2016;
SELECT Bonus
FROM Sales.SalesPerson
WHERE BusinessEntityID = 285;
GO

結果為 0.00(沒有收到獎金,因為他們不是銷售人員),因此外部查詢的計算結果為:

USE AdventureWorks2016;
SELECT LastName, FirstName
FROM Person.Person AS c JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = c.BusinessEntityID
WHERE 5000 IN (0.00);
GO

由于這是 false,因此 的行不包含在具有相關子查詢的上一個示例查詢的結果中。對 的行執(zhí)行相同的過程。您將看到此行包含在結果中,因為包含結果。

小結:相關子查詢還可以通過在外部查詢中引用表中的列作為表值函數(shù)的參數(shù),在子句中包含表值函數(shù)。在這種情況下,對于外部查詢的每一行,將根據(jù)子查詢計算表值函數(shù)。

六、子查詢類型

帶別名。

帶 IN 或 NOT IN。

在 UPDATE、DELETE 和 INSERT 語句中。

使用比較運算符。

使用 ANY、SOME 或 ALL。

跟 IS [NOT] DISTINCT FROM。

帶 EXISTS 或 NOT EXISTS。

代替表達式。

關于“SQL Server 子查詢的規(guī)則是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識,可以關注丸趣 TV 行業(yè)資訊頻道,丸趣 TV 小編每天都會為大家更新不同的知識點。

正文完
 
丸趣
版權聲明:本站原創(chuàng)文章,由 丸趣 2023-07-13發(fā)表,共計4439字。
轉(zhuǎn)載說明:除特殊說明外本站除技術相關以外文章皆由網(wǎng)絡搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 南华县| 天津市| 定边县| 兴宁市| 沁源县| 苍山县| 尼木县| 宝鸡市| 宁明县| 新平| 精河县| 神木县| 萨迦县| 德庆县| 铁岭县| 保亭| 蕲春县| 顺义区| 京山县| 彭水| 和林格尔县| 柘城县| 和田县| 北票市| 义乌市| 屏山县| 青河县| 西乌珠穆沁旗| 额敏县| 北票市| 准格尔旗| 错那县| 四会市| 株洲县| 广水市| 林甸县| 仪征市| 闻喜县| 铜川市| 曲松县| 蓬安县|