电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

SQL Server的子查詢?cè)斀?/h1>
瀏覽:8日期:2023-05-02 10:03:27
目錄
  • 一、子查詢基礎(chǔ)知識(shí)
  • 二、子查詢規(guī)則
  • 三、限定子查詢中的列名
  • 四、子查詢的多層嵌套
  • 五、相關(guān)子查詢
  • 六、子查詢類型
  • 總結(jié)

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

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

示例:

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

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

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

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

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 語句中的子查詢具有以下組件:

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

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

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

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

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

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

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

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

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

二、子查詢規(guī)則

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

三、限定子查詢中的列名

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

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

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

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

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

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

四、子查詢的多層嵌套

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

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

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

輸出:

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

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

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

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

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

示例:

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

輸出結(jié)果:

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

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

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

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

由于這是 false,因此 的行不包含在具有相關(guān)子查詢的上一個(gè)示例查詢的結(jié)果中。對(duì) 的行執(zhí)行相同的過程。您將看到此行包含在結(jié)果中,因?yàn)榘Y(jié)果。

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

六、子查詢類型

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

總結(jié)

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

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

標(biāo)簽: MsSQL

主站蜘蛛池模板: 阴离子_阳离子聚丙烯酰胺厂家_聚合氯化铝价格_水处理絮凝剂_巩义市江源净水材料有限公司 | 英思科GTD-3000EX(美国英思科气体检测仪MX4MX6)百科-北京嘉华众信科技有限公司 | 安徽成考网-安徽成人高考网| 电伴热系统施工_仪表电伴热保温箱厂家_沃安电伴热管缆工业技术(济南)有限公司 | NBA直播_NBA直播免费观看直播在线_NBA直播免费高清无插件在线观看-24直播网 | 网站建设-高端品牌网站设计制作一站式定制_杭州APP/微信小程序开发运营-鼎易科技 | 等离子空气净化器_医用空气消毒机_空气净化消毒机_中央家用新风系统厂家_利安达官网 | 手板-手板模型-手板厂-手板加工-生产厂家,[东莞创域模型] | PVC快速门-硬质快速门-洁净室快速门品牌厂家-苏州西朗门业 | 石家庄救护车出租_重症转院_跨省跨境医疗转送_活动赛事医疗保障_康复出院_放弃治疗_腾康26年医疗护送转诊团队 | 一体化隔油提升设备-餐饮油水分离器-餐厨垃圾处理设备-隔油池-盐城金球环保产业发展有限公司 | 步进_伺服_行星减速机,微型直流电机,大功率直流电机-淄博冠意传动机械 | 称重传感器,测力传感器,拉压力传感器,压力变送器,扭矩传感器,南京凯基特电气有限公司 | 私人别墅家庭影院系统_家庭影院音响_家庭影院装修设计公司-邦牛影音 | 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 山东风淋室_201/304不锈钢风淋室净化设备厂家-盛之源风淋室厂家 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | 葡萄酒灌装机-食用油灌装机-液体肥灌装设备厂家_青州惠联灌装机械 | 沥青灌缝机_路面灌缝机_道路灌缝机_沥青灌缝机厂家_济宁萨奥机械有限公司 | 层流手术室净化装修-检验科ICU改造施工-华锐净化工程-特殊科室建设厂家 | 品牌策划-品牌设计-济南之式传媒广告有限公司官网-提供品牌整合丨影视创意丨公关活动丨数字营销丨自媒体运营丨数字营销 | 塑胶跑道施工-硅pu篮球场施工-塑胶网球场建造-丙烯酸球场材料厂家-奥茵 | 实战IT培训机构_IT培训班选大学生IT技术培训中心_中公优就业 | 油液红外光谱仪-油液监测系统-燃油嗅探仪-上海冉超光电科技有限公司 | 2025福建平潭岛旅游攻略|蓝眼泪,景点,住宿攻略-趣平潭网 | 广州活动策划公司-15+年专业大型公关活动策划执行管理经验-睿阳广告 | 活性炭厂家-蜂窝活性炭-粉状/柱状/果壳/椰壳活性炭-大千净化-活性炭 | 变压器配件,变压器吸湿器,武强县吉口变压器配件有限公司 | 山东柳店新能源科技有限公司| 铣刨料沥青破碎机-沥青再生料设备-RAP热再生混合料破碎筛分设备 -江苏锡宝重工 | 电位器_轻触开关_USB连接器_广东精密龙电子科技有限公司 | 深圳彩钢板_彩钢瓦_岩棉板_夹芯板_防火复合彩钢板_长鑫 | 精密钢管,冷拔精密无缝钢管,精密钢管厂,精密钢管制造厂家,精密钢管生产厂家,山东精密钢管厂家 | 单柱拉力机-橡胶冲片机-哑铃裁刀-江都轩宇试验机械厂 | 青岛空压机,青岛空压机维修/保养,青岛空压机销售/出租公司,青岛空压机厂家电话 | 粉末包装机-给袋式包装机-全自动包装机-颗粒-液体-食品-酱腌菜包装机生产线【润立机械】 | 实验室pH计|电导率仪|溶解氧测定仪|离子浓度计|多参数水质分析仪|pH电极-上海般特仪器有限公司 | 无锡门窗-系统门窗-阳光房-封阳台-断桥铝门窗厂[窗致美] | 披萨石_披萨盘_电器家电隔热绵加工定制_佛山市南海区西樵南方综合保温材料厂 | 玻璃钢罐_玻璃钢储罐_盐酸罐厂家-河北华盛节能设备有限公司 | 长沙网站建设制作「网站优化推广」-网页设计公司-速马科技官网 | 磨煤机配件-高铬辊套-高铬衬板-立磨辊套-盐山县宏润电力设备有限公司 |