Oracle學習筆記第一天

 該練習都是oracle自帶的表數據,emp,dept等。oracle

1、優化原則ide

    1.查詢語句儘可能指定列名,避免使用*;函數

    2. WHERE 條件從右到左優化

    3.儘可能使用WHERE,少使用HAVINGspa

    4.多表查詢優於子查詢。code

    5.儘可能不要使用集合運算字符串

2、IN可使用NULL,NOT IN 不可使用NULLit

    在ORACLE中,IN是或邏輯(=1 OR =2 OR =NULL),NOT IN 是與邏輯(=1 AND =2 AND =NULL)。並且ORACLE中任何值AND NULL的值都是爲NULL 或者FALSE。因此,IN能夠簡寫成(=1 OR =2),而NOT IN 返回的都是FALSE 或者NULL。io

 

3、查詢字符串帶有'_'值的模糊查詢date

    例如查詢表emp 中ename含有'_'的值。若是寫:select * from emp where ename like '%_%';  這樣查詢到的結果與想象的不一樣,這個查詢出來的是任意名字,由於'%'表明一個或多個字符串,'_'表明了一個字符串;那麼如何作呢?

    應該先轉義'_',這樣寫就能夠了:select * from emp where ename like '%\_%';

4、ORDER BY 後的條件可使用SELECT-LIST的列名,序號,別名,並且必須是SELECT-LIST中的。

    select empno,ename,sal,sal*12 年薪 from emp order by sal*12 desc;

    select empno,ename,sal,sal*12 年薪 from emp order by 4 desc;

    select empno,ename,sal,sal*12 年薪 from emp order by 年薪 desc;

    注意:若是ORDER BY 後面不止一列,那麼desc只做用於最接近的一列:

        select * from emp  order by deptno ,sal desc

    若是須要都起做用須要都添加desc:

     select * from emp  order by deptno desc,sal desc

    在ORACLE 中,NULL值最大。

5、to_char 將字符串轉換爲你想要的格式

    to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') sysdate獲取的是當前時間。

    SQL> --2014-12-26 15:19:12 今天是星期五
    SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss"今天是"day') from dual;

    SQL> --查詢員工薪水:兩位小數,千位符,貨幣代碼
    SQL> select to_char(sal,'L9,999.99') from emp;

6、條件表達式

    1.三元運算符nvl2(a,b,c) 

    若是a=null時,返回c;a!=null 時,返回b.

    若是某個數+null時,其值會爲null這不是咱們想要的結果,能夠參考以下例子。
    SQL> --nvl2(a,b,c) 當a=null時候,返回c;不然返回b
    SQL> select sal*12+nvl2(comm,comm,0) from emp;

    2.nullif 返回null或者前一個字符串
    SQL> --nullif(a,b) 當a=b時候,返回null,不然返回a
    SQL> select nullif('abc','abc') 值 from dual;

    3.coalesce

    SQL> --coalesce  從左到右 找到第一個不爲null的值
    SQL> select comm,sal,coalesce(comm,sal) "第一個不爲null的值" from emp;

    4.case語句與decode語句

    case語句控制不一樣條件的顯示

     select ename,job,sal 漲前,
          case job when 'PRESIDENT' then sal+1000
                   when 'MANAGER' then sal+800
                    else sal+400
           end 漲後
        from emp;

     使用decode函數表示爲

    select ename,job,sal 漲前,decode(

        job,'president',sal+1000,

             'manage',sal+800,

                          sal+400

    )    漲後 from emp

    使用decode函數的一個例子:根據80號部門員工的工資,顯示稅率

 

  7、分組函數

  定義:分組函數是做用於一組數據的函數,並對一組數據返回一個值。常見的有SUM,COUNT,AVG,MAX,MIN

    注意:where 以後不能跟組函數的條件。

    1.nvl函數:nvl(a,b) 若是a不爲null返回a,不然返回b;

    用法:select count(*),count(nvl(comm,0)) from emp; 這樣就能夠統計包括comm爲null的數量了。

    2.rollup函數 一般用作於報表查詢,返回的數據格式比較好看。以下圖:

      

 

8、多表查詢

    笛卡爾積:笛卡爾積是表的行數相乘的積:如下條件會產生笛卡爾積:

    無條件,條件無效,全部行相互鏈接。

    在oracle中多表查詢方式有等值鏈接,不等值鏈接,外鏈接,自鏈接。

    1.等值鏈接   

    --查詢員工信息 : 員工號 姓名  月薪 部門名稱

    select e.empno,e.ename,e.sal,d.dname  from emp e,dept d  where e.deptno=d.deptno;

    2.不等值鏈接

    --查詢員工信息 : 員工號 姓名  月薪 工資級別

    select e.empno,e.ename,e.sal,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal;

     3.外鏈接

        --按部門統計員工人數: 部門號  部門名稱 人數

     select d.deptno 部門號,d.dname 部門名稱,count(e.empno) 人數 from emp e,dept d where         e.deptno=d.deptno group by d.deptno,d.dname;  這條語句是不對的,由於有一行部門的值並無查詢出來。

        外連接:對於某些不成立的記錄,任然但願包含在最後的結果中

        左外鏈接:當where e.deptno=d.deptno不成立的時候,等號左邊的表任然被包含

        寫法:當但願是包含d表不成立的記錄時:where e.deptno(+)=d.deptno

        寫法:當但願是包含e表不成立的記錄時:where e.deptno=d.deptno(+)

    4. 自鏈接:經過表的別名,將同一張表視爲多張表

        --在一張表中根據關係自連查詢。(與層次相比直觀)

        select a.ename,b.ename from emp a,emp b where a.mgr=b.empno;

        

        注:自鏈接不適合查詢大表。。由於大表的乘積特別大。

        層次查詢:在emp表中,員工的mgr是他頂級上司的員工號 (不會產生笛卡爾積)

        select level(這是一個僞列,若是不指定則不出現),empno,ename,mgr

       connect by prior empno =mgr start with mgr is null order by 1;

        START WITH:指定層級的跟節點行。

        CONNECT BY:指定層級的父行於子行的關係。

             

    

相關文章
相關標籤/搜索