oracle学习之三(多表查询)

来源:互联网 发布:网站开发流程 知乎 编辑:程序博客网 时间:2024/06/07 17:54

         对表的查询:
多表查询: 查询的内容在两个表中,可以为两个表分别起一个别名。
                     查询雇员的名称,工资和雇员所在部门,并按部门排序,因为在两个表中,需要表连接。

select a1.ename,a1.sal,a2.dname from emp a1,dept a2 where a1.deptno = a2.deptno order by a1.deptno

多表查询中自连接查询,查询emp中雇员的上级的名称,可以将雇员表看成两个表,一个看成员工表,一个看成上级表。

select worker.ename,boss.ename from emp worker,emp boss where worker.mgr=boss.empno


子查询:
       含有一条记录的子查询:

select * from emp where deptno = (select deptno from emp where ename = 'SMITH')

查询和SMITH在同一个部门的员工的信息
       含有多条记录的子查询:

select * from emp where job in (select distinct job from emp where deptno = 10)

查询从事10号部门所有的工作的职员的信息。子查询返回多条记录的话,要使用“in”不可以使用“=”。
查询工资比部门30的所有员工的工资还高的员工的姓名,工资和部门号

select ename,sal,deptno from emp where sal > all(select sal from emp where deptno=30);

同样可使用

select ename,sal,deptno from emp where sal > (select max(sal) from emp where deptno = '30');

使用max函数效率高,尽量使用这个,因为max函数只比较一次。
查询工资比部门30的任意一个员工的工资高的员工的姓名,工资和部门号
select ename,sal,deptno from emp where sal > any(select sal from emp where deptno = 30);

同样可使用

select ename,sal,deptno from emp where sal > (select min(sal) from emp where deptno = 30);

多列子查询
查询和SMITH在同一个部分,从事相同工作的员工的信息

select * from emp where (deptno,job) = (select deptno,job from emp where ename = 'SMITH');

查询高于自己部门平均工资的员工的姓名,薪水,部门号和所在部门的平均工资。
这样我们可以先查询各个部门的平均工资,方法如下:

select deptno,avg(sal) as mysal from emp group by deptno;

这样查询的结果为部门号和它对应的平均工资,这样就可以把它看成一张表,和emp表多表查询,这样条件就可以加上去了,分步解答可以使问题明了,这个题目中用到了将结果看成一张表,也称为内嵌视图.

select a1.ename,a1.sal,al.deptno,a2.mysal from emp a1,(select deptno,avg(sal)as mysal from emp group by deptno) a2 where a1.deptno = a2.deptno and a1.sal > a2.mysal;

给列取别名,可以加as,但是给表取别名,最好不要加as。
oracle中的分页使用子查询
分页第一步:建立子查询,获得内嵌视图

select * from emp;

然后通过内嵌视图,获得它的全部内容和rownum。

select a1.*,rownum rn from (select * from emp) a1;

这样就可以使用条件进行分页了,获得第六条到第十条的内容,如下:
第一步先获得前十条的内容:

select a1.*,rownum rn from (select * from emp) a1 where rownum <= 10;

接下来再取得第六条到第十条的内容:

select * from(select a1.*,rownum rn from (select * from emp) a1 where rownum <= 10)where rn >= 6;

oracle中使用二分机制,不可同时写出小于10大于6.
如果查询的内容不是全部,而只是几项的话,只需改动最里层的子查询,即select * from emp;
如果查询的结果需要先排序,然后再分页,也是只需改动最里面的子查询,如下:

select ename,sal,deptno from emp order by sal;