java学习笔记——第7天

子查询

就是一个嵌套在其他语句中被限制的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

 

视图

是一张虚表或者一个子查询

你可能感兴趣的:(java学习笔记——第7天)