




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
相关子查询 与非相关子查询1:标量子查询(相对于多值子查询):只有标量子查询返回的是单个记录或者不返回,就是有效的子查询。Ex1:select OrderId From Orders where EmployeeId=(select EmployeeId From employees where lastName like NDavolio)将Davolio改为D%时,这个时候子查询中返回结果为2行,等号右边此时为多值,查询失败.将=改为in谓词.查询才能通过.employees表中无lastname=jason,外部查询将返回null.2:非相关子查询(嵌套子查询)一个select.From.Where查询语句块可以嵌套在另一个select.From.Where查询块的Where子句中,称为嵌套查询。外层查询称为父查询,主查询。内层查询称为子查询,从查询。子查询可以嵌套多层,子查询查询到的结果又成为父查询的条件。子查询中不能有order by分组语句。先处理子查询,再处理父查询。 细分如下:1。 简单嵌套查询 查询选修课程号为101并且成绩高于学生号为9501101的所有学生的成绩.select * from sclass where cno=101 and degree=(select degree from sclass where sno=9501101and cno=101)当子查询跟随在 =、!=、= 之后, 子查询的返回值只能是一个, 否则应在外层where子句中用一个in限定符,即要返回多个值,要用in或者not in2。 带not in的嵌套查询 只要主查询中列或运算式是在(不在)子查询所得结果列表中的话,则主查询的结果为我们要的数据selectsales_id,tot_amtfromsaleswheresale_idin(selectsale_idfromemployeewheresex=F)where sno not in(Select distinct sno from sclass)3。 带exists的嵌套查询子查询的结果至少存在一条数据时,则主查询的结果为我们要的数据。(exists)或自查询的结果找不到数据时,则主查询的结果为我们要的数据(notexists)我们经常查询的两个表有多少重复的记录就用这个以下范例让你找出滞销的产品,也就是尚未有任何销售记录的库存产品。此范例主要是查询以库文件中的每一条产品代码到销售明细表中去查询,如果查询不到任何一条,表示该产品未曾卖出任何一件。select*fromstockawherenotexists(select*fromsale_d_id=d_idanda.stup_id=b.stup_id)4.select.where列或运算式比较运算运算【any|all(子查询)只要主查询中列或运算式与子查询所得结果中任一(any)或全部(all)数据符合比较条件的话则主查询的结果为我们要的数据 selectsale_id,tot_amtfromsaleswheretot_amtany(selecttot_amtfromsaleswheresale_id=e0013andorder_date=1996/11/10)选出不同的人金额最高的订单select*fromsalesawheretomat=(selectmax(totmat)fromsaleswherename=)3:相关子查询(多值子查询)1非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。 2相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。查询中再查询,通常是以一个查询作为条件来供另一个查询使用 例:有work表和部门表A:检索出在部门表中登记的所有部门的职工基本资料select * from work where 部门编号 in not in(select 部门编号 from dbo.部门)B:检索出在work表中每一个部门的最高基本工资的职工资料 select * from work a where 基本工资=(select max(基本工资) from work b where a.部门名称=b.部门名称) 说明:由外查询提供一个部门名称给内查询,内查询利用这个部门名称找到该部门的最高基本工资,然后外查询根据基本工资判断是否等于最高工资,如果是的,则显示出来. 相当于:select * from work,(select 部门名称,max(基本工资) as 基本工资 from work group by 部门名称 as t) where work.基本工资=t.基本工资 and work.部门名称=t.部门名称 C:用嵌套work表和嵌套部门表,在嵌套work表中检索出姓名和职工号都在嵌套部门存在的职工资料 select * from 嵌套work where 职工号 in (select 职工号 from 嵌套部门) and 姓名 in (select 姓名 from 嵌套部门) 察看结果,分析原因 (错误,因为这两个in不是一对一 改:select * from 嵌套work a,嵌套部门 b where a.职工号=b.职工号 and a.姓名=b.姓名 改:select * from 嵌套work where 职工号=(select 职工号 from 嵌套部门) and 姓名=(select 姓名 from 嵌套部门) 行吗?为什么,分析原因? 不能后面的select得到的结果不是一个值而又跟在=后必然出错 在嵌套中使用exists关键字存在例:1:用嵌套work表和嵌套部门表,在嵌套work表中检索出姓名和职工号都在嵌套部门存在的职工资料 select * from 嵌套work a where exists (select * from 嵌套部门 b where a.姓名=b.姓名 and a.职工号=b.职工号) 2:在work表检索出在部门表没有的职工 select * from work where not exists (select * from 部门 where 部门.部门编号=work.部门编号) 能否改成:select * from work where exists (select * from 部门 where 部门.部门编号work.部门编号) 是不能的,在列清单中使用select例:1:在work1表和部门表中检索出所有部门的部门名称和基本工资总和 select 部门名称,(select sum(基本工资) from work1 b where a.部门编号=b.部门编号) from 部门 a 2:检索各部门的职工人数 select 部门编号,部门名称,(select count(职工号) from work1 a where a.部门编号=b.部门编号) as 人数 from 部门 b 3:在商品表和销售表中查询每一职工的姓名,所属部门,销售总量 select 姓名,所属部门,(select sum(销售量) from 商品销售 a where a.职工号=b.职工号) as 销售总量 from 嵌套部门 b说明:都是相关子查询的特殊情况,外层的查询是内层查询的条件如:a.职工号=b.职工号,内层条件成立则得到的些行记录是并入外层查询的最终结果,否则不记录入最后结果 许多查询都可以通过执行一次子查询并将得到的值代入外部查询的 WHERE 子句中进行计算。在包括相关子查询(也称为重复子查询)的查询中,子查询依靠外部查询获得值。这意味着子查询是重复执行的,为外部查询可能选择的每一行均执行一次。此查询在 SalesPerson 表中检索奖金为 5000 且雇员标识号与 Employee 和 SalesPerson 表中的标识号相匹配的雇员的名和姓的一个实例。USE AdventureWorks2008R2;GOSELECT DISTINCT c.LastName, c.FirstName, e.BusinessEntityID FROM Person.Person AS c JOIN HumanResources.Employee AS eON e.BusinessEntityID = c.BusinessEntityID WHERE 5000.00 IN (SELECT Bonus FROM Sales.SalesPerson sp WHERE e.BusinessEntityID = sp.BusinessEntityID) ;GO下面是结果集:LastName FirstName BusinessEntityID- - -Ansman-Wolfe Pamela 280Saraiva Jos 282(2 row(s) affected)该语句中前面的子查询无法独立于外部查询进行计算。它需要 Employee.BusinessEntityID 值,但是此值随 SQL Server 检查 Employee 中的不同行而改变。下面准确说明了如何计算此查询:SQL Server 通过将每一行的值代入内部查询,考虑 Employee 表中的每一行是否都包括在结果中。例如,如果 SQL Server 首先检查 Syed Abbas 行,那么变量 Employee.BusinessEntityID 将取值 285,SQL Server 将该值代入内部查询。USE AdventureWorks2008R2;GOSELECT BonusFROM Sales.SalesPersonWHERE BusinessEntityID = 285;结果为 0(Syed Abbas 没有收到奖金,因为他不是销售人员),因此外部查询计算为:USE AdventureWorks2008R2;GOSELECT LastName, FirstNameFROM Person.Person AS c JOIN HumanResources.Employee AS eON e.BusinessEntityID = c.BusinessEntityID WHERE 5000 IN (0.00)引用外部查询列的子查询。逻辑上讲,子查询会为外部查询的每行计算一次。Ex4:查询每个员工employee最近的一个订单思路:-需要附加属性(Tiebreaker)Max(OrderDate)最大订单日期和Max(OrderId)最大订单号来确定每名员工的最近订单状况select OrderId,CustomerId,EmployeeId,OrderDate From Orders As o1 where Ord
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025辽宁鞍山市立山区教育局面向应届毕业生校园招聘2人模拟试卷及1套完整答案详解
- 2025江苏苏州凌晔进出口有限公司招聘7人考前自测高频考点模拟试题附答案详解(典型题)
- 2025赤峰龙韵城市建设有限公司所属子公司员工招聘21人模拟试卷及答案详解(名校卷)
- 2025年湖南常德津市市人民医院公开招聘专业技术人员16人模拟试卷及答案详解(名校卷)
- 2025年5月广西悦桂田园文化旅游投资有限责任公司招聘13人笔试题库历年考点版附带答案详解
- 2025湖北巴东县溪丘湾乡人民政府招聘公益性岗位工作人员11人模拟试卷及1套参考答案详解
- 2025广东省能源集团西北(甘肃)有限公司招聘18人模拟试卷及答案详解(夺冠系列)
- 2025江苏句容市教育局所属学校招聘紧缺教育人才5人考前自测高频考点模拟试题及完整答案详解一套
- 2025北京中国热带农业科学院香料饮料研究所第一批工作人员招聘(第2号)模拟试卷及一套完整答案详解
- 2025年三亚市直属学校赴高校面向2025年应届毕业生招聘81人模拟试卷附答案详解
- 农业生产玉米病虫害田间识别、抗性评价与防治技术
- DZ∕T 0338.2-2020 固体矿产资源量估算规程 第2部分 几何法(正式版)
- 结缔组织教学课件
- 2023年6月新高考天津卷英语试题真题及答案解析(精校打印版)
- 兽医未来职业规划
- 余华读书分享+名著导读《我们生活在巨大的差距里》
- 2023-2024 学年度第一学期第一次月考七年级数学试题
- 中级化学检验工理论考试题库
- 幼儿园红色小故事PPT:抗日小英雄王二小的故事
- YD-T 3775-2020 大数据 分布式事务数据库技术要求与测试方法
- 大学生心理健康教育(第二版)PPT全套完整教学课件
评论
0/150
提交评论