select ename,deptno,sal
from emp
where deptno=(select deptno from dept where loc='NEW YORK'); |
--子查询的查询结果作为SELECT 子句的列
select 名字,性别,工资,所属部门,
(select AVG(工资) from mar) as 平均工资 ,
(工资-(select AVG(工资) from mar)) as 与平均工资的差额
from mar |
--查询学生成绩大于平均成绩的记录
select 语文,英语,数学,代数,name as 名字,sex as 性别,class as 班级,SUM(语文+英语+数学+代数) as 总分
from tb_stuAchievement
where (语文+英语+数学+代数)>(select AVG(语文+英语+数学+代数) from tb_stuAchievement)
group by 语文,英语,数学,代数,name ,sex,class |
--子查询作为FROM 子句的查询依据
select top 1 *
from(select top 3 挂账单位,SUM(欠款金额)as 金额
FROM tb_gzmx
GROUP BY 挂账单位
ORDER BY 金额 desc) tb1
ORDER BY 金额 |
SELECT deptno,ename,job,sal
FROM EMP
WHERE(deptno,sal) IN (SELECT
deptno,MAX(sal)
FROM EMP
GROUP BY deptno); |
SELECT ename,job,sal
FROM EMP
WHERE deptno in ( SELECT deptno FROM dept WHERE dname LIKE 'A%'); |
--多行子查询
--查询外语成绩大于某值的学生明细信息
SELECT 学生编号
FROM tb_Student
WHERE 外语>80
--查询大于学生的全部信息(IN)
select 学生名字,所在学院,家庭住址
from tb_StuInfo
where 学生编号 in (select 学生编号
from tb_Student
where 外语>80)
--返回月销售不在同类图书前100 名的图书信息(NOT IN)
select *
from tb_BookInfo
where 书号 not in (select 书号
from tb_BookOrder
where 同类图书排名<100)
--显示一班学生总成绩大于二班所有学生总成绩的学生信息(ALL)
select 学生编号,学生姓名,总分
from tb_stuAchievement
where 总分>ALL(
select 总分
from tb_stuAchievement
where 班级='二班')
and
班级='一班'
--查询商品三月份销售额大于当月同类平均销售额的商品信息(ANY/SOME)
select 商品编号,所属类型,商品等级,商品名称,三月
from tb_商品销售
where 三月>ANY(
select AVG(三月)
from tb_商品销售
GROUP BY 所属类型,商品等级)
ANY 的意义和用法
>ANY 表示至少大于条件中的一个值,或一句话说,大于最小值。如 >ANY(1,2,3) 表示 >1
要使用带有 >ANY 的子查询表示要使用某一行满足外部查询中指定的值,引入子查询的列中的值必须至少大于由
子查询返回的值的列表中的一个值。 |
(1)SELECT ename,job,sal,rownum
FROM (SELECT ename,job,sal FROM EMP ORDER BY sal);
(2)SELECT ename,job,sal,rownum
FROM ( SELECT ename,job,sal FROM EMP ORDER BY sal)
WHERE rownum<=5; |
SELECT deptno,job,AVG(sal) FROM EMP GROUP BY deptno,job HAVING AVG(sal)>(SELECT sal FROM EMP WHERE ename='MARTIN'); |
select 人员姓名,年龄
from tb_aMRen
group by 人员姓名,年龄
having 年龄>(select avg(年龄) from tb_aMRen) |
select b.姓名,b.部门,a.salary,b.业绩
form tb_treatment as a ,tb_employee as b
where a.salary in (
select max(salary)
from tb_treatment
where a.name = b.姓名
group by dept
) |
select *
from tb_BookInfo as a
where exists(
select *
from tb_BookOrder as b
where a.书号 = b.书号
and
销售数量 > 400
) |
select *
from tb_商品销售 as a
where mot exists (select *
from tb_商品采购 as b
where a.商品编号 = b.商品编号
and 采购量 < 2000
) |
注意,使用 EXISTS 引入的子查询在下列方面与其他子查询略有不同:
由于通常没有备选的、非子查询的表示法,因此 EXISTS 关键字很重要。尽管一些使用 EXISTS 创建的查询不能以任何其他方法表示,但许多查询都可以使用 IN 或者由 ANY 或 ALL 修改的比较运算符来获取类似结果。
select *
from tb_aMRPay
where 工资月份=10
and 人员姓名 in(
select 负责人
from tb_aMRDe
where 负责人 in(
select 人员姓名
from tb_aMRem
where 学历='本科'))
order by 人员编号 |
select *
from tb_StuMark
where 软件工程 < some(
select 软件工程
from tb_StuMark
where 学生编号 in(
select 学生编号
from tb_StuMark
where 学生编号 between 200941004 and 200941006)) |
update tb_药品销售
set 药品名称=(select 药品名称
from tb_药品登记
where tb_药品销售.药品编号=tb_药品登记.药品编号) |
insert into tb_药品销售(药品编号,药品名称)
(
select 药品编号,药品名称
from tb_药品登记
where 药品编号 NOT IN (
select 药品编号
from tb_药品销售
)
) |
delete tb_药品销售
where 药品编号 IN(
select 药品厂家
from tb_药品登记
where 生产厂家 LIKE '%长春一通%'
) |