日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

SQL Server的子查詢詳解

瀏覽:139日期:2023-05-02 10:03:27
目錄
  • 一、子查詢基礎知識
  • 二、子查詢規則
  • 三、限定子查詢中的列名
  • 四、子查詢的多層嵌套
  • 五、相關子查詢
  • 六、子查詢類型
  • 總結

一、子查詢基礎知識

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

示例:

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

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

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

以下示例顯示了返回相同結果集和執行計劃的子查詢和聯接:

USE AdventureWorks2016;GO/* SELECT statement built using a subquery. */SELECT [Name]FROM Production.ProductWHERE 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 語句中的子查詢具有以下組件:

  • 包含常規選擇列表組件的常規查詢。
  • 包含一個或多個表或視圖名稱的常規子句。
  • 可選:WHERE、GROUP BY、HAVING。

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

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

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

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

  • 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引入存在性測試。

二、子查詢規則

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

三、限定子查詢中的列名

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

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

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

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

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

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

四、子查詢的多層嵌套

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

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

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

輸出:

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

還可以將此查詢表示為聯接:

USE AdventureWorks2016;GOSELECT LastName, FirstNameFROM Person.Person cINNER JOIN HumanResources.Employee eON c.BusinessEntityID = e.BusinessEntityIDJOIN Sales.SalesPerson sON e.BusinessEntityID = s.BusinessEntityID;GO

五、相關子查詢

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

示例:

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

輸出結果:

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

USE AdventureWorks2016;GOSELECT BonusFROM Sales.SalesPersonWHERE BusinessEntityID = 285;GO

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

USE AdventureWorks2016;GOSELECT LastName, FirstNameFROM Person.Person AS c JOIN HumanResources.Employee AS eON e.BusinessEntityID = c.BusinessEntityIDWHERE 5000 IN (0.00);GO

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

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

六、子查詢類型

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

總結

如果在子查詢中引用的列在子查詢中不存在,但存在于外部查詢的子句引用的表中,則查詢將執行而不會出錯。SQL Server 使用外部查詢中的表名隱式限定子查詢中的列。

到此這篇關于SQL Server的子查詢詳解的文章就介紹到這了,更多相關SQL Server子查詢內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: MsSQL
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
奶水喷射视频一区| 亚洲精品日本| 国产日韩亚洲| 蜜臀久久99精品久久久画质超高清 | 国产激情精品一区二区三区| 日韩激情啪啪| 日韩精品午夜视频| 日韩精品福利一区二区三区| 亚洲精品成人一区| 亚洲欧洲日韩精品在线| 亚洲永久精品唐人导航网址| 在线综合视频| 亚洲欧美网站| 免费人成在线不卡| 亚洲精品麻豆| 欧美在线观看天堂一区二区三区| 7777精品| 国产剧情一区二区在线观看| 欧美日一区二区三区在线观看国产免 | 国产精品调教| 国产精品亚洲综合久久| 国产精品毛片久久久| 麻豆精品新av中文字幕| 国产va免费精品观看精品视频| 9999国产精品| 日韩高清成人| 欧美成人久久| 免费在线视频一区| 日韩一区二区三区在线看| 日韩国产在线观看一区| 日韩av影院| 国产精品a久久久久| 精品亚洲精品| 色婷婷久久久| 欧美日韩国产免费观看| 99国产精品私拍| 蜜桃久久av| 日本不卡的三区四区五区| 国产精品片aa在线观看| 精品三区视频| 精品国模一区二区三区| 国产综合婷婷| 中文一区一区三区免费在线观| 日韩av在线免费观看不卡| 久久一区精品| 毛片在线网站| 亚洲激情婷婷| 日本va欧美va精品发布| 精品欧美日韩精品| 美女久久久久| 91av一区| 日韩精品永久网址| 香蕉久久国产| 国产精品伦一区二区| а√在线中文在线新版| 久久午夜影视| 国产日韩亚洲| 国产一级久久| 视频一区视频二区在线观看| 日韩欧美美女在线观看| 日韩精彩视频在线观看| 日产午夜精品一线二线三线| 欧美美女一区| 久久久久久色 | 成人av三级| 日韩在线短视频| 亚洲精品在线二区| 日韩精品永久网址| 日韩欧美中文字幕在线视频| 麻豆久久久久久久| 在线综合视频| 成人国产精选| 精品视频一区二区三区在线观看| 亚洲欧美日韩一区在线观看| 粉嫩av一区二区三区四区五区 | 亚洲三级在线| 日韩综合在线| 日韩**一区毛片| 天堂网av成人| 久久国产尿小便嘘嘘| 久久久精品午夜少妇| 欧美午夜三级| 国产综合亚洲精品一区二| 国产精久久久| 免费精品视频在线| 日韩国产一区二区| 国产亚洲精品美女久久| 九一成人免费视频| 国产一区二区三区四区五区 | 日韩成人亚洲| 国产视频网站一区二区三区| 免费久久精品| 成人在线观看免费视频| 日本vs亚洲vs韩国一区三区二区| 亚洲激情av| 久久三级福利| 久久久免费人体| 亚洲毛片一区| 女人av一区| 91一区二区三区四区| 日本成人在线不卡视频| 一区在线观看| 色吊丝一区二区| 久久久久亚洲精品中文字幕| 午夜a一级毛片亚洲欧洲| 激情五月综合网| 久久伊人亚洲| 国产色噜噜噜91在线精品| 在线免费观看亚洲| 亚洲国产影院| 日韩一区欧美| 国产不卡av一区二区| 免费一级欧美片在线观看网站 | 999国产精品永久免费视频app| 久久亚洲国产精品尤物| 国产精品自拍区| 香蕉久久一区| 免费在线观看不卡| 伊人影院久久| 欧美~级网站不卡| 日韩成人精品一区| 成人午夜在线| 国产不卡av一区二区| 久久精品福利| 麻豆精品久久久| 国产精品一区2区3区| 欧美日韩午夜电影网| 日韩精品免费一区二区夜夜嗨 | 亚洲女同av| 国产在线观看www| 手机在线电影一区| 国产精品sm| 国产精品探花在线观看| 国产三级精品三级在线观看国产| 欧美亚洲国产日韩| 国产精品第一国产精品| 国产欧美综合一区二区三区| 日本一区二区三区视频在线看| 日韩高清在线观看一区二区| 91午夜精品| 国产精品一级| 精品一区二区三区四区五区| 国产一区二区三区四区大秀| 国产91欧美| 超碰99在线| 日韩不卡视频在线观看| 日韩免费久久| 欧美日韩一二三四| 国产亚洲高清视频| 亚洲精品乱码日韩| 国产精品4hu.www| a日韩av网址| 婷婷成人综合| 免费在线成人网| 欧美日韩亚洲国产精品| 久久男人av| 久久中文字幕av| 免费成人av在线播放| 国产女人18毛片水真多18精品| 美女尤物国产一区| 久久久成人网| 国产亚洲永久域名| 日韩va亚洲va欧美va久久| 麻豆久久久久久| 1024精品一区二区三区| 中文字幕亚洲在线观看| 欧美日本久久| 亚洲精品88| 丝袜国产日韩另类美女| 国产欧美午夜| av在线日韩| 亚洲一区二区三区四区电影| 国产精品伦一区二区| 久久蜜桃精品| 亚洲欧美在线综合| 精品成人18| 九色精品91| 国产日产高清欧美一区二区三区| а√在线中文在线新版| 91久久亚洲| 国产欧美一区二区精品久久久 | 91精品国产福利在线观看麻豆| 快she精品国产999| 麻豆一区在线| 国产视频亚洲| 久久永久免费| 在线综合欧美| 欧美国产极品| 欧美精品一区二区三区精品| 国产亚洲久久| 亚洲特级毛片| 日韩不卡在线观看日韩不卡视频| 日韩深夜视频| 视频国产精品| 免费看av不卡| 日韩三级一区| 久久国产日韩| 欧美日韩亚洲一区| 亚洲二区三区不卡| 国产精品久久乐|