用SQL进行嵌套查询
在SELECT查询语句里可以嵌入SELECT查询语句,称为嵌套查询。
也可将内嵌的SELECT语句称为孒查询,子查询形成的结果又成为父查询的条件。
子查询可以嵌套多层,子查询操作的数据表可以是父查询不操作的数据表。
子查询中不能有Group BY分组语句
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"
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"。
6.带【exists】的嵌套查询
语句范例 :
select 雇员表.雇员编号, 雇员表.姓名, 雇员表.职务, 雇员表.薪水;
from 雇员表, 部门表 ;
where exists (select * ;
from 雇员表 ;
where 雇员表.部门编号 = 部门表.部门编号)
说明:
查询得到雇员表和部门表的部门编号相匹配的所有雇员信息。
7.并操作【union】的嵌套查询
语句范例 :
(select 部门编号 from 雇员表) union (select 部门编号 from 部门表)
说明:
并操作就是集合中并集的概念。属于集合A或集合B的元素的总和就是并集。注:该操作的嵌套查询要求属性具有相同的定义,包括类型和取值范围。
8.交操作【intersect】的嵌套查询
语句范例 :
(select 部门编号 from 雇员表) intersect (select 部门编号 from 部门表)
说明:
交操作就是集合中交集的概念。属于集合A且属于集合B的元素的总和就是交集。注:该操作的嵌套查询要求属性具有相同的定义,包括类型和取值范围。
9.差操作【minus】的嵌套查询
语句范例 :
(select 部门编号 from 部门表) minus (select 部门编号 from 雇员表)
说明:
差操作就是集合中差集的概念。属于集合A(前一个孒查询结果)且不属于集合B(后一个孒查询结果)的元素的总和就是差集。注:该操作的嵌套查询要求属性具有相同的定义,包括类型和取值范围。