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ù)