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連接多個表時, 使用表的別名, 並將之作為每列的前綴, 這樣可以減少解析時間
