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');