|
本帖最后由 wuxiang_123 于 2012-3-29 10:16 编辑
在SELECT查询语句里可以嵌入SELECT查询语句,称为嵌套查询。 有些书上将内嵌的SELECT语句称为孒查询,子查询形成的结果又成为父查询的条件。
孒查询可以嵌套多层,子查询操作的数据表可以是父查询不操作的数据表。
子查询中不能有ORDER BY分组语句
子查询可以有ORDER BY 排序子句,有时候,ORDER BY排序子句是不可省略的。 ---wuxiang_123注
1.简单嵌套查询
语句范例 :
select 单价表.客户, 单价表.产品名, 单价表.单价 from 单价表 where 单价表.产品名 = (select 产品表.产品名 from 产品表 where 产品表.产品ID = "102-5000")
说明:
查询得到单价表里满足产品名为产品表里产品ID为“102-5000”的产品的相关信息
2.带【in】的嵌套查询
语句范例 :
select 雇员表.雇员编号, 雇员表.姓名, 雇员表.职位, 雇员表.薪水 from 雇员表 where 薪水 in (select 薪水 from 雇员表 where 姓名='张三')
说明:
查询得到雇员表里满足薪水符合姓名为张三的薪水的所有雇员的相关信息,比如 in(1000,1500,2000)表示薪水=1000或1500或2000的情况。注:此语句完成的查询薪水和张三相等的职员,也可以使用【not in】来进行相反的查询
3.带【any】的嵌套查询
语句范例 :
select 雇员表.雇员编号,雇员表.姓名, 雇员表.职务, 雇员表.薪水 from 雇员表 where 薪水> any (select 薪水 from 雇员表 where 职务=‘工程师’)
说明:
查询得到薪水比职务为工程师的薪水要高的职员信息。例如子查询结果为(2000,1500,1000),父查询的条件为"薪水>2000 or 薪水>1500 or 薪水>1000"
ANY可以理解为主查询的记录与子查询的任意记录进行比较,符合则返回。>ANY可以理解为主查询中记录若大于子查询中最小值,则返回,<ANY可以理解为父查询中若小于子查询最大值则返回。上面的例子可以理解为:返回父查询中,薪水比职务是工程师的薪水最小值还大的记录。ANY与SOME同义,下同。------wuxiang_123注
4.带【some】的嵌套查询
语句范例 :
select 雇员表.雇员编号,雇员表.姓名, 雇员表.职务, 雇员表.薪水 from 雇员表 where 薪水= some (select 薪水 from 雇员表 where 职务=‘工程师’)
说明:
查询得到薪水和职务为工程师的薪水一样的职员信息,也就是和任意一个工程师的薪水相等的职员信息。例如子查询结果为(2000,1500,1000),父查询的条件为"薪水=2000 or 薪水=1500 or 薪水=1000"。
带【any】的嵌套查询和【some】的嵌套查询功能是一样的。早期的SQL仅仅允许使用【any】,后来的版本为了和英语的【any】相区分,引入了【some】,同时还保留了【any】关键词。
5.带【all】的嵌套查询
语句范例 :
select 雇员表.雇员编号,雇员表.姓名, 雇员表.职务, 雇员表.薪水 from 雇员表 where 薪水> all (select 薪水 from 雇员表 where 职务=‘工程师’)
说明:
查询得到薪水比任一工程师薪水都要高的职员信息。例如子查询结果为(2000,1500,1000),父查询的条件为"薪水>2000 and 薪水>1500 and 薪水>1000"。
ALL谓词表示所有的。所以,>ALL可以理解为返回父查询中,比子查询所有值都要大的值,即相当于返回父查询中比子查询最大值还要大的记录,等效于:select 雇员表.雇员编号,雇员表.姓名, 雇员表.职务, 雇员表.薪水 from 雇员表 where 薪水> (select MAX(薪水) from 雇员表 where 职务=‘工程师’)
同理,<all则等效于:select 雇员表.雇员编号,雇员表.姓名, 雇员表.职务, 雇员表.薪水 from 雇员表 where 薪水> (select Min(薪水) from 雇员表 where 职务=‘工程师’)
----wuxiang_123注
6.带【exists】的嵌套查询
语句范例 :
select 雇员表.雇员编号, 雇员表.姓名, 雇员表.职务, 雇员表.薪水 from 雇员表, 部门表 where exists (select * from 雇员表 where 雇员表.部门编号 = 部门表.部门编号)
说明:
查询得到雇员表和部门表的部门编号相匹配的所有雇员信息。
{NOT} EXISTS是将子查询和主查询进行比较,返回一个TURE/FLASE的值,TURE则返回,FLASE则不返回。----wuxiang_123注
7.并操作【union】的嵌套查询
语句范例 :
(select 部门编号 from 雇员表) union (select 部门编号 from 部门表)
说明:
并操作就是集合中并集的概念。属于集合A或集合B的元素的总和就是并集。注:该操作的嵌套查询要求属性具有相同的定义,包括类型和取值范围。
在EXCEL中,UNION生成的是联合查询,对于进行联合查询的表或查询,要求请求返回的字段数目要相同,字段的类型和属性可以不同。另外,上面的语法中,括号是多余的,这样写会让SQL以为【(select 部门编号 from 雇员表) union (select 部门编号 from 部门表)】这部分是表名称。正确的语法为:select 部门编号 from 雇员表 union select 部门编号 from 部门表
下面的8和9不能在OLE DB中使用。
----wuxiang_123注
8.交操作【intersect】的嵌套查询
语句范例 :
(select 部门编号 from 雇员表) intersect (select 部门编号 from 部门表)
说明:
交操作就是集合中交集的概念。属于集合A且属于集合B的元素的总和就是交集。注:该操作的嵌套查询要求属性具有相同的定义,包括类型和取值范围。
9.差操作【minus】的嵌套查询
语句范例 :
(select 部门编号 from 部门表) minus (select 部门编号 from 雇员表)
说明:
差操作就是集合中差集的概念。属于集合A(前一个孒查询结果)且不属于集合B(后一个孒查询结果)的元素的总和就是差集。注:该操作的嵌套查询要求属性具有相同的定义,包括类型和取值范围。
小结:尽管SQL有自己的国际标准,但由于不同开发者的使用习惯和思维,决定了不同环境的SQL会具有差异性或者说扩展性,在EXCEL OLE DB和MQ,与ACCESS执行的SQL标准基本一致。---wuxiang_123注
|
评分
-
4
查看全部评分
-
|