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;
- oracle学习之三(多表查询)
- Mybatis学习之路之Oracle多表查询<三>
- Oracle学习笔记(三)多表查询(一)
- [oracle学习笔记]之三:高级查询
- Oracle学习之路(二):oracle多表查询+分组查询+子查询讲解与案例分析+经典练习题
- Oracle数据库学习(三)--基础查询及关联查询
- Oracle学习(3)多表查询
- Oracle学习(5):多表查询
- oracle学习笔记之四 多表查询
- oracle学习之二(数据类型和表的查询)
- 【Oracle学习】之 表的连接查询
- 【Oracle数据库】表查询(三)
- oracle入门之 Select查询语句(三)
- 【Oracle学习】之 子查询
- Oracle学习之分页查询
- oracle 基本语句学习 (三)之子查询
- oracle查询效率(三)
- oracle查询语句(三)
- POJ 3126解题报告
- MySQL修改字段允许为空
- C#序列化和反序列化 .
- 孙鑫vc++ 17 进程间通信(1)剪贴板
- 二叉树的创建,节点删除,节点增加
- oracle学习之三(多表查询)
- 合并C#生成的多个DLL解决方案
- CSDN博客中的演示动画怎么做
- ARM复习题
- VC 坐标体系
- chromium UI库简介
- 2个char类型比较
- Struts2 过滤器与拦截器
- oozie 工作流调度引擎总结(一)