"韩顺平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`的使用,多表查询、自连接以及子查询的一些基本知识。这些技巧对于处理复杂的数据库操作至关重要。