4、Oracle表查詢

  1. 基本查詢sql

    1. 查看錶結構    SQL> desc tableName;oracle

    2. 查詢全部列    SQL> select * from tableName;      6.5W條記錄,執行查詢時間 1199s函數

    3. 查詢指定列    SQL> select columnName, columnName, columnName from tableName;  執行時間spa

      上面兩種查詢的不一樣之處:oracle在執行select * 語句的時候會將 * 轉換成 表名.字段名,然後者就沒必要了,因此後者效率會高一些。排序

    4. 取消查詢結果的重複行: SQL> SQL> select distinct columnName, columnName from tableName;字符串

      注:oracle對查詢條件的大小寫是區分的,好比:select * deptno, job from emp where ename = 'smith';it

    5. 使用算數表達式列的別名:select ename "姓名", sal * 12 as "年收入" from emp;io

      列的別名:能夠直接在列後面接別名,或者加 as "別名"table

    6. 處理null值: nvl(sal, 0) 若是sal 值是null,則用0代替效率

    7. 鏈接字符串:SQL> select columnName || 'xxxx' || columnName from tableName;

    8. 使用where子句:  SQL> select columnName, columnName from tableName where xxx = xxx and *** = ***;

      在where 條件中使用 in:SQL> select * from tableName where columnName in (xxx, xxx, xxx);

    9. 使用 like 操做符:% 表示0到多個字符, _ 表示任意單個字符

    10. is null 操做符:SQL> select * from tableName where columnName is null;

    11. order by 子句:SQL> select * from emp order by deptno desc, sal desc;;  降序DESC、默認升序 ASC

    12. 使用列的別名排序:

      SQL> select ename, (sal+nvl(comm, 0))*12 as "YearSal" from emp order by "YearSal" desc;

  2. 複雜查詢:

    1. 分組函數 max, min, avg, sum, count

      分組函數和非分組函數不能同時做爲查詢的列:SQL> select ename, max(sal), min(sal) from emp;   錯誤的,可是能夠出如今group by子句的查詢列中使用:SQL> select deptno, avg(sal) from emp group by deptno having avg(sal) > 2000;

      SQL> select ename, sal from emp where sal = (select max(sal) from emp);

    2. group by 和 having 子句: group by 用於對查詢結果的分組統計,having子句用於限制分組顯示結果。

      對數據分組的總結:

      # 分組函數只能出如今 選擇列、having、order by子句中

      # 若是在select語句中同時包含有group by,having, order by,它們的順序是group by,having,order by

      # 在選擇列種若是有列名、表達式、分組函數,那麼這些 列和表達式必須出如今group by子句中 

          select deptno, job, avg(sal), max(sal) from emp group by job having avg(sal) > 2000

          ORA-00979: 不是group by表達式

  3. 多表查詢:給予兩個和兩個以上的表或是視圖的查詢

    1. 笛卡兒積

      若是兩張表聯合查詢,匹配原則表A的每一條數據去匹配表B的每條數據造成新的結果記錄。因此若是不加限制條件,那麼兩張表查詢的 結果記錄條數= 表A記錄條數 x 表B的記錄條數。以此類推。。

    2. 自鏈接: 在同一張表的鏈接查詢

      如何顯示員工FORD的上級領導姓名: (同一張表能夠看成兩個表來用)

      SQL> select boss.empno, boss.ename from emp worker, emp boss where worker.mgr = boss.empno and worker.ename = 'FORD';

  4. 子查詢:指潛入在其餘sql語句中的select語句,也叫嵌套查詢

    1. 單行子查詢:只返回一行數據的子查詢

      查詢與SMITH同一部門的全部員工:SQL> select * from emp where deptno = (select deptno from emp where ename = 'SMITH');

    2. 多行子查詢:返回多行(單列)數據的子查詢,操做符: in、all、any

      查詢和部門10的工做相同的僱員的名字、崗位、工資、部門號:SQL> select ename, job, sal, deptno from emp where job in (select job from emp where deptno = 10);

      查詢工資比30部門的全部員工工資都高的員工的姓名、工資和部門號:

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

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

    3. 多列子查詢:返回多列的子查詢,

      查詢與SMITH的部門和崗位徹底相同的員工:SQL> select * from emp where (deptno, job) = (select deptno, job from emp where ename = 'SMITH');

  5. Oracle的分頁查詢:三種分頁查詢

    三種查詢從效率上來講,rowid > rownum > row_number() over 函數;以7W條記錄的表來講,rowid 0.03s,rownum 0.1s,row_number() over 1.01s

    1. rowid來分

      步驟1、查詢出rowid 做爲內嵌視圖,能夠按照表內的某個字段排序

                   SQL> select rowid rid, sal from emp order by sal;

      步驟2、利用上面的內嵌視圖查詢出rownum和rid,並用rownum選出N條記錄,將結果做爲內嵌視圖

                   SQL> select rownum rn, rid from (select rowid rid, sal from emp order by sal) where rownum                        <= 10;

      步驟3、再利用上面的內嵌視圖查詢rowid,經過rownum篩選出從第M條開始的記錄,再做爲內嵌視圖

                   select rid from (select rownum rn, rid from (select rowid rid, sal from emp order by sal) where              rownum <= 10) where rn >= 5;

      步驟4、根據上面符合條件的rowid,查詢出符合條件的記錄的列

                   SQL> select * from emp where rowid in (select rid from (select rownum rn, rid from (select                          rowid rid, sal from emp order by sal) where rownum <= 10) where rn >= 5);

    2. rownum來分

      步驟1、查詢出須要的記錄(能夠按字段排序),做爲內嵌視圖

    3.              SQL> select * from emp order by sal;

      步驟2、利用上面的內嵌視圖查詢出rownum,並用rownum選出N條記錄,將結果做爲內嵌視圖

                   SQL> select a.*, rownum rn from (select * from emp order by sal) a where rownum <= 10;

      步驟3、經過rownum篩選出從第M條開始的記錄

                   SQL> select * from (select a.*, rownum rn from (select * from emp order by sal) a where                              rownum <= 10) where rn >= 5;

    4. 按分析函數row_number() over來分,ROW_NUMBER() 就是生成一個有順序的行號,而他生成順序的標準,就是後面緊跟的OVER(ORDER BY ID)

      步驟1、從表中查詢出須要的列,並用函數row_number()獲取行號

                   SQL> select t.*, row_number() over (order by sal) rk from emp t;

      步驟2、利用上面的rk行號獲取相應的M<=X<=N條記錄

                   SQL> select * from (select t.*, row_number() over (order by sal) rk from emp t) where rk <=                          10 and rk >= 5;

    5. 幾個查詢的變化:

       (1). 指定查詢列,只須要修改最裏層的子查詢。

       (2).對查詢結果進行排序、分組等,也是修改最裏層的子查詢。

  6. 合併查詢:有時在實際應用中,爲了合併多個select查詢的結果,可以使用集合操做符號 union, union all,                            intersect, minus

    1. union:該操做符用於取得兩個結果集的並集,自動去掉結果集中的重複行。

    2. union all:與上相同,可是不會取消重複行。

    3. intersect:該操做符用於取得兩個結果集的交集。

    4. minus:該操做符用於取得兩個結果集的差集。只會顯示存在第一個集合,而不存在第二個集合的數據。若是第一個集合比第二個集合小,則會顯示空集。

相關文章
相關標籤/搜索