欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SQL Server的子查詢(xún)?cè)斀?/h1>
 更新時(shí)間:2023年04月12日 11:48:58   作者:Lion Long  
子查詢(xún)是嵌套在SELECT、INSERT、UPDATE、DELETE語(yǔ)句中或另一個(gè)子查詢(xún)中的查詢(xún)??梢栽谠试S表達(dá)式的任何位置使用子查詢(xún),本文介紹了SQL Server的子查詢(xún),需要的朋友可以參考閱讀

一、子查詢(xún)基礎(chǔ)知識(shí)

子查詢(xún)是嵌套在SELECT、INSERT、UPDATE、DELETE語(yǔ)句中或另一個(gè)子查詢(xún)中的查詢(xún)。
可以在允許表達(dá)式的任何位置使用子查詢(xún)。

示例:

USE AdventureWorks2016;
GO
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

子查詢(xún)也稱(chēng)為內(nèi)部查詢(xún)或內(nèi)部選擇,而包含子查詢(xún)的語(yǔ)句也稱(chēng)為外部查詢(xún)或外部選擇。

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

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

USE AdventureWorks2016;
GO

/* SELECT statement built using a subquery. */
SELECT [Name]
FROM Production.Product
WHERE ListPrice =
    (SELECT ListPrice
     FROM Production.Product
     WHERE [Name] = 'Chainring Bolts' );
GO

/* 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 語(yǔ)句中的子查詢(xún)具有以下組件:

  • 包含常規(guī)選擇列表組件的常規(guī)查詢(xún)。
  • 包含一個(gè)或多個(gè)表或視圖名稱(chēng)的常規(guī)子句。
  • 可選:WHERE、GROUP BY、HAVING。

子查詢(xún)的 SELECT 查詢(xún)始終括在括號(hào)中。它不能包含 or 子句,并且只能在還指定 TOP 子句時(shí)才包含子句。

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

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

包含子查詢(xún)的語(yǔ)句通常采用以下格式之一:

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

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

有三種基本類(lèi)型的子查詢(xún):

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

二、子查詢(xún)規(guī)則

  • 使用比較運(yùn)算符引入的子查詢(xún)的選擇列表只能包含一個(gè)表達(dá)式或列名。
  • 如果外部查詢(xún)的子句包含列名,則該子句必須與子查詢(xún)選擇列表中的列連接兼容。
  • ntext、text 和 image 數(shù)據(jù)類(lèi)型不能在子查詢(xún)的選擇列表中使用。
  • 由于它們必須返回單個(gè)值,因此由未修改的比較運(yùn)算符(不后跟關(guān)鍵字或)引入的子查詢(xún)不能包含 and 子句。
  • 關(guān)鍵字不能與包含 的子查詢(xún)一起使用。
  • 不能指定 and 子句。
  • ORDER BY只有在也指定TOP時(shí)才能指定。
  • 無(wú)法使用子查詢(xún)創(chuàng)建的視圖進(jìn)行更新。

三、限定子查詢(xún)中的列名

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

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

一般,語(yǔ)句中的列名由同一級(jí)別的子句中引用的表隱式限定。如果子查詢(xún)子句中引用的表中不存在列,則外部查詢(xún)子句中引用的表將隱式限定該列。

下面是指定這些隱式假設(shè)的查詢(xún)的外觀:

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

顯式聲明表名永遠(yuǎn)不會(huì)錯(cuò),并且始終可以使用顯式限定覆蓋有關(guān)表名的隱式假設(shè)。

四、子查詢(xún)的多層嵌套

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

示例:查詢(xún)查找同時(shí)也是銷(xiāo)售人員的員工的姓名。

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

輸出:

最里面的查詢(xún)返回銷(xiāo)售人員 ID。下一個(gè)更高級(jí)別查詢(xún)使用這些銷(xiāo)售人員 ID 進(jìn)行評(píng)估,并返回員工的聯(lián)系人 ID 號(hào)。最后,外部查詢(xún)使用聯(lián)系人 ID 查找員工的姓名。

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

USE AdventureWorks2016;
GO
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

五、相關(guān)子查詢(xún)

可以通過(guò)執(zhí)行一次子查詢(xún)并將結(jié)果值替換到外部查詢(xún)的子句中來(lái)計(jì)算許多查詢(xún)。在包含相關(guān)子查詢(xún)(也稱(chēng)為重復(fù)子查詢(xún))的查詢(xún)中,子查詢(xún)依賴(lài)于其值的外部查詢(xún)。這意味著子查詢(xún)將重復(fù)執(zhí)行,外部查詢(xún)可能選擇的每一行執(zhí)行一次。

示例:

USE AdventureWorks2016;
GO
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

輸出結(jié)果:

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

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

結(jié)果為 0.00(沒(méi)有收到獎(jiǎng)金,因?yàn)樗麄儾皇卿N(xiāo)售人員),因此外部查詢(xún)的計(jì)算結(jié)果為:

USE AdventureWorks2016;
GO
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,因此 的行不包含在具有相關(guān)子查詢(xún)的上一個(gè)示例查詢(xún)的結(jié)果中。對(duì) 的行執(zhí)行相同的過(guò)程。您將看到此行包含在結(jié)果中,因?yàn)榘Y(jié)果。

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

六、子查詢(xún)類(lèi)型

  • 帶別名。
  • 帶IN或NOT IN。
  • 在UPDATE、DELETE 和 INSERT 語(yǔ)句中。
  • 使用比較運(yùn)算符。
  • 使用 ANY、SOME 或 ALL。
  • 跟 IS [NOT] DISTINCT FROM。
  • 帶 EXISTS或 NOT EXISTS。
  • 代替表達(dá)式。

總結(jié)

如果在子查詢(xún)中引用的列在子查詢(xún)中不存在,但存在于外部查詢(xún)的子句引用的表中,則查詢(xún)將執(zhí)行而不會(huì)出錯(cuò)。SQL Server 使用外部查詢(xún)中的表名隱式限定子查詢(xún)中的列。

到此這篇關(guān)于SQL Server的子查詢(xún)?cè)斀獾奈恼戮徒榻B到這了,更多相關(guān)SQL Server子查詢(xún)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論