ORACLE常用函數的使用方法


ORACLE常用函數的使用方法


 

1. 字符串函數

(1) length(); 獲取字符長度
SELECT LENGTH('中國') FROM PLATFORM_METAINFO_TABLES WHERE TABLE_NAME = 'XMBM'  
(2) lengthb(); 獲取字節長度
 SELECT LENGTHB('中國') FROM PLATFORM_METAINFO_TABLES WHERE TABLE_NAME = 'XMBM' (一個漢字等於兩個字節)
(3) ltrim();  除去左邊出現的字符串
SELECT LTRIM(TABLE_NAME) FROM PLATFORM_METAINFO_TABLES WHERE TABLE_NAME = 'XMBM' //除去左邊的空格
SELECT LTRIM(TABLE_NAME, 'XMB') FROM PLATFORM_METAINFO_TABLES WHERE TABLE_NAME = 'XMBM' //除去左邊匹配到的字符XMB
(4) rtrim();  除去右邊出現的字符串
SELECT RTRIM(TABLE_NAME) FROM PLATFORM_METAINFO_TABLES WHERE TABLE_NAME = 'XMBM' //除去右邊的空格
SELECT RTRIM(TABLE_NAME, 'XMB') FROM PLATFORM_METAINFO_TABLES WHERE TABLE_NAME = 'XMBM' //除去右邊匹配到的字符XMB
(5) trim();   一般都是用在刪除字符串兩邊的空格
SELECT TRIM(TABLE_NAME) FROM PLATFORM_METAINFO_TABLES WHERE TABLE_NAME = 'XMBM' //除去字段兩邊出現的空格
SELECT TRIM(LEADING 'M' FROM TABLE_NAME) FROM PLATFORM_METAINFO_TABLES WHERE TABLE_NAME = 'XMBM' //刪除左邊出現的指定的字符M
SELECT TRIM(TRAILING 'M' FROM TABLE_NAME) FROM PLATFORM_METAINFO_TABLES WHERE TABLE_NAME = 'XMBM' //刪除右邊出現的指定的字符M
SELECT TRIM(BOTH 'M' FROM TABLE_NAME) FROM PLATFORM_METAINFO_TABLES WHERE TABLE_NAME = 'XMBM'  //刪除兩邊出現的指定字符M
(6) lpad(string,n,[pad_string]);在字符串左邊填充特定的字符
    String是原始字符串, n 要返回的字符串長度, 從字符串末尾向前數
    當pad_String為null時, 會填充空格
(7) rpad(string,n,[pad_string]);在字符串右邊填充特定的字符
    使用與lpad一樣
(8) substr(); 字符串截取
SELECT SUBSTR(TABLE_NAME, 1 , 4) FROM PLATFORM_METAINFO_TABLES WHERE XMBM = 'XMBM' //截取從索引1開始的4個字符,結合length()函數可實現從左邊截取
SELECT  SUBSTR(TABLE_NAME, length(TABLE_NAME)- 3 + 1,  3) FROM PLATFORM_METAINFO_TABLES WHERE TABLE_NAME = 'XMBM'
2. 時間函數

設置時間格式: ALTER SESSION SET NLS_DATE_FORMAT = 'dd-mon-yyyy HH:mi:ss'
(1) sysdate   //系統時間
(2) current_date   //系統時間
(3) to_char(sysdate, 'yyyy-mm-dd HH24:mi:ss'); //將日期轉為字符串
(4) to_date('2017-09-22 00:00:00', 'yyyy-MM-dd HH24:mi:ss');  //將字符串轉為日期格式
(5) TO_TIMESTAMP();轉為時間戳格式, 使用類似於to_date()
SELECT TO_TIMESTAMP(to_char(SYSDATE, 'yyyy-MM-dd HH24:mi:ss'), 'yyyy-MM-dd HH24:mi:ssxff') FROM  RSGL_RYJBXXB  WHERE XMPY = 'wjw_chengqiong'
時間計算:
 >> 過去一小時/一分鍾/一秒
    SELECT TO_CHAR(to_date('2019/06/04 14:43:51', 'yyyy/MM/dd hh24:mi:ss') - 1/24, 'yyyy/MM/dd hh24:mi:ss') FROM RSGL_RYJBXXB WHERE XMPY = 'wjw_chengqiong'
 >> 過去一天
    SELECT TO_CHAR(SYSDATE - 1, 'yyyy/MM/dd hh24:mi:ss') FROM RSGL_RYJBXXB WHERE XMPY = 'wjw_chengqiong'
 >> 過去一個月
    SELECT add_months(SYSDATE, -1) FROM RSGL_RYJBXXB  WHERE XMPY = 'wjw_chengqiong'

3.聚合函數 

聚合函數不能作為WHERE里的查詢條件出現, 因為聚合函數是對所有查詢結果的運算
  (1) SUM求和
  SELECT SUM(MATTER_CNSX) FROM  SP_MATTERS
  (2) AVG求均值
  SELECT AVG(MATTER_CNSX) FROM  SP_MATTERS  
  (3) MAX和MIN
  SELECT MIN(MATTER_CNSX) FROM  SP_MATTERS  
  (4) NVL null值判斷
  SELECT NVL(MATTER_CNSX, '111111111') FROM  SP_MATTERS  
  (5) ROUND四舍五入
  SELECT ROUND (AVG(MATTER_CNSX)) FROM  SP_MATTERS
  SELECT  round(AVG(MATTER_CNSX) * 100) / 100 FROM  SP_MATTERS  (保留小數點幾位)  
  (6) count(*) 查詢表行數
  (7) count(column) 查詢列行數 , 會忽略null值

4. 關於sql的優化法則 

這些優化方式來源於網友的總結,自己在這里也記錄一下

(1) 盡量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替。
   原因:Oracle在執行IN子查詢時,首先執行子查詢,將查詢結果放入臨時表再執行主查詢。
   而EXIST則是首先檢查主查詢,然后運行子查詢直到找到第一個匹配項。
   NOT EXISTS 比 NOT IN 效率稍高。但具體在選擇IN或EXIST操作時,
   要根據主子表數據量大小來具體考慮。
   SELECT * FROM SP_MATTERS WHERE UUID IN (SELECT UUID FROM SP_MATTERS)
   SELECT * FROM SP_MATTERS WHERE EXISTS (SELECT UUID FROM SP_MATTERS WHERE UUID = SP_MATTERS.UUID)
  (2) 不用"<>"或者"!="操作符, 對於不等於操作符會造成全表掃描, 應該用">" OR "<" 代替
  (3) is null 或者 is not null 條件會造成全表掃描, 解決方案可以為該列設置非空索引,就可以利用其它條件判斷
  (4) 在like后面出現通配符 "%" 或者 "_" 時, 索引會失效, 造成全表掃描
  (5) 對於有連接的列"||",最后一個連接列索引無效, 盡量避免連接, 可以分開連接或者使用不作用在列上的函數替代
  (6) 如果索引不是基於函數的,那么當在where子句中對索引列使用函數時, 索引不再起作用
  (7) 對數據類型不同的列進行比較時,會使索引失效
  (8) >= 比 >的執行效率高, 原因: >= 會通過索引快速定位等於項, 然后再向下掃描, 選出大於項, 而> 直接走全表掃描
  (9) union和union all的區別
    union會對結果進行篩選, 消除重復, 數據量大的情況下可能會引起磁盤排序, 如果不刪除重復記錄
    應該使用union all
  (10) oracle從下到上多個查詢條件時, 應該將過濾量最大的條件放在where子句的末尾
  (11) oracle 從右到左處理from后面的多個表時, 應該將數據量最少的表放在最后
  (12) order by 語句中的非索引列會降低性能, 可以將排序列添加索引
  (13) 當前sql連接多個表時, 使用表的別名, 並將之作為每列的前綴, 這樣可以減少解析時間


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM