Oracle查询技巧:ROWNUM分页与多表查询解析

3星 · 超过75%的资源 需积分: 3 7 下载量 45 浏览量 更新于2024-07-27 收藏 653KB PPTX 举报
"韩顺平oracle笔记" 在Oracle数据库中,`ROWNUM`是一个非常重要的概念,它是Oracle为查询结果的每一行分配的行号。在描述的示例中,我们看到如何利用`ROWNUM`来实现分页查询。例如,如果我们要获取雇员表中的第6到第10行记录,可以通过以下两种方式实现: 1. `select * from (select e.*,rownum rn from emp e where rownum<=10) where rn >5;` 2. `select * from (select e.*,rownum rn from (select * from emp) e where rownum<=10) where rn >5;` 这两种方法都是通过先筛选出前10行数据,然后进一步过滤出第6到第10行。其中,外层查询用于过滤行号,内层查询用于获取原始数据。这种方式被称为基于`ROWNUM`的分页,是最快速的方法之一。 Oracle提供了多种分页方式,但`ROWNUM`通常被认为是效率较高的。不过需要注意的是,`ROWNUM`在选择时是按数据读取顺序分配的,因此如果查询中包含排序,可能会导致预期之外的结果。为了避免这种情况,排序应放在内层查询中。 多表查询是数据库操作中的常见操作,它允许从多个表中获取信息。例如,如果我们需要显示雇员名、工资以及他们所在的部门名字,可以使用如下的SQL语句: ```sql select a1.ename, a1.sal, a2.dname from emp a1, dept a2 where a1.deptno = a2.deptno; ``` 这里,`emp`表和`dept`表通过`deptno`字段关联,形成了一个内连接查询,返回了雇员名、工资和部门名的组合。 如果需要对特定部门(例如部门编号为10)的员工信息进行查询,可以添加额外的条件: ```sql select a1.ename, a1.sal, a2.dname from emp a1, dept a2 where a1.deptno = a2.deptno and a1.deptno = 10; ``` 在查询中,我们还可以结合其他表,比如`salgrade`表,来获取员工的工资级别: ```sql select a1.ename, a1.sal, a2.grade from emp a1, salgrade a2 where a1.sal between a2.losal and a2.hisal; ``` 在查询结果中进行排序也很简单,例如按照部门名称降序排列: ```sql select a.ename 雇员姓名, a.sal 雇员工资, b.dname 部门名称 from emp a, dept b where a.deptno = b.deptno order by b.dname desc; ``` 此外,自连接是一种特殊的查询方式,它允许在一个表上执行连接操作。例如,要显示某个员工的上级领导的姓名,我们可以这样写: ```sql select worker.ename, boss.ename from emp worker, emp boss where worker.mgr = boss.empno; ``` 如果要查找特定员工(如FORD)的上级领导,可以在查询中添加额外的条件: ```sql select worker.ename, boss.ename from emp worker, emp boss where worker.mgr = boss.empno AND worker.ename = 'FORD'; ``` 最后,子查询(单行查询)是将一个`SELECT`语句嵌套在另一个`SELECT`语句中,以获取所需的数据。这种技术在复杂查询中非常有用,可以用来过滤、计算或比较数据。例如,如果我们想知道工资高于平均工资的员工,可以使用单行子查询来获取平均工资,然后与主查询比较: ```sql select * from emp where sal > (select avg(sal) from emp); ``` 以上就是关于Oracle数据库中`ROWNUM`的使用,多表查询、自连接以及子查询的一些基本知识。这些技巧对于处理复杂的数据库操作至关重要。