Oracle的sql常用技巧

1.Oracle產生隨機數     oracle數據庫中有產生隨機數的函數  DBMS_RANDOM

一)生成0到1之間的小數,包括0不包括1

SELECT DBMS_RANDOM.VALUE FROM DUAL;

二)生成隨機正態分佈數

SELECT DBMS_RANDOM.VALUE(0,100) FROM DUAL;    //生成0-100範圍內的小數,包括0不包括100

三)生成指定範圍內的整數

SELECT TRUNC(DBMS_RANDOM.VALUE(0,100)) FROM DUAL;  //生成0-100範圍內的整數,包括0不包括100  

四)   生成正態分佈的隨機數                           

 SELECT DBMS_RANDOM.NORMAL FROM DUAL; 

五)生成隨機字符串                                       

SELECT DBMS_RANDOM.STRING('參數1'  ,  '參數2') FROM DUAL;  

必須要指定兩個參數,參數1用於指定生成隨機字符串的類型,參數2用於指定生成隨機字符串的長度。 其中參數1 的取值有:‘U’ 指生成大寫的字符       ‘L’  指生成小寫的字符        ‘X’ 數字和大寫的字母       ‘A’  大小寫混合的字符        ‘P’ 可打印的字符

例如:    SELECT DBMS_RANDOM.STRING('X', 3) FROM DUAL;     //生成長度爲3的  類型是大寫字母和數字的字符串                                                                                                    

六)生成預期範圍內的日期,比如我想要從2016年1月1日到2016年年底內任意的日期類型的數據,注意沒有時分秒的具體數值。

第一步:    獲得一個2016年1月1日的基數  SELECT TO_CHAR(TO_DATE('01/01/2016','MM/DD/YYYY','J'))                //得到一個2457389基數 

第二步:    SELECT TO_DATE(TRUNC(DBMS_RANDOM.VALUE(2457389,2457389+364)), 'J' ) FROM DUAL;        //得到2016-01-01 至 2016-12-30的隨機日期


2.常用的處理函數

一、        CAST (expression AS data_type)     AS 用於分割兩個數據類型    
例如:    SELECT CAST('15' AS NUMBER) FROM DUAL;

二、        DECODE(EXP,條件1,返回值1,條件2,返回值2,...,默認值)

三、        NVL(EXP,返回值1)  當EXP值爲null時返回值1,不爲null時返回本身   和mysql的IFNULL 函數類似

四、        NVL2(EXP,返回值1,返回值2)   當exp的值爲null時返回值1,不爲null時返回值2

五、        SELECT TO_CHAR(2164364,'FM999,999,999.90') FROM DUAL;  //把前面的數據按後面的類型進行格式化

六、        SELECT EXTRACT(YEAR FROM SYSDATE) FROM DUAL;   //從時間中抽取年份出來
               SELECT EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM TIMESTAMP'2010-11-02 10:20:23') FROM DUAL;   //這個可以系統計算年齡

七、        LPAD(COLUMN,參數1,參數2)
LPAD函數是在column列的前面填充指定長度的指定字符串,參數1是指定長度,參數2是指定要填充的字符,如果指定參數1的長度比column的長度要小則做截取的處理,RPAD是在column列的後面填充 

八、       SELECT RPAD(16464,10,0) FROM DUAL;    //返回結果是1646400000,這個可以做數據的處理

九、       SELECT SYS_GUID()  FROM DUAL;     //返回不重複的32位隨機字符串,可以用作表的主鍵


3.   case   when 函數

Case具有兩種格式。簡單Case函數和Case搜索函數。
--簡單Case函數  
CASE sex  
WHEN '1' THEN '男'  
WHEN '2' THEN '女'  
ELSE '其他' 
END  

--Case搜索函數  
CASE 
WHEN sex = '1' THEN '男'  
WHEN sex = '2' THEN '女'  
ELSE '其他' 
END                                                             
注意:簡單Case函數的寫法相對比較簡潔,但是和Case搜索函數相比,功能方面會有些限制,比如寫判斷式。 

比如可以用case函數統計 分數在一些區間段的 人數的總數                                 
select                                                                                                                         
        case                                                                                                                               
                when tb.score >= 80     then   '優秀'及格                           
                when tb.score <80 and tb.score >= 60    then   '及格'
                else '不及格'
        end   區間,
        concat(count(1),'人')   人數
from tablename tb
group by 
        case
               when tb.score >= 80   then   '優秀'
               when tb.score <80 and tb.score >= 60   then   '及格'
               else   '不及格'
        end;

查詢結果如下顯示:

區間 人數
優秀 10人
及格 6人
不及格 5人

可以對一個表中的不同類型的數據做一個統計
select 
          country,
          sum(case when tb.sex=1 then '1' else '0' end)         男性人口,
          sum(case when tb.sex=2 then '2' else '0' end)         女性人口
from tablename tb
group by country

可以和update結合
update table 
set salary = 
     case  when sarlay >= 8000 then salary*0.90
                when salary <4000 then salary*1015
                else salary 
      end

這樣可以一次就對整張表進行了更新,並且不會有數據前後產生的錯誤性

4. ORACLE的MERGE INTO 用法

 /*語法:
MERGE [INTO [schema .] table [t_alias] 
USING [schema .] { table | view | subquery } [t_alias] 
ON ( condition ) 
WHEN MATCHED THEN merge_update_clause 
WHEN NOT MATCHED THEN merge_insert_clause;

*/


/*語法
MERGE INTO [your table-name] [rename your table here]
USING ( [write your query here] )[rename your query-sql and using just like a table]
ON ([conditional expression here] AND [...]...)
WHEN MATHED THEN [here you can execute some update sql or something else ]
WHEN NOT MATHED THEN [execute something else here ! ]

*/

5.  如何把一個子查詢的多個選擇排成一列顯示

Oracle中提供了兩個函數
一、WMSYS.WM_CONCAT(table_name) 這個函數默認是把查出來的數據用逗號連接  數據類型是<CLOB>類型
例如 表名  table A

ID NAME
1 AA
2 BB
3 CC

SELECT WMSYS.WM_CONCAT(NAME) FROM A      

查詢出來的結果是 AA,BB,CC


SELECT REPLACE(WMSYS.WM_CONCAT(NAME),',','|') FROM A  

查詢出來的結果是AA|BB|CC
 
二、可以使用LISTAGG函數表名B       

dept_no name
10 張三
10 李四
10 王五
20 趙六
20 馬奇
                                                                                                                                                                                                                         
SELECT    DEPT_NO,    LISTAGG(NAME,'|')      WITHIN      GROUP     (ORDER BY NAME)     AS     NAMES      FROM      B      GROUP     BY      DEPT_NO

查詢出來的結果是 dept_no names

dept_no names
10 李四|王五|張三
20 馬奇|趙六

注意:WITHIN GROUP (ORDER BY ***) 字段不能少  這是聚合分析類函數


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章