Oracle 第一章 单表查询

第一章 单表查询

1.1 限制返回的行数

比如抽查的时候只返回两条数据。我们可以用伪劣rownum 来过滤,rownum 对返回的每一条数据做了一个标识。

SQL> select * from dept where rownum < 2;

    DEPTNO DNAME                                      LOC
---------- ------------------------------------------ ---------------------------------------
        10 ACCOUNTING                                 NEW YORK

注意两个要点: 1,已返回的数据。 行号依次标识。

我们试着使用rownum =2 去检索一下。

SQL> select * from dept where rownum = 2;

no rows selected
 

rownum 列是Oracle 的伪列,加别名可以使它成为一个表的列

关于rownum 伪列使用特别需要注意的两点:

1,rownum > 时不会产生任何返回行

2, rownum < 和 and 并用时, 是在另一个条件基础上的rownum < ,而不是两个独立条件的并集(intersect)

1.2 列出 emp 表第 5-第 10 名员工(按 sal 大--小排序)的信息(结果集的分页查询技术)

SQL> select * from emp order by sal desc;

     EMPNO ENAME                          JOB                                MGR HIREDATE                  SAL       COMM     DEPTNO
---------- ------------------------------ --------------------------- ---------- ------------------ ---------- ---------- ----------
      7839 KING                           PRESIDENT                              17-NOV-81                5000                    10
      7902 FORD                           ANALYST                           7566 03-DEC-81                3000                    20
      7788 SCOTT                          ANALYST                           7566 19-APR-87                3000                    20
      7566 JONES                          MANAGER                           7839 02-APR-81                2975                    20
      7698 BLAKE                          MANAGER                           7839 01-MAY-81                2850                    30
      7782 CLARK                          MANAGER                           7839 09-JUN-81                2450                    10
      7499 ALLEN                          SALESMAN                          7698 20-FEB-81                1600        300         30
      7844 TURNER                         SALESMAN                          7698 08-SEP-81                1500          0         30
      7934 MILLER                         CLERK                             7782 23-JAN-82                1300                    10
      7521 WARD                           SALESMAN                          7698 22-FEB-81                1250        500         30
      7654 MARTIN                         SALESMAN                          7698 28-SEP-81                1250       1400         30
      7876 ADAMS                          CLERK                             7788 23-MAY-87                1100                    20
      7900 JAMES                          CLERK                             7698 03-DEC-81                 950                    30
      7369 SMITH                          CLERK                             7902 17-DEC-80                 800                    20

14 rows selected.

SQL> select t1.*,rownum as rn from (select * from emp order by sal desc) t1;

     EMPNO ENAME                          JOB                                MGR HIREDATE                  SAL       COMM     DEPTNO         RN
---------- ------------------------------ --------------------------- ---------- ------------------ ---------- ---------- ---------- ----------
      7839 KING                           PRESIDENT                              17-NOV-81                5000                    10          1
      7902 FORD                           ANALYST                           7566 03-DEC-81                3000                    20          2
      7788 SCOTT                          ANALYST                           7566 19-APR-87                3000                    20          3
      7566 JONES                          MANAGER                           7839 02-APR-81                2975                    20          4
      7698 BLAKE                          MANAGER                           7839 01-MAY-81                2850                    30          5
      7782 CLARK                          MANAGER                           7839 09-JUN-81                2450                    10          6
      7499 ALLEN                          SALESMAN                          7698 20-FEB-81                1600        300         30          7
      7844 TURNER                         SALESMAN                          7698 08-SEP-81                1500          0         30          8
      7934 MILLER                         CLERK                             7782 23-JAN-82                1300                    10          9
      7521 WARD                           SALESMAN                          7698 22-FEB-81                1250        500         30         10
      7654 MARTIN                         SALESMAN                          7698 28-SEP-81                1250       1400         30         11
      7876 ADAMS                          CLERK                             7788 23-MAY-87                1100                    20         12
      7900 JAMES                          CLERK                             7698 03-DEC-81                 950                    30         13
      7369 SMITH                          CLERK                             7902 17-DEC-80                 800                    20         14

14 rows selected.

SQL> select * from (select t1.*,rownum as rn from (select * from emp order by sal  desc) t1) where rn between 5 and 10;

     EMPNO ENAME                          JOB                                MGR HIREDATE                  SAL       COMM     DEPTNO         RN
---------- ------------------------------ --------------------------- ---------- ------------------ ---------- ---------- ---------- ----------
      7698 BLAKE                          MANAGER                           7839 01-MAY-81                2850                    30          5
      7782 CLARK                          MANAGER                           7839 09-JUN-81                2450                    10          6
      7499 ALLEN                          SALESMAN                          7698 20-FEB-81                1600        300         30          7
      7844 TURNER                         SALESMAN                          7698 08-SEP-81                1500          0         30          8
      7934 MILLER                         CLERK                             7782 23-JAN-82                1300                    10          9
      7521 WARD                           SALESMAN                          7698 22-FEB-81                1250        500         30         10

6 rows selected.
 

1.3 从表中随机返回n 条记录。

为了防止假象,像上面这样抽查数据还不行,需要随机抽查。我们可以先用dbms_random 来对数据随即排序,然后取其中几行。

SQL> select * 
  2  from (select ename,job from emp order by dbms_random.value())
  3  where rownum <= 5;

为什么要嵌套一层呢?直接使用多条件查询不行吗? 接下来我们证明一下为什么要使用嵌套。

首先使用多条件查询 如下:

SQL> select * from emp where rownum <= 5 order by dbms_random.value;

为了便于观察,我们重新排序一下,(我们根据以下查询结果可知,多条件查询并不能实现随机排序的功能。

SQL> select * from (select * from emp where rownum <= 5 order by dbms_random.value) order by 1;

1.4 将空值转换为实际值(为什么使用coalesce 而不是NVL,因为coalesce 更好用,返回多个值中第一个不为空的值。)

SQL> select coalesce(comm,0) from emp;

SQL> SELECT coalesce(NULL, NULL, NULL, 110, NULL, NULL, 122) AS v FROM dual;

发布了39 篇原创文章 · 获赞 4 · 访问量 3493

猜你喜欢

转载自blog.csdn.net/u011868279/article/details/100170925