1. 程式人生 > >SQL單行函數和多行函數

SQL單行函數和多行函數

bst 例如 什麽 spa 字節數 default 填充 copyto 最後一天

單行函數和多行函數示意圖:

技術分享圖片

單行函數分為五種類型:字符函數、數值函數、日期函數、轉換函數、通用函數

技術分享圖片

單行函數:

[sql] view plaincopy
  1. --大小寫控制函數
  2. select lower(‘Hello World‘) 轉小寫, upper(‘Hello World‘) 轉大寫 from dual;
  3. --initcap: 首字母大寫
  4. select initcap(‘hello world‘) 首字符大寫 from dual;
  5. --字符控制函數
  6. -- concat: 字符連接函數, 等同於 ||
  7. select concat(‘Hello‘,‘ World‘) from dual;
  8. --substr:求母串中的某個子串
  9. select substr(‘Hello World‘,3) from dual;
  10. select substr(‘Hello World‘,3,4) from dual;
  11. --length和lengthb: 字符數和字節數
  12. select length(‘China‘) 字符數, lengthb(‘China‘) 字節數 from dual;
  13. --instr:在母串中,查找子串的位置
  14. select instr(‘Hello World‘,‘ll‘) from dual;
  15. --lpad,rpad: 左右填充,將abcd用*填充到10位
  16. select lpad(‘abcd‘,10,‘*‘) 左填充, rpad(‘abcd‘,10,‘*‘) 右填充 from dual;
  17. --trim: 去掉字符串前後指定的字符
  18. select trim(‘H‘ from ‘Hello WorldH‘) from dual;
  19. --replace:字符串替換函數
  20. select replace(‘Hello Wordl‘,‘l‘,‘*‘) from dual;
  21. --數字函數
  22. select round(45.926,2) 四舍五入, trunc(45.926,2) 截斷 ,mod(1600,300) 求於 from dual;
  23. --ROUND函數
  24. select round(45.923,0) 整數位, round(45.923,-1) 十位,round(45.923,-2) 百位 from dual;
  25. --日期函數
  26. --顯示當前日期
  27. select sysdate from dual;
  28. --顯示時間部分
  29. select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss‘) from dual;
  30. --顯示昨天,今天和明天,加減數字仍未日期
  31. select sysdate-1 昨天, sysdate 今天, sysdate+1 明天 from dual;
  32. --兩個日期相減,結果為相差的天數,查詢員工信息,顯示員工工齡。兩個日期不能相加
  33. select empno,ename, sysdate-hiredate 天 from emp;
  34. --查詢員工信息,顯示員工工齡,分別按照天,星期,月顯示
  35. select empno,ename,sysdate-hiredate 天,(sysdate-hiredate)/7 星期, (sysdate-hiredate)/30 月 from emp;
  36. --months_between:兩個日期相差的月數
  37. select (sysdate-hiredate)/30 方式一, months_between(sysdate,hiredate) 方式二 from emp;
  38. --add_months:在指定日期上加上若幹個月
  39. select add_months(sysdate,1) 下個月, add_months(sysdate,123) "123個月後" from dual
  40. --last_day: 某個日期當月的最後一天
  41. select last_day(sysdate) from dual;
  42. --next_day:下周六
  43. select next_day(sysdate,‘星期五‘) from dual;
  44. --對日期進行四舍五入
  45. select round(sysdate,‘MONTH‘) 月,round(sysdate,‘YEAR‘) from dual;
  46. --對日期進行截斷
  47. select trunc(sysdate,‘MONTH‘) 月,trunc(sysdate,‘YEAR‘) from dual;
  48. --日期格式
  49. select * from emp where hiredate=to_date(‘1982-01-23‘,‘yyyy-mm-dd‘);
  50. -- 查詢當前日期:顯示: 2011-09-17 15:12:15今天是星期六
  51. select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss"今天是"day‘) from dual;
  52. --查詢員工信息,顯示員工的編號,姓名,月薪,要求有貨幣代碼(L),千位符(,),小數點(.),
  53. select empno,ename,to_char(sal,‘L9,999.99‘) from emp;
[sql] view plaincopy
  1. --通用函數
  2. --nvl(exp1,exp2):當exp1為空時,返回exp2
  3. --nvl2(exp1,exp2,exp3):當exp1為空時,返回exp3;否則返回exp2
  4. select ename,sal*12+nvl2(comm,comm,0) 年收入 from emp;
  5. --NULLIF (expr1, expr2),如果expr1=expr2,返回null;否則,返回expr1
  6. select nullif(‘abc‘,‘abc‘) from dual;
  7. select nullif(‘abc‘,‘abcaa‘) from dual;
  8. --COALESCE :找到參數列表中,第一個不為空的值
  9. select ename,comm,sal,COALESCE(comm,sal) from emp;
  10. --給員工漲工資,根據職位漲,總裁漲1000,經理漲600 其他人員漲400
  11. select ename,job,sal 漲前工資, case job when ‘PRESIDENT‘ then sal+1000
  12. when ‘MANAGER‘ then sal+600
  13. else sal+400
  14. end 漲後工資
  15. from emp;
  16. select ename,job,sal 漲前工資, decode(job,‘PRESIDENT‘,sal+1000,
  17. ‘MANAGER‘,sal+600,
  18. sal+400) 漲後工資
  19. from emp;

(五).轉換函數(Conversion Functions) 轉換函數將指定字符從一種類型轉換為另一種,通常這類函數遵循如下慣例:函數名稱後面跟著待轉換類型以及輸出類型。
1、TO_CHAR() 本函數又可以分三小類,分別是 ? 轉換字符->字符TO_CHAR(c):將nchar,nvarchar2,clob,nclob類型轉換為char類型; 例如:SELECT TO_CHAR(‘AABBCC‘) FROM DUAL;
? 轉換時間->字符TO_CHAR(d[,fmt]):將指定的時間(data,timestamp,timestamp with time zone)按照指定格式轉換為varchar2類型; 例如:SELECT TO_CHAR(sysdate,‘yyyy-mm-dd hh24:mi:ss‘) FROM DUAL;
? 轉換數值->字符TO_CHAR(n[,fmt]):將指定數值n按照指定格式fmt轉換為varchar2類型並返回; 例如:SELECT TO_CHAR(-100, ‘L99G999D99MI‘) FROM DUAL;
2、TO_DATE(c[,fmt[,nls]]) 將char,nchar,varchar2,nvarchar2轉換為日期類型,如果fmt參數不為空,則按照fmt中指定格式進行轉換。註意這裏的fmt參數。如果ftm為‘J‘則表示按照公元制(Julian day)轉換,c則必須為大於0並小於5373484的正整數。 例如: SELECT TO_DATE(2454336, ‘J‘) FROM DUAL; SELECT TO_DATE(‘2007-8-23 23:25:00‘, ‘yyyy-mm-dd hh24:mi:ss‘) FROM DUAL;
為什麽公元制的話,c的值必須不大於5373484呢?因為Oracle的DATE類型的取值範圍是公元前4712年1月1日至公元9999年12月31日。看看下面這個語句: SELECT TO_CHAR(TO_DATE(‘9999-12-31‘,‘yyyy-mm-dd‘),‘j‘) FROM DUAL;
3、TO_NUMBER(c[,fmt[,nls]]) 將char,nchar,varchar2,nvarchar2型字串按照fmt中指定格式轉換為數值類型並返回。 例如:SELECT TO_NUMBER(‘-100.00‘, ‘9G999D99‘) FROM DUAL;
(六).其它輔助函數(Miscellaneous Single-Row Functions)
1、DECODE(exp,s1,r1,s2,r2..s,r[,def]) 可以把它理解成一個增強型的if else,只不過它並不通過多行語句,而是在一個函數內實現if else的功能。 exp做為初始參數。s做為對比值,相同則返回r,如果s有多個,則持續遍歷所有s,直到某個條件為真為止,否則返回默認值def(如果指定了的話),如果沒有默認值,並且前面的對比也都沒有為真,則返回空。 毫無疑問,decode是個非常重要的函數,在實現行轉列等功能時都會用到,需要牢記和熟練使用。
例如:select decode(‘a2‘,‘a1‘,‘true1‘,‘a2‘,‘true2‘,‘default‘) from dual;
2、GREATEST(n1,n2,...n) 返回序列中的最大值 例如:SELECT GREATEST(15,5,75,8) "Greatest" FROM DUAL;
3、LEAST(n1,n2....n) 返回序列中的最小值 例如:SELECT LEAST(15,5,75,8) LEAST FROM DUAL;
4、NULLIF(c1,c2) Nullif也是個很有意思的函數。邏輯等價於:CASE WHEN c1 = c2 THEN NULL ELSE c1 END 例如:SELECT NULLIF(‘a‘,‘b‘),NULLIF(‘a‘,‘a‘) FROM DUAL;
5、NVL(c1,c2) 邏輯等價於IF c1 is null THEN c2 ELSE c1 END。c1,c2可以是任何類型。如果兩者類型不同,則oracle會自動將c2轉換為c1的類型。 例如:SELECT NVL(null, ‘12‘) FROM DUAL;
6、NVL2(c1,c2,c3) 大家可能都用到nvl,但你用過nvl2嗎?如果c1非空則返回c2,如果c1為空則返回c3 例如:select nvl2(‘a‘, ‘b‘, ‘c‘) isNull,nvl2(null, ‘b‘, ‘c‘) isNotNull from dual;
7、SYS_CONNECT_BY_PATH(col,c) 該函數只能應用於樹狀查詢。返回通過c1連接的從根到節點的路徑。該函數必須與connect by 子句共同使用。

多行函數

和單行函數相比,oracle提供了豐富的基於組的,多行的函數。這些函數能在select或select的having子句中使用,當用於select子串時常常都和GROUP BY一起使用。多行函數分為接收多個輸入,返回一個輸出。

組函數:

[sql] view plaincopy
  1. --求員工的工資總和
  2. select sum(sal) from emp;
  3. --求個數
  4. select count(*) from emp;
  5. --求平均工資
  6. select sum(sal)/count(*) 方式一, avg(sal) 方式二 from emp;
  7. --關於空值:組函數會自動濾空
  8. select count(*), count(comm) from emp;
  9. --max和min:求最高工資和最低工資
  10. select max(sal) 最高工資,min(sal) 最低工資 from emp;
  11. --分組數據:求各個部門的平均工資
  12. select deptno,avg(sal) from emp group by deptno;
  13. --group by作用於多列: 按部門,不同的工種,統計平均工資
  14. --group by作用於多列:先按照第一列分組;如果相同,再按照第二列分組
  15. select deptno,job,avg(sal) from emp group by deptno,job;
  16. --:求部門的平均工資大於2000的部門
  17. select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
  18. --group by的增強
  19. select deptno,job,sum(sal) from emp group by rollup(deptno,job);
  20. --不同的deptno空兩行/取消設置
  21. break on deptno skip 2/break on null

SQL單行函數和多行函數