SQL影响因子查询系统2017相关问题

Access俱乐部
?&&&&?&&&&?&&&&?&&&&
您的位置:  > >
在 SQL Server 数据库的 WHERE 语句中使用子查询
来源:https://www.oschina.net/translate/get-ready-to-learn-sql-server-using-subqueries&&点击数:1757&&评论数:0 &|&&|&
时 间: 08:32:39
作 者:&&&ID:24010&&城市:江阴
摘 要:这是关于子查询语句的一系列文章中的第三篇。在这篇文章中我们将讨论WHERE语句中的子查询语句。其他的文章讨论了其他语句中的子查询语句。本次课程中的所有例子都是基于Microsoft&SQL&Server&Management&Studio和AdventureWorks2012数据库的。读者可以阅读我的SQL&Server使用入门学习使用这些免费的工具。在WHERE语句中使用子查询
在Where语句中使用子查询
在Where语句中使用子查询是非常常见的。常见的用法是用EXISTS或IN测试存在性。在某些情况下重新考虑查询语句并且使用JOIN是有意义的,但是在最终决定之前,应该好好学习一下这两种通过查询优化的形式。
比较修饰符ANY和ALL可以和greater than,less than,或者equals操作符一起使用。这样就提供了一种方式比较一个单值,例如一个列,一个或更多的子查询返回的结果。
现在我们详细讨论这些。
Exist和Not Exists
EXISTS条件结合子查询使用.当子查询返回一个或多个记录的时候,它返回TRUE.
EXISTS条件最简单的语法形式如下:
Where&EXISTS&(sub&query)
假设我们需要返回,所有由销售人员记录的,从年初至今,大于三百万美元的销售订单.为了达到这个效果,我们可以使用如下例子中的EXISTS子句:&&
Select&SalesOrderID,
&&&&&&&RevisionNumber,
&&&&&&&OrderDate
FROM&&&Sales.SalesOrderHeader
Where&&EXISTS&(Select&1
&&&&&&&&&&&&&&&FROM&&&sales.SalesPerson
&&&&&&&&&&&&&&&Where&&SalesYTD&&&3000000
&&&&&&&&&&&&&&&&&&&&&&AND&SalesOrderHeader.SalesPersonID&
&&&&&&&&&&&&&&&&&&&&&&&&=&Sales.SalesPerson.BusinessEntityID)
执行这条SQL语句的时候,会作如下的对比:
Where子句返回所有EXISTS子句为TRUE的记录.
EXIST子句使用. 外部查询通过SalesPersonID关联到内部查询.
只有SalesYTD大于三百万美元的SalesPersons才会包含在结果之中.
如果子查询返回一行或多行记录,EXISTS子句返回TRUE.
EXISTS条件是一种成员条件,即只有返回结果它才返回TRUE.相反的,如果我们要测试非成员条件,我们可以使用NOT EXISTS.
当无记录返回时,NOT EXISTS返回TRUE.这样,如果我们想找出,所有由销售人员记录的,从年初至今,小于等于三百万美元的销售订单,我们可以使用如下的查询:
Select&SalesOrderID,
&&&&&&&RevisionNumber,
&&&&&&&OrderDate
FROM&&&Sales.SalesOrderHeader
Where&&NOT&EXISTS&(Select&1
&&&&&&&&&&&&&&&FROM&&&sales.SalesPerson
&&&&&&&&&&&&&&&Where&&SalesYTD&&&3000000
&&&&&&&&&&&&&&&&&&&&&&AND&SalesOrderHeader.SalesPersonID&
&&&&&&&&&&&&&&&&&&&&&&&&=&Sales.SalesPerson.BusinessEntityID)
NULL是怎么回事?
当一个子查询返回null值的时候,EXISTS会返回什么:& NULL, TRUE, 还是 FALSE?
坦白讲,我也很吃惊.
我很确信它会返回NULL, 但让人吃惊的是,我获知它返回TRUE。&因此,如果你的子查询返回null值,EXISTS子句会返回TRUE。 下面的例子会返回所有的SalesOrderHeader行,因为Where子句返回TRUE:
Select&SalesOrderID,
&&&&&&&RevisionNumber,
&&&&&&&OrderDate
FROM&&&Sales.SalesOrderHeader
Where&&EXISTS&(Select&NULL)
当我们学习IN操作符的时候,我们会发现,这是EXISTS子句所独有的特性.
IN 和 NOT IN
我们首先在的课程中学习IN操作符。在子查询中使用的时候,IN 和 NOT IN 子句是一样的。下面是那篇文章的小结。
IN 和 NOT IN 回顾
IN操作符被看作是一个成员类型。成员类型允许在一条语句中进行多次匹配测试。例如,假如有公司领导的多个拼写形式,如“Owner”,“President”,和“CEO”。在这种情况下,你可以使用IN操作符来找到所有的匹配形式:
ContactTitle&IN&('CEO',&'Owner',&'President')
如果ContactTitle是“CEO”,“Owner"或者“President",上面的语句将匹配或者返回TRUE。为了使用IN操作符,需要使用逗号分隔测试项,并括在括号中。例子中完整的语句是:
Select&CompanyName,&ContactName,&ContactTitle
FROM&Customers
Where&ContactTitle&IN&('CEO',&'Owner',&'President');
Note:&&The&above&query&isn't&meant&for&
the&adventure&works&database
在子查询中使用IN
当在子查询中使用的时候,数据列表可以用子查询来代替。在这种情况下,使用子查询的优势是,它有助于让查询处于数据驱动的状态,同时更易于处理。
我的意思是,你无需硬编码数据。
例如,如果你正在做一个查询,需要查找销售最多的销售人员的订单,非子查询的方式使用IN的语句是:
Select&SalesOrderID,
&&&&&&&OrderDate,
&&&&&&&AccountNumber,
&&&&&&&CustomerID,
&&&&&&&SalesPersonID,
&&&&&&&TotalDue
&&FROM&Sales.SalesOrderHeader
&&Where&SalesPersonID&IN&(279,&286,&289)
whose&results&are
但是,现在我们知道了子查询,我们可以使用下面的语句获取同样的数据:
Select&SalesOrderID,
&&&&&&&OrderDate,
&&&&&&&AccountNumber,
&&&&&&&CustomerID,
&&&&&&&SalesPersonID,
&&&&&&&TotalDue
&&FROM&Sales.SalesOrderHeader
&&Where&SalesPersonID&IN&(Select&BusinessEntityID
&&&&&&&&&&&&&&&&&&&&&&&&&&&&FROM&Sales.SalesPerson
&&&&&&&&&&&&&&&&&&&&&&&&&&&Where&Bonus&&&5000)
其优势在于,随着销售人员销售的数据变化,返回的SalesPersonID的数据也跟着调整。
和其它的查询一样,你可以使用IN子句来创建一个关联子查询。这和EXIST子句使用的是相同的查询。
它返回了,从年初至今,所有销售人员记录的大于三百万美元的销售订单,但是现在我们使用IN子句:
Select&SalesOrderID,
&&&&&&&RevisionNumber,
&&&&&&&OrderDate
FROM&&&Sales.SalesOrderHeader
Where&&SalesPersonID&IN&(Select&SalesPerson.BusinessEntityID
&&&&&&&&&&&&&&&FROM&&&sales.SalesPerson
&&&&&&&&&&&&&&&Where&&SalesYTD&&&3000000
&&&&&&&&&&&&&&&&&&&&&&AND&SalesOrderHeader.SalesPersonID&
&&&&&&&&&&&&&&&&&&&&&&&&=&Sales.SalesPerson.BusinessEntityID)
如果在比较列表中测试值&找到了&,IN返回TRUE。如果在比较列表中测试值&没有找到&,NOT IN返回TRUE。采用和上面一样的查询,我们可以找到,从年初至今,所有销售人员记录的小于等三百万美元的销售订单,查询语句如下:
Select&SalesOrderID,
&&&&&&&RevisionNumber,
&&&&&&&OrderDate
FROM&&&Sales.SalesOrderHeader
Where&&SalesPersonID&NOT&IN&(Select&SalesPerson.BusinessEntityID
&&&&&&&&&&&&&&&FROM&&&sales.SalesPerson
&&&&&&&&&&&&&&&Where&&SalesYTD&&&3000000
&&&&&&&&&&&&&&&&&&&&&&AND&SalesOrderHeader.SalesPersonID&
&&&&&&&&&&&&&&&&&&&&&&&&=&Sales.SalesPerson.BusinessEntityID)
在IN中碰到NULL是怎么回事?
当比较列表值包含NULL值的时候,和此列表比较的任何数据均返回false。
Select&SalesOrderID,
&&&&&&&RevisionNumber,
&&&&&&&OrderDate
FROM&&&Sales.SalesOrderHeader
Where&&SalesOrderID&&IN&(Select&NULL)
&子查询首先计算平均安全库存等级。它返回一个数值列表。然后对每一个产品行的安全库存等级对外查询比较。如果它大于一个或多个列表中的值,就会被包含在结果中返回
&如我一样,你可能第一反应是&ANY是多余的,鸡肋。它就等同于&MIN(...),不是吗?
这是可以用ANY,却不能用MIN的示例语句:
Select&ProductID,
&&&&&&&Name,
&&&&&&&SafetyStockLevel,
&&&&&&&DaysToManufacture
FROM&&&Production.Product
Where&&SafetyStockLevel&&&MIN((Select&&&AVG(SafetyStockLevel)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&FROM&&&&&Production.Product
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&GROUP&BY&DaysToManufacture)
并不能运行,而是返回一个错误, “Cannot perform an aggregate function on an expression containing an aggregate or a subquery.” [译者注:不能运行的原因是GROUP BY语句对聚合函数不能用常规关键字操作,而是用另一些代替,例如GROUP BY条件中遇到聚合函数时Where用HAVING替换。]
使用 & ALL 修饰符
&& ALL 修饰符是返回所有比内查询中结果都大的结果。
比较操作&ALL意味着要大于列表中最大的值。示例如下:
Sales&&&ALL&(,&2500)
Sales&&&MAX(,&2500)
对条件 Sales & 2500返回为TRUE
这个例子我们返回年初至今 奖金大于 所有销售收入小于$1000000人员的奖金 的销售人员名单:
Select&p.BusinessEntityID,
&&&&&&&p.FirstName,
&&&&&&&p.LastName,
&&&&&&&s.Bonus,
&&&&&&&s.SalesYTD
FROM&&&Person.Person&AS&p
&&&&&&&INNER&JOIN&Sales.SalesPerson&AS&s
&&&&&&&ON&p.BusinessEntityID&=&s.BusinessEntityID
Where&&s.Bonus&&&ALL&(Select&Bonus
&&&&&&&&&&&&&&&&&&&&&&FROM&&&Sales.SalesPerson
&&&&&&&&&&&&&&&&&&&&&&Where&&Sales.SalesPerson.SalesYTD&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&1000000)
各种比较修饰符小结
你能使用各种比较修饰符进行其他的操作,比如判断相等。如下表格内的示例可以更加便于理解。有些组合可能没有意义,我还是全部列了出来。
示例中的子查询结果集仅包含了三个数值:& 1,2,3.
某些比较的组合根本没用。比如“= ALL” 或 “&& ANY.”。工具在于人使用,如果你觉得MAX或MIN可以用就该用,ANY和ALL只出现在它该出现的地方。
我们今天讨论了我在子查询中使用EXISTS和NOT EXISTS的情况。我用了相当多的IN子句,但通常是在一个静态列表,而不是子查询中。
      
&&&&【&&】&&&&【&&】&&&&【&&】&&&&【&&】&&&&【&&】&&&&【&&】
Access网店
价格:¥50 元
价格:¥50 元
价格:¥100 元
(02-09 10:52)
(02-09 10:16)
(02-09 09:09)
(02-08 22:58)
(02-08 22:43)
(02-08 21:59)
(02-08 19:32)
(02-08 16:10)
(02-08 15:59)
(02-08 14:40)
Access软件网 版权所有 CopyRight
提供支持 本站特聘法律顾问: 李慧 律师【图文】SQL面试问题汇总_高级子查询_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
SQL面试问题汇总_高级子查询
&&SQL面试问题汇总_高级子查询
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)sql语法相关子查询与非相关子查询
sql语法相关子查询与非相关子查询
1:标量子查询(相对于多值子查询):
只有标量子查询返回的是单个记录或者不返回,就是有效的子查询。
Ex1:select OrderId From Orders where EmployeeId=
(select EmployeeId From employees where lastName like N'Davolio')
将&Davolio&改为'D%'时,这个时候子查询中返回结果为2行,等号右边此时为多值,查询失败.将&=&改为in谓词.查询才能通过.
employees表中无lastname=&jason&,外部查询将返回null.
2:非相关子查询(嵌套子查询)
一个select...From...Where查询语句块可以嵌套在另一个select...From...Where查询块的Where子句
中,称为嵌套查询。外层查询称为父查询,主查询。内层查询称为子查询,从查询。
子查询可以嵌套多层,子查询查询到的结果又成为父查询的条件。子查询中不能有order by分组语句。
先处理子查询,再处理父查询。&
细分如下:
1。 简单嵌套查询&
& & 查询选修课程号为'101'并且成绩高于学生号为';的所有学生的成绩.
select * from sclass&
where cno='101' and degree&=
(select degree from sclass where sno=';and cno='101') &
当子查询跟随在 =、!=、&、&=、&、&= 之后, 子查询的返回值只能是一个, 否则应在外层where子句中用
一个in限定符,即要返回多个值,要用in或者not in
2。 带[not] in的嵌套查询&
& & 只要主查询中列或运算式是在(不在)子查询所得结果列表中的话,则主查询的结果为我们要的数据
& &select sales_id,tot_amt
& &from sales&
& &where sale _id &in(select sale_id from employee where sex='F')
where sno not in(Select distinct sno from sclass)
3。 带exists的嵌套查询
子查询的结果至少存在一条数据时,则主查询的结果为我们要的数据。(exists)或自查询的结果找不到数据时,则主查询的结果为我们要的数据(not exists)
我们经常查询的两个表有多少重复的记录就用这个
以下范例让你找出滞销的产品,也就是尚未有任何销售记录的库存产品。此范例主要是查询以库文件中的每一条产品代码到销售明细表中去查询,如果查询不到任何一条,表示该产品未曾卖出任何一件。
&select * from stock a
&where not exists(select * from sale_item b
& & & & & & & & & & & & &where a.prod_id=b.prod_id and a.stup_id=b.stup_id)
4.select ... where 列或运算式 比较运算运算【any|all](子查询)
& 只要主查询中列或运算式与子查询所得结果中任一(any)或全部(all)数据符合比较条件的话则主查询的结果为我们要的数据
&select sale_id,tot_amt
& &from sales&
& &where tot_amt&any(select tot_amt from sales where sale_id='e0013'and 'order_date='')
& & & 选出不同的人金额最高的订单
& &select * &from &sales a
& &where tomat=(select max(totmat) from sales &where name=a.name)
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 280
Saraiva 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;
SELECT Bonus
FROM Sales.SalesPerson
WHERE 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 OrderDate=
& & selectMax(OrderDate)From Orders As o2 where o2.EmployeeId=o1.EmployeeId--得到每名员工的最近订单日期
and OrderId=
& & selectMax(OrderId)From Orders As o2 Where o2.EmployeeId=o1.EmployeeId and o2.OrderDate=o1.OrderDate--得到每名员工每个订单日期的最大OrderId当前位置:
来源: 联系QQ: 作者: myeducs.cn
发布时间: 13/03/16
【网学网提醒】:以下是会员为您推荐的SQL子,希望本篇文章对您有所帮助。&&&&SQL子&&&&&&&&一、概念:子是嵌套在一个select语句中的另一个select语句。当需要从一个表中检索信息,&&&&而检索条件值又是来自该表本身的内部数据时,子非常有用。&&&&子可以嵌套在一下SQL子句中:where子句、having子句和from子句。&&&&二、规则:1、子要用括号括起来。&&&&2、select语句中只能有一个orderby子句,并且它只能是主select语句的最后一个子句。&&&&3、在子语句中,只有同时指定了top,才可以指定orderby。&&&&4、如果子中含有groupby子句,就不能使用distinct关键字。&&&&5、由子创建的视图不能更新。&&&&6、在from子查询中,子必须指定别名。&&&&三、类型:&&&&1、单行子查询(即子查询只返回一行结果)&&&&子查询select语句只返回一行结果(单列)。&&&&主查询的where子句使用单行子查询时,返回结果要采用单行比较运算符(=、&、&、&=、&=、&&)。&&&&1.1where子句中使用单行子查询&&&&例1:从雇员表t_emp中查询和雇员tom同部门的雇员、工资和部门编号&&&&useTestDB&&&&go&&&&selecteName,salary,deptNo&&&&fromt_emp&&&&wheredepNo=(selectdepNot_empwhereeName='tom')&&&&go&&&&返回:ENAMESALARYDEPTNO&&&&smith800.000002&&&&tom&&&&jack&&&&例2:显示和雇员tom从事相同工作,并且工资大于james的雇员、工作和工资&&&&useTestDB&&&&go&&&&selecteName,job,salary&&&&fromt_emp&&&&wherejob=(selectjobfromt_empwhereeName='tom')&&&&andsalary&(selectsalaryfromt_empwhereeName='james')&&&&go&&&&1.2单行子查询中使用聚合函数&&&&例1:显示工资最低的雇员、工作和工资&&&&useTestDB&&&&go&&&&selecteName,job,salary&&&&fromt_emp&&&&wheresalary=(selectmin(salary)fromt_emp)&&&&例2:显示工资高于平均工资的雇员、工作、工资和工资等级&&&&useTestDB&&&&go&&&&selecte.eName,e.job工作,e.salary工资,s.grade工资等级&&&&fromt_empe,t_salgrades&&&&wheree.salary&(selectavg(salary)fromt_emp)&&&&ande.salarybetweens.losalands&&&&.hisal&&&&1.3having子句中使用单行子查询&&&&&&&&例1:显示部门内工资比0002部门最低工资要高的部门编号及部门内最低工资&&&&分析:要查询0002部门的最低工资,就要用到min()聚合函数,显然&&&&不能用where子句&&&&要查询符合条件的部门的最低工资,就要用min()聚合函数,&&&&所以必须要有groupby&&&&selectdeptNo部门编号,min(salary)最低工资&&&&fromt_emp&&&&groupbydeptNo&&&&havingmin(salary)&(selectmin(salary)fromt_empwheredeptNo='0002')&&&&&&&&例2:查询平均工资最低的工种名称及其平均工资&&&&selectjob工种,avg(salary)平均工资&&&&fromt_emp&&&&groupbyjob&&&&havingmin(salary)=(selectmin(avg(salary))fromt_empgroupbyjob)&&&&2、多行子查询(即子查询只返回多行结果)&&&&子查询select语句返回多行结果(单列)。&&&&主查询的where子句使用多行子查询时,返回结果要采用多行比较运算符(in(notin)、any、all、some)。&&&&多行比较运算符可以和一个或多个值进行比较。&&&&2.1使用in运算符的多行子查询(in运算列符将等于表中的任意一项)&&&&例1:查询有下属的雇员、工作、工资和部门号&&&&selecteName,job,salary,deptNo&&&&fromt_emp&&&&whereempNoin(selectmgrfromt_emp)&&&&扩展:查询没有下属的雇员、工作、工资和部门号&&&&分析:用notin&&&&注意要防止子查询返回空值,因为只要空值成为子查询的一部分,就不能用notin运算符。&&&&所以正确语句如下:selecteName,job,salary,deptNo&&&&fromt_emp&&&&whereemoNonotin(selectnvl(mgr,-1)fromt_emp)//nvl(参数1,参数2)函数是检测mgr是否为空,&&&&空则返回-1,不空返回mgr,参数1和参数2数据类型必须一致。&&&&或:selectmgrfromt_empwheremgrisnotnull&&&&例2:查询各部门中工资最低的员工、工作、工资和部门号&&&&&&&&selecteName,job,salary,deptNo&&&&fromt_emp&&&&wheresalaryin(selectmin(salary)fromt_empgroupbydeptNo)&&&&例3:查询与销售部门(SALES)工作相同的其他部门的雇员、工作、工资和部门名&&&&selecte.eName,e.job,e.salary,d.dName&&&&fromt_empe,t_deptd&&&&wheree.deptNo=d.deptNoandd.dName&&'SALES'&&&&andjobin(selectdistincte.jobfromt_empe,t_deptdwheree.deptNo=d.deptNoandd.dName='SALES')&&&&&&&&2.2使用any运算符的多行子查询&&&&any运算符将和内部查询返回的结果逐个比较,与单行运算符配合使用&&&&<any:表示比子查询返回结果中的最大值小&&&&=any:表示可以是子查询返回结果中的任意一个值&&&&&any:表示比子查询返回结果中的最小值大&&&&&&&&例1:查询工资低于某个文员(CLERK)雇员工资,但不从事文员工作的雇员编号&&&&、工种和工资&&&&selectempNo,额Name,job,salary&&&&fromt_emp&&&&wheresalary<ANY(SELECTSALARYFROMT_EMPWHEREJOB='CLERK')&&&&andjob&&'CLERK'&&&&2.3使用all运算符的多行子查询&&&&all运算符将和内部查询返回的每个结果比较&&&&&all:比最大的大&&&&<all:比最小的小&&&&例1:查询高于所有部门平均工资的雇员、工种、工资和部门编号&&&&selecteName,job,salary,deptNo&&&&fromt_emp&&&&wheresalary&all(selectavg(salary)fromt_empgroupbydeptNo)&&&&注:子查询中因为有聚合函数,所以必须用groupby&&&&&&&&3、多列子查询(即子查询只返回多列结果)&&&&多列子查询分为:成对比较多列子查询、非成对比较多列子查询&&&&&&&&成对比较多列子查询:&&&&例1:查询与部门编号为0003的部门中任意一个雇员的工资和奖金完全相同的雇员、工资、&&&&奖金和部门编号,且该雇员不是来自0003号部门&&&&selecteName,salry,nvl(comm,-1),deptNo&&&&fromt_emp&&&&wheredeptNo&&'0003'&&&&and(salary,nvl(comm,-1))in(selectsalary,nvl(comm,-1)fromt_empwheredeptNo='0003')&&&&&&&&非成对比较多列子查询:&&&&&&&&例1:查询工资与部门编号为0003的部门中任意一&&&&个雇员的工资相同,同时奖金也与部门编号为0003的部门中&&&&任意一个雇员相同的雇员、工资、奖金和部门编号,且该雇员不是来自0003号部门&&&&selecteName,salary,nvl(comm,-1),deptNo&&&&fromt_emp&&&&wheredeptNo&&'0003'&&&&andsalaryin(selectsalaryfromt_empwheredeptNo=‘0003’)&&&&andnvl(comm,-1)in(selectnvl(comm,-1)fromt_empwheredeptNo='0003')&&&&4、相关子查询(exists、notexists)存在性检查&&&&例1:查询在纽约(NEWYORK)工作的雇员、工种、工资和奖金&&&&selecteName,job,salary,comm&&&&fromt_emp&&&&whereexists(select*fromt_empwheret_emp.deptNo=deptNoandloc=‘NEWYORK’)&&&&5、from子句中使用子查询&&&&在from子句中使用子查询时,必须给子查询指定别名&&&&例1:显示工资高于部门平均工资的雇员、工种、工资和部门号&&&&selecteName,job,salary,deptNo&&&&fromt_emp,(selectdeptNo,avg(salary)avgsalfromt_empgroupbydeptNo)s&&&&wheret_emp.deptNo=s.deptNoandsalary&s.avgsal&&&&例2:查询各部门中工资等级最高的雇员、工种、工资和部门号&&&&方法1:from中使用一个子查询&&&&selecte.eName,e.job,e.salary,s.grade,e.deptNo&&&&fromt_empe,t_salgrades,&&&&(selectmax(s.grade)grade,e.deptNo&&&&fromt_empe,t_salgrades&&&&wheree.salbetweens.losalands.hisal&&&&groupbye.deptNo)t&&&&wheree.salbetweens.losalands.hisal&&&&ande.deptNo=t.deptNoands.grade=t.grade&&&&orderbye.deptNo&&&&方法2:from中使用两个子查询&&&&&&&&&&&&selectp.eName,p.job,p.salary,p.gradep,p.deptNo&&&&from(&&&&selecte.eName,e.job,e.salary,s.grade,e.deptNo&&&&fromt_empe,t_salgrades&&&&wheree.salbetweens.losalands.hisal&&&&)p,&&&&(&&&&selectmax(s.grade)grade,e.deptNo&&&&fromt_empe,t_salgrades&&&&wheree.salbetweens.losalands.hisal&&&&groupbye.deptNo&&&&)q&&&&wherep.deptNo=q.d&&&&eptNoandp.grade=q.grade&&&&orderbyp.deptNo&&&&</all:比最小的小</any:表示比子查询返回结果中的最大值小
上一篇资讯:
下一篇资讯:
文章排行榜

我要回帖

更多关于 sci影响因子查询 的文章

 

随机推荐