oracle常用函數及關鍵字筆記


--函數及關鍵字--
1.trim,ltrim,rtrim 去除字符,無指定默認去除空格
SELECT TRIM('a' FROM 'aafhfhaaaaaaaa'),
LTRIM('aafhfhaaaaaaaa','a'),
RTRIM('aafhfhaaaaaaaa','a')
FROM dual fhfh, fhfhaaaaaaaa,aafhfh
---以前一直以為只能去除空格,去除某字符都用replace函數替換

2.連接字符串函數:CONCAT函數和||

concat包含兩個參數,多個字符串連接需套用
concat(1,2) 12

3.UPPER,LOWER,INITCAP函數:可以將字符串轉換為全大寫,全小寫,以及首字母大寫(單詞之間用空格分開)

4.LENGTH函數:獲取字符串的字符長度.

5.LPAD,RPAD函數:補位函數,當要顯示的內容長度不足給定長度時,在左面或右面補充若干給定字符以達到長度。若實際顯示的內容超過顯示長度時,會截取實際顯示內容。
select lpad('123',5,'0')|| rpad('54321',3,'0') from dual ---00123543

6.四舍五入,截取,
floor:取整 floor(1234.5678)--1234
round:四舍五入 round(1234.5678,-2)--1200 第二個參數為正向小數點后四舍五入,為負向前,0或沒有取整四舍五入
ceil(1234.5678)--1235 整數返回自己,小數返回大於他自己的最小整數(取整加1)
trunc(1234.5678,-2)trunc(sysdate,'mm') --1200,20170201 對數字根據第二參數截取,正后負前,對時間按第二參數取時間,若是MM(月)取到月初第一天,其他同理
substr(‘12345678’,-5,3)--456 截取第一個參數字符串,從下標為第二個參數開始,以第三個參數為個數取,若第二個為負數則從最后一個開始向前數對應的個數,第二個為0和1都是
從第一個開始,第三個參數可省略
他的兄弟:substrb,substrc,substr2,substr4
7.獲取下標:instr(a,b,c,d)從字符串a中第c位置開始找字符串b,出現的第d次獲取這個下標
他的兄弟:
SELECT INSTR('無言獨上西樓','上') FROM dual; --4
SELECT INSTRB('無言獨上西樓','上') FROM dual; --7 漢字占位多
SELECT INSTRC('無言獨上西樓','上') FROM dual; --4
SELECT INSTR2('無言獨上西樓','上') FROM dual; --4
SELECT INSTR4('無言獨上西樓','上') FROM dual; --4
8.常用類型轉換函數:to_char(),to_date(),to_number()
SELECT to_char(SYSDATE,'yyyymmdd') ,to_date('20150304','yyyymmdd'),to_number('00002001') FROM dual
--20160403 2015/3/4 2001
9.時間函數相關:
sysdate 系統當前時間
yyyy mm dd hh mi ss/yyyy mm dd hh24 mi ss 年月日時分秒
ssss 午夜后的秒
SELECT to_char(SYSDATE,'yyyy'),to_char(SYSDATE,'yyy'),to_char(SYSDATE,'yy'),to_char(SYSDATE,'y') FROM dual 2015 015 15 5

Q 季度
ww 一年中的第幾周
w 一月中的第幾周
ddd 一年中的第幾天
dd 一月中的第幾天
d 一周中的第幾天
CC--世紀

last_day(A):獲取時間A對應月份的最后一天,時分秒不變
next_day(A,3):A本周的下一周的第三天,周日為第一天
add_months(A,1):在時間A的基礎上偏移一個月
months_between(A,B):兩個時間的月份差

10.最小值,最大值
min(A):字段A中的最小值
max(A):字段A中的最大值

LEAST(a,b,c....):取參數中最小值
GREATEST(a,b,c....):取參數中最大值

11.空值函數
空 null 和‘’這里有說null是空,‘’是長度為0的字符串(占位),其實我感覺數據庫對於‘’的處理就是當null處理的,‘’中間是放字符串的,但一個字符串插入到date類型中就會報
錯,如果是個空字符串(‘’)就能正常插入,而且符合 is null 條件,所以我感覺這里討論他們的區別是沒意義的,這里只針對oracle
非空 is not null ,length(A)>0 .......
注:length(A)=0 不能作為空的判斷條件 length(null) 是空 除了處理空函數其他函數同理,數學運算空加減乘除任何數為空

NVL(a,b):如果a為空則取b,不為空取a
NVL2(a,b,c):如果a為空取c,不為空取b
nullif(a,b):a=b 返回空,不等返回a

12.數學函數
abs(a):a的絕對值
power(a,b):a的b次方
sqrt(a):a的平方根
mode(a,b)a除b的余數
13.統計函數
count(A)計數
sum(a)求和
avg(A)平均數
sign(A)A小於0為-1,等於0為0,大於0為1

GROUP BY A :按A值分組
HAVING count(1)>2 :進行分組統計后的條件篩選,比如按家庭分組,每家養豬超過2只 的展示出來

13.查詢交並差集
並集
union 和union all 前面踢重,后面全展示,不踢重
select a from t1
union
select b from t2
交集
intersect
寫法同上
差集 :Minus 第一個查詢中不同於第二個查詢結果的數據
寫法同上

14.模糊查詢 :like
%:字符串,長度任意包括0
_:一個字符

如:like ‘%aa%bb__cc%’ 按順序包含aabbcc且bb和cc間必有2個字符的字符

15.decode(a,b,c,d,e....,g,h,i):如果a等於b取c,否則如果等於d取e..以此類推..
如果最后一個和倒數第二個是因果關系(否則如果等於h取i)則除了括號中列舉外的就取空,decode(1,2,3)=null
如果倒數第二個和倒數第三個是因果關系則除了前面指定的外取最后一個,decode(1,2,3,4)=4

16.字符與十進制數轉換函數

SELECT ASCII('A'),CHR(65) FROM dual --65 A

17.替換 replace
create or replace view v_test 創建一個名叫v_test的視圖,如果已存在將之替換
函數:select replace(a,b,c) 將字符串a中包含字符串b的部分替換為字符串c

18.TRANSLATE(a,b,c):通過b將a中字符替換為c中的字符

將字符串b中字符與字符串c中字符下標一一對應的字符做對應,如果c中沒與之對應的則取空字符,
如果有b中字符有重復,則取第一個對應值,然后再將a字符串中字符與b字符串中字符相同的值替換為c中與b對應值的值

select TRANSLATE('不吃葡萄吐出葡萄皮一顆牙齒一個葡萄皮','葡萄的葡萄牙齒','蘋果汁里有蟲') from dual;
--不吃蘋果吐出蘋果皮一顆蟲一個蘋果皮

葡——蘋
萄——果
的——汁
葡——蘋(原本對應‘里’ ,但是上面已經對應了‘蘋’,可以理解為他在兩個地方發布了征婚,但現在已經和第一個確認婚姻關系了,不能再把這個也拉去當老婆了,但是他的征婚位置還是有效的要收錢的,所以后面的還得跟在他后面發布征婚)
萄——果 (與上同理)
牙——蟲
齒——
----根據以上情況他們幾個字符的關系就是下面這種了,最后替換也就根據下面這種對應來替換a中的字符
葡——蘋
萄——果
的——汁
牙——蟲
齒——

 

20.將一條記錄多條展示
如 有表t_test_dept
deptno name
001 張三,李四,王五
拆分后t_test_dept
deptno name
001 張三
001 李四
001 王五

WITH temp AS
(SELECT dept_no,uname||',' AS uname,(LENGTH(uname)-LENGTH(replace(uname,',')))+1 AS run_times
FROM t_test_dept)
SELECT a.dept_no,regexp_substr(a.uname,'[^,]+',1,b.column_value) VALUE
FROM temp a,
TABLE(CAST(MULTISET (SELECT ROWNUM rn
FROM dual
CONNECT BY Rownum<=a.run_times) AS sys.odcivarchar2list)) b

----------------------
WITH temp AS:相當於創建個臨時表再將數據進行分析處理
regexp_substr:通過匹配的正則動態截取字符串
table:這里將集合當做表
cast:把結果集處理為一個集合
multiset:有了它查詢結果返回為多行,否則為一行
connect by:指定層級父子行關系
as sys.odcivarchar2list: 相當於當做這種結果集

21.將多條記錄合並展示 wm_concat ;listagg(aaa) within group(order by bbb)

deptno name
001 張三
001 李四
001 王五
合並后
deptno name
001 張三;李四;王五

SELECT a.dept_no,REPLACE(replace(wm_concat(a.uname),',',';'),',',';')
FROM T_TEST_DEPT a
GROUP BY a.dept_no

------

SELECT dept_no,replace(listagg(a.uname,';') WITHIN GROUP(ORDER BY NULL),',',';') FROM t_test_dept a
GROUP BY a.dept_no

 22.轉義  escape,將escape前需要處理的字符串中包含其后字符的字符后的一個字符轉義,通常用\

select * from dba_source A
where upper(text) like upper('I\_D%') escape '\'   ---在I\_D中找到 \ ,對 \ 后面的下划線進行轉義,sql使用like 會把下划線當做一個任意字符模糊匹配,轉義后即是下划線這個字符

select * from dba_source A
where upper(text) like upper('Ie_D%') escape 'E'  --以上同理,escape 后面指定的只能是長度為1的字符


免責聲明!

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



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