2,关联子查询 对比非关联子查询,掌握语法
案例20 哪些员工的薪水比公司的平均薪水低
公司的平均薪水
//我的解决方法
//我的方法把薪水为0的职工也包括进来了
2.1 关联子查询演示
子查询不再是独立的sql语句,需要依赖查询传来的参数,这种方式叫关联子查询
案例21 哪些员工的薪水比本部门的平均薪水低?不再和整个部门的平均薪水相比
//首先查询单个部门内的平均薪水
//下面是我的错误解法
//正确答案
//感觉该知识还没有掌握了解
//主要是用到主查询传来的参数
//子查询不再是独立的sql语句,需要依赖主查询传来的参数a.deptno
2.2 Exists 关键字
案例22 哪些人是其他人的经理?查找由下述的员工
方法1,使用关联子查询完成
Exists关键字判断子查询有没有数据返回,有则为true,没有返回false
exists 不关心子查询的结果,所以子查询中的select后面写什么都可以
sql 执行顺序从主查询开始,
把主查询中的empno数据传入子查询,作为条件的参数
方法2 普通子查询
//该普通方法不了解mgr是什么意思
//????????????
//mgr的意思是我建的数据库的一个字段,是管理者的意思
案例23 哪些人不是别人的经理
方法1 关联子查询
方法2 普通子查询
案例20 哪些员工的薪水比公司的平均薪水低
公司的平均薪水
select avg(nvl(salary,0))
from emp_xxx;
//我的解决方法
//我的方法把薪水为0的职工也包括进来了
select ename, nvl(salary,0)
from emp_xxx
where nvl(salary,0)<(select avg(nvl(salary,0))
from emp_xxx);
2.1 关联子查询演示
子查询不再是独立的sql语句,需要依赖查询传来的参数,这种方式叫关联子查询
案例21 哪些员工的薪水比本部门的平均薪水低?不再和整个部门的平均薪水相比
//首先查询单个部门内的平均薪水
select deptno,avg(nvl(salary,0))
from emp_xxx
group by deptno;
//下面是我的错误解法
select ename,salary,deptno
from emp_xxx
where salary>(select avg(nvl(salary,0))
from emp_xxx
group by deptno);
group by deptno;
//正确答案
select ename,salary,deptno
from emp_xxx a
where salary<(
select avg(nvl(salary,0))
from emp_xxx
where deptno=a.deptno);
//感觉该知识还没有掌握了解
//主要是用到主查询传来的参数
//子查询不再是独立的sql语句,需要依赖主查询传来的参数a.deptno
2.2 Exists 关键字
案例22 哪些人是其他人的经理?查找由下述的员工
方法1,使用关联子查询完成
select ename
from emp_xxx a
where exists(
select 1 from emp_xxx
where mgr=a.empno);
Exists关键字判断子查询有没有数据返回,有则为true,没有返回false
exists 不关心子查询的结果,所以子查询中的select后面写什么都可以
sql 执行顺序从主查询开始,
把主查询中的empno数据传入子查询,作为条件的参数
方法2 普通子查询
select ename
from emp_xxx
where empno in(
select distinct mgr
from emp_xxx
);
//该普通方法不了解mgr是什么意思
//????????????
//mgr的意思是我建的数据库的一个字段,是管理者的意思
案例23 哪些人不是别人的经理
方法1 关联子查询
select ename
from emp_xxx a
where not exists(
select 1 from emp_xxx
where mgr=a.empno);
方法2 普通子查询
select ename
from emp_xxx
where empno not in(
select distinct mgr
from emp_xxx
where mgr is not null);