sql语法相关子查询与非相关子查询

发布 2021-05-11 14:17:28 阅读 6191

1:标量子查询(相对于多值子查询):

只有标量子查询返回的是单个记录或者不返回,就是有效的子查询。

ex1:select orderid from orders where employeeid=

select employeeid from employees where lastname like n'd**olio')

将’d**olio’改为'd%'时,这个时候子查询中返回结果为2行,等号右边此时为多值,查询失败。将’=’改为in谓词。查询才能通过。

employees表中无lastname=’jason’,外部查询将返回null.

2:非相关子查询(嵌套子查询)

一个select...from...where查询语句块可以嵌套在另一个select...from...where查询块的where子句。

中,称为嵌套查询。外层查询称为父查询,主查询。内层查询称为子查询,从查询。子查询可以嵌套多层,子查询查询到的结果又成为父查询的条件。子查询中不能有orderby分组语句。

先处理子查询,再处理父查询。细分如下:

1。简单嵌套查询。

查询选修课程号为'101'并且成绩高于学生号为'9501101'的所有学生的成绩。select * from sclasswhere cno='101' and degree>=

select degree from sclass where sno='9501101'and cno='101')

当子查询跟随在=、!之后,子查询的返回值只能是一个,否则应在外层where子句中用。

一个in限定符,即要返回多个值,要用in或者not in

2。带[not] in的嵌套查询。

只要主查询中列或运算式是在(不在)子查询所得结果列表中的话,则主查询的结果为我们要的数据。

select sales_id,tot_amtfrom 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 and

...where列或运算式比较运算运算【any|all](子查询)

只要主查询中列或运算式与子查询所得结果中任一(any)或全部(all)数据符合比较条件的话则主查询的结果为我们要的数据。

select sale_id,tot_amtfrom sales

where tot_amt>any(select tot_amt from sales where sale_id='e0013'and'order_date='1996/11/10')

选出不同的人金额最高的订单select * from sales a

where tomat=(select max(totmat) from sales where name=

3:相关子查询(多值子查询)

1>非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询。

2>相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。

查询中再查询,通常是以一个查询作为条件来供另一个查询使用例:有work表和部门表。

a:检索出在部门表中登记的所有部门的职工基本资料。

select*fromworkwhere部门编号in[notin](select部门编号fromdbo.部门)

b:检索出在work表中每一个部门的最高基本工资的职工资料。

select * from work a where基本工资=(select max(基本工资) from work bwhere 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子句中进行计算。在包括相关子查询(也称为重复子查询)的查询中,子查询依靠外部查询获得值。这意味着子查询是重复执行的,为外部查询可能选择的每一行均执行一次。

use adventureworks2008r2;goselect distinct

from as c join as (selectbonus sp where = go下面是结果集:

lastname firstname businessentityid

ansman-wolfe pamela 280

saraiva josé282

2 row(s) affected)

该语句中前面的子查询无法独立于外部查询进行计算。它需要值,但是此值随sql server检查employee中的不同行而改变。

下面准确说明了如何计算此查询:sql server通过将每一行的值代入内部查询,考虑employee表中的每一行是否都包括在结果中。例如,如果sqlserver首先检查syedabbas行,那么变量将取值285,sqlserver将该值代入内部查询。

use adventureworks2008r2;go

select bonus

from businessentityid = 285;

结果为0(syed abbas没有收到奖金,因为他不是销售人员),因此外部查询计算为:

useadventureworks2008r2;goselectlastname, (0.00)

引用外部查询列的子查询。逻辑上讲,子查询会为外部查询的每行计算一次。

ex4:查询每个员工employee最近的一个订单。

思路:--需要附加属性(tiebreaker)max(orderdate)最大订单日期和max(orderid)最大订单号来确定每名员工的最近订单状况。

selectorderid,customerid,employeeid,orderdatefromordersaso1whereorderdate=(

selectmax(orderdate)from orders as o2 where 得到每名员工的最近订单日期)

and orderid=(

selectmax(orderid)from orders as o2 where 得到每名员工每个订单日期的最大orderid)

语法相关概念

人物名词 如学生 群众 老头 妇女 同志 叔叔 维吾尔族 酒鬼等 事物名词 如笔 杉木 蜗牛 猎豹 奥托 棒球 战斗机 冥王星 思想 中学 物理 过程等 时间名词 如上午 过去 将来 午夜 三更 甲戊 世纪等 方位名词 如东南 上面 前方 内部 中间等。2 动词 表示动作行为及发展变化的词。行为动词...

法语课外知识语法相关

指示形容词也是形容词的一种,置于名词前,用于指出出现在前面的人 物,或重提已经出现过的人 物。1.形式。ce matin,je tr aille.mais ce soir,je vais m amuser 今天上午,我工作。但晚上,我要玩。cet t il a fait chaud.mais cet...

仲裁法相关考点

仲裁法是每年司法考试必考的内容,分值在8 10分,总共就5个考点,而且,每个考点几乎每年必考2分,是我们复习效率的一部法律,下面我们把这5个考点列举出来,希望考生熟练掌握。1 仲裁范围。不得仲裁的事项 1 婚姻 收养 监护 抚养 继承纠纷 2 依法应当由行政机关处理的行政争议。这里我们只要记住有关身...