qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          ORACLE-SQL微妙之處

           本文總結一下平時經常使用的SQL語句以及一些ORACLE函數的微妙之處。歡迎大家多多補充平時最常用的SQL語句,供大家學習參考。
          SQL> select * from temp2;
          NAME            SORCE
          ---------- ----------
          1                  43
          2                  23
          3                  42
          4                  87
          5                  12
          <span style="font-size: 14px;"><strong><span style="color: #ff0000;">1、數據累加</span></strong></span>
          SQL> SELECT NAME, sum(sorce) OVER(ORDER BY NAME)
          2    FROM temp2
          3   ORDER BY NAME;
          NAME       SUM(SORCE)OVER(ORDERBYNAME)
          ---------- ---------------------------
          1                                   43
          2                                   66
          3                                  108
          4                                  195
          5                                  207
          <span style="font-size: 14px;"><strong><span style="color: #ff0000;">2、去掉最大值和最小值</span></strong></span>
          SQL> SELECT NAME,
          2         sorce,
          3         LAG(sorce) over(order by sorce)  Lag_List,
          4         LEAD(sorce) over(order by sorce)  Lead_List
          5    FROM temp2;
          NAME            SORCE        Lag       Lead
          ---------- ---------- ---------- ----------
          5                  12                    23
          2                  23         12         42
          3                  42         23         43
          1                  43         42         87
          4                  87         43
            1、著名分析函數--排序
          SQL> SELECT name,
          2         value,
          3         RANK() OVER(order by value) RANK_SORT,
          4         DENSE_RANK() OVER(order by value) DENSE_SORT,
          5         ROW_NUMBER() OVER(order by value) ROW_SORT
          6    FROM sorce;
          NAME       VALUE       RANK_SORT DENSE_SORT ROW_SORT
          ---------- ------ ---------- ---------- ----------
          wu          21          1          1          1
          zhang       60          2          2          2
          Li          70          3          3          3
          xue         119         5          5          5
          <span style="color: #ff0000;">wang        130         6          6          6
          chen        130         6          6          7
          sun         175         8          7          8</span>
          zhao        285         9          8          9
          su          359         10         9          10
          Li          480         11         10         11<br>
          可見三者的區別:<br>RANK()OVER():如果值相同,則兩者順序號相同,隨機一個在另外一個的上邊,而且順序號會有間斷,不是連續的;<br>DENSE_RANK():如果值相同,則兩者順序號相同,隨機一個在另外一個的上邊,而且順序號仍然是連續的,不存在斷層的現象;<br>ROW_NUMBER():如果值相同,則兩種順序號不同,安裝順序號依次排開,而且順序號是連續的。
            2、TRANSLATE()函數
            translate函數與replace類似,但是又與replace不同,translate指定字符串string中出現的from_str,將from_str中各個字符替換成to_str中位置順序與其相同的to_str中的字符。
            SQL Reference中給的例子:SELECT TRANSLATE('SQL*Plus User''s Guide', ' */''', '___') FROM DUAL;
            巧用:
            (1)判斷一個字符串是數字
            SELECT TRANSLATE('ABC123','#1234567890.','#') FROM DUAL;
            (2)統計字符E出現的次數
            SELECT LENGTHB(TRANSLATE('ABCDEFGEFGDBE','E'||'ABCDEFGEFGDBE','E')) FROM DUAL;
            3、ROUND()函數
            我們平時用得最多的是第一種,用ROUND()函數作為數據四舍五入運算,其實ROUND函數還有第二種形式,對日期進行格式化操作,與TRUNC()函數類似。
            如:SELECT ROUND(SYSDATE,'yyyy') FROM DUAL;
            SELECT ROUND(SYSDATE,'MM') FROM DUAL;
            SELECT ROUND(SYSDATE,'HH24') FROM DUAL;
            4、NVL相關函數
            NVL相關的函數有:NVL(expr1,expr2),NVL2(expr1,expr2,expr3),NULLIF(expr1,expr2),DECODE(expr1,expr2,value1,expr3,value2...,default)
            (1) NVL(expr1,expr2) :如果expr1為空,則用expr2來替換。
            (2) NVL2(expr1,expr2,expr3) :如果expr1非空,則返回expr2,否則返回expr3。
            (3) NULLIF(expr1,expr2):將expr1和expr2做比較,如果想等,則返回null,否則返回expr1。
            (3) DECODE(expr1,expr2,value1,expr3,value2...,default):如果expr1與expr2相等,則返回value1,如果expr1與expr3相等,則返回value2,...否則,返回default。
            5、收集表的統計信息
            收集表的統計信息方法有很多種: (1) ANALYZE  (2) DBMS_STATS
            看起來很繁瑣,其實用起來挺簡單的。
            如對某張表進行分析:
            ANALYZE TABLE TABLE_NAME COMPUTE STATISTICS;
            目前,ORACLE官方推薦第二種方法。在DBMS_STATS包里有很多過程和方法,對SCHEMA、TABLE和INDEX進行收集統計信息相關的操作。
            EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'SCOTT',TABNAME=>'EMP',DEGREE=>4,CASCADE=>'TRUE');

          posted on 2014-06-13 10:10 順其自然EVO 閱讀(171) 評論(0)  編輯  收藏 所屬分類: 數據庫

          <2014年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 阿巴嘎旗| 奉化市| 寿阳县| 灵石县| 吉木萨尔县| 长丰县| 榆树市| 海丰县| 光山县| 新乐市| 东至县| 大竹县| 玉屏| 敖汉旗| 宁国市| 芜湖县| 金华市| 长垣县| 龙口市| 明光市| 安福县| 曲阜市| 扶沟县| 昌邑市| 娱乐| 南澳县| 永修县| 英超| 济阳县| 农安县| 肇庆市| 精河县| 襄樊市| 洛南县| 兴化市| 雷州市| 莱州市| 鲁山县| 隆安县| 鄢陵县| 益阳市|