子查询
就是一个嵌套在其他语句中被限制的select语句
子查询按照返回值的类型可以分为三种:
(1)返回一张数据表
(2)返回一列值
(3)返回单个值
子查询分为相关子查询和无关子查询
区分方法就是看子查询本身是否执行,无关子查询,整个查询过程子查询只执行一次,然后交给外部查询
相关查询先执行外查询一次,返回一个结果,然后将结果带入子查询,返回结果,传给外查询
左连接left join
如果左表中的某行在右表中没有匹配,则结果中对应行右表中的部分全部为空。此处查询到的行数等于左表的行数
右连接right join
如果右表连接中的某行在左表中没有匹配,则结果中对应的左表的部分全部为空。此处查询到的行数等于右表的行数
内连接inner join
只返回符合条件的行
交叉连接cross join
产生的行数为左表的行数与右表行数的乘积
Group by
出现group by的时候先进行分组
Ed的用法
练习代码
谁挣得钱最多
select t.ename,t.sal from emp t
where t.sal=(select max(p.sal) from emp p)
哪些人的工资位于平均工资之上
select t.ename,t.sal from emp t
where t.sal>(select avg(p.sal) from empp)
相应部门中谁的工资最高
select t.ename,t.sal from emp t
join (select max(p.sal) max_sal,p.deptnofrom emp p group by p.deptno) m
on(t.sal=m.max_sal and t.deptno=m.deptno)
相应部门平均薪水等级
select t.deptno,p.grade from (selectavg(m.sal) avg_sal,m.deptno from emp m group by m.deptno) t
join salgrade p
on (t.avg_sal between p.losal and p.hisal)
求出员工名字和他的经理人名字
select t.ename,p.ename from emp t
left join emp p
on (t.mgr=p.empno)
求出职工以及对应的部门
select t.ename,p.dname from emp t
right join dept p
on (t.deptno=p.deptno)
求部门平均的薪水等级
select m.deptno,avg(m.grade) from
(select t.ename,t.deptno,p.grade from emp t
join salgrade p
on (t.sal between p.losal and p.hisal)) m
group by m.deptno
哪些人是经理人
select t.ename from emp t
where t.empno in (select p.mgr from emp p)
雇员编号出现在了经理人字段
不用组函数求薪水的最大值
(1)
select sal1 max_sal from
(select t.sal sal1,p.sal sal2 from EMP t
left join emp p
on(t.sal
where m.sal2 is null
(2)
select t.sal from emp t
where t.sal not in
(select p.sal from emp p
join emp m
on p.sal 求平均薪水最高的部门的部门编号 select n.deptno from (select avg(t.sal) avg_sal,t.deptno fromEMP t group by t.deptno) n where n.avg_sal= (select max(m.avg_sal) from (select avg(t.sal) avg_sal,t.deptno fromEMP t group by t.deptno) m) 薪水最高的部门的部门名称 select p.dname from dept p where p.deptno=(select n.deptno from (select avg(t.sal) avg_sal,t.deptno fromEMP t group by t.deptno) n where n.avg_sal= (select max(m.avg_sal) from (select avg(t.sal) avg_sal,t.deptno fromEMP t group by t.deptno) m)) 求平均薪水等级最低的部门名称 select q.dname from dept q where q.deptno=(select deptno from (select m.deptno,avg(m.grade) avg_grade from (select t.ename,t.deptno,p.gradefrom emp t join salgrade p on (t.sal between p.losal andp.hisal)) m group by m.deptno) l where l.avg_grade= (select min(avg_grade) from (selectm.deptno,avg(m.grade) avg_grade from (selectt.ename,t.deptno,p.grade from emp t join salgrade p on (t.sal betweenp.losal and p.hisal)) m group by m.deptno))) 求部门中平均薪水最高的那个部门的平均薪水 (组函数嵌套,最多嵌套两层) select max(avg(t.sal)) from emp t group by t.deptno 视图 是一张虚表或者一个子查询