肖SIR__数据库之子查询__12.4
一、什么是子查询?
一个查询嵌套另一个查询
例如:题目It技术部入职员工的员工号?
select dept1 from dept where dept_name="iT技术"; #dept 中"iT技术"的编号103
select sid from emp where dept2=103 #103=前面的语句
select sid from emp where dept2=(select dept1 from dept where dept_name="iT技术" )
二、子查询分类?
1、标量子查询 (返回一个值)一行一列
2、列子查询(返回一列多行)
3、行子查询(返回一行,多列)
4、表子查询(返回一个表) 重点
三、详细讲解?
1、标量子查询(返回一个值)
标量子查询,把一个sql执行返回的一个值,作为另一个sql的条件,得到的结果是一行一列,一般出现在where之后
例如:
select sid from emp where dept2=(select dept1 from dept where dept_name="iT技术" )
、
备注点:标量子查询允许使用比较符号
>,< ,=,!=,>=,=< ,<>
2、列子查询(返回一列值)
定义:返回的结果是一列值
select dept1 from dept where dept_name="iT技术" or dept_name="财务" ; #结果:101 ,103
select sid from emp where dept2 in (select dept1 from dept where dept_name="iT技术" or dept_name="财务" )
3、行子查询(返回一行多列)
指子查询返回的结果是一行多列 ,一般出现在where后面
select age,incoming from emp where name="刘十"
select * from emp where (age,incoming) =any (select age,incoming from emp where name="刘十")
4、表子查询(重点)
返回的结果是一个表(多行多列),一般在from 后面
案例1:将两个表合成一个表,在from后面使用
select * from dept as a inner join emp as b on a.dept1=b.dept2 where dept_name='财务'
select max(c.incoming) from (select * from dept as a inner join emp as b on a.dept1=b.dept2 where dept_name='财务')as c
案例2:
select * from (SELECT sid,name,dept_name,dept1 from dept left join emp on dept.dept1=emp.dept2)s ,(SELECT sid,name,dept_name,dept2 from dept left join emp on dept.dept1=emp.dept2)c where s.dept1=c.dept2
and s.dept_name= "财务"
注意:
给表取别名 as 临时表名,as可以省略
生成一个临时表 as 临时表名,as也可以省略
1.列出每个部门的平均收入及部门名称;
2.财务部门的收入总和;
方法1:先合表当作一个临时表,在对临时表的数据进行操作
select sum(incoming) from (select * from dept right join emp on dept.dept1=emp.dept2 ) as a where dept_name='财务'
方法2:先合表在接条件
select sum(incoming) from dept inner join emp on dept.dept1=emp.dept2 where dept_name="财务"
方法3:
Select sum(incoming) from (select * from dept as a left join emp as b on a.dept1=b.dept2 where a.dept_name= "财务");
方法4:
select sum(incoming)from emp where dept2=(select dept1 from dept where dept_name="财务");
3.It技术部入职员工的员工号