qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

          ORACLE-SQL微妙之處

           本文總結(jié)一下平時(shí)經(jīng)常使用的SQL語(yǔ)句以及一些ORACLE函數(shù)的微妙之處。歡迎大家多多補(bǔ)充平時(shí)最常用的SQL語(yǔ)句,供大家學(xué)習(xí)參考。
          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、數(shù)據(jù)累加</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、著名分析函數(shù)--排序
          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>
          可見(jiàn)三者的區(qū)別:<br>RANK()OVER():如果值相同,則兩者順序號(hào)相同,隨機(jī)一個(gè)在另外一個(gè)的上邊,而且順序號(hào)會(huì)有間斷,不是連續(xù)的;<br>DENSE_RANK():如果值相同,則兩者順序號(hào)相同,隨機(jī)一個(gè)在另外一個(gè)的上邊,而且順序號(hào)仍然是連續(xù)的,不存在斷層的現(xiàn)象;<br>ROW_NUMBER():如果值相同,則兩種順序號(hào)不同,安裝順序號(hào)依次排開(kāi),而且順序號(hào)是連續(xù)的。
            2、TRANSLATE()函數(shù)
            translate函數(shù)與replace類(lèi)似,但是又與replace不同,translate指定字符串string中出現(xiàn)的from_str,將from_str中各個(gè)字符替換成to_str中位置順序與其相同的to_str中的字符。
            SQL Reference中給的例子:SELECT TRANSLATE('SQL*Plus User''s Guide', ' */''', '___') FROM DUAL;
            巧用:
            (1)判斷一個(gè)字符串是數(shù)字
            SELECT TRANSLATE('ABC123','#1234567890.','#') FROM DUAL;
            (2)統(tǒng)計(jì)字符E出現(xiàn)的次數(shù)
            SELECT LENGTHB(TRANSLATE('ABCDEFGEFGDBE','E'||'ABCDEFGEFGDBE','E')) FROM DUAL;
            3、ROUND()函數(shù)
            我們平時(shí)用得最多的是第一種,用ROUND()函數(shù)作為數(shù)據(jù)四舍五入運(yùn)算,其實(shí)ROUND函數(shù)還有第二種形式,對(duì)日期進(jìn)行格式化操作,與TRUNC()函數(shù)類(lèi)似。
            如:SELECT ROUND(SYSDATE,'yyyy') FROM DUAL;
            SELECT ROUND(SYSDATE,'MM') FROM DUAL;
            SELECT ROUND(SYSDATE,'HH24') FROM DUAL;
            4、NVL相關(guān)函數(shù)
            NVL相關(guān)的函數(shù)有:NVL(expr1,expr2),NVL2(expr1,expr2,expr3),NULLIF(expr1,expr2),DECODE(expr1,expr2,value1,expr3,value2...,default)
            (1) NVL(expr1,expr2) :如果expr1為空,則用expr2來(lái)替換。
            (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、收集表的統(tǒng)計(jì)信息
            收集表的統(tǒng)計(jì)信息方法有很多種: (1) ANALYZE  (2) DBMS_STATS
            看起來(lái)很繁瑣,其實(shí)用起來(lái)挺簡(jiǎn)單的。
            如對(duì)某張表進(jìn)行分析:
            ANALYZE TABLE TABLE_NAME COMPUTE STATISTICS;
            目前,ORACLE官方推薦第二種方法。在DBMS_STATS包里有很多過(guò)程和方法,對(duì)SCHEMA、TABLE和INDEX進(jìn)行收集統(tǒng)計(jì)信息相關(guān)的操作。
            EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'SCOTT',TABNAME=>'EMP',DEGREE=>4,CASCADE=>'TRUE');

          posted on 2014-06-13 10:10 順其自然EVO 閱讀(171) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 數(shù)據(jù)庫(kù)

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

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類(lèi)

          隨筆檔案

          文章分類(lèi)

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 印江| 云梦县| 南和县| 大安市| 中西区| 武威市| 金溪县| 三江| 丹阳市| 鹤峰县| 华坪县| 阜城县| 江山市| 电白县| 汕头市| 桃江县| 瑞丽市| 鲁甸县| 柳州市| 邳州市| 东海县| 措美县| 大新县| 抚顺市| 城步| 南郑县| 广水市| 安吉县| 二手房| 比如县| 武乡县| 乐昌市| 银川市| 东海县| 华容县| 新丰县| 屏山县| 武定县| 巧家县| 若尔盖县| 博客|