寫在前面:
單行函數的概念:
單行函數:接受一個數據,輸出一個數據;
多行函數:聚合函數,分組函數。接受一組數據,輸出一個數據。
常見字符函數
大小寫相關: LOWER , UPPER , INITCAP
其他:TRIM , LTRIM , RTRIM , LPAD , PPAD , INSTR , SUBSTR , LENGTH , CONCAT , REPLACE
- LOWER會將所有字符轉換爲小寫
- UPPER會將所有字符轉換爲大寫
- INITCAP會將首字母轉換爲大寫
example:
SELECT lower('Hello'),upper('Hello'),initcap('Hello')
FROM dual;
- TRIM從字符串的首尾去掉特定字符
- LTRIM從字符串的首部去掉特定字符
- RTRIM從字符串的尾部去掉特定字符
example:
SELECT trim('H' FROM 'HelloHH'), ltrim('HelloHH', 'H'),rtrim('HelloHH', 'H')
FROM dual;
- LPAD向左補齊
- PPAD向右補齊
grammar : lpad(數值,多少位,填充內容) rpad(數值,多少位,填充內容)
example :
SELECT lpad(1000,7,'*'),rpad(1000,7,'*')
FROM dual;
- INSTR 查找字符串的位置(注意:在Oracle中,字符串的位置是從1開始的)
grammar : instr(原來的字符串,要查找位置的字符串)
example :
SELECT instr('hello tom','tom')
FROM dual;
- SUBSTR 求字串,從某個位置到開始截取一定長度
grammar : substr(字符串,從哪個位置開始截取,截取多少個字符[不寫則截取到最後一個])
example:
SELECT substr('hello',3,2)
FROM dual;
- LENGTH 求字符串的長度
example :
SELECT length('tom')
FROM dual;
- CONCAT 連接兩個字符串
example :
SELECT concat('tom','my')
FROM dual;
- REPLACE替換字符串
example:
SELECT replace('hello','h','xxx')
FROM dual;
常用字符函數例子整合:
SELECT lower('Hello'),upper('Hello'),initcap('Hello')
FROM dual;
SELECT trim('H' FROM 'HelloHH'), ltrim('HelloHH', 'H'),rtrim('HelloHH', 'H')
FROM dual;
SELECT lpad(1000,7,'*'),rpad(1000,7,'*')
FROM dual;
SELECT instr('hello tom','tom')
FROM dual;
SELECT substr('hello',3,2)
FROM dual;
SELECT length('tom')
FROM dual;
SELECT concat('tom','my')
FROM dual;
SELECT replace('hello','h','xxx')
FROM dual;
常見數值函數
- ROUND四捨五入
example :
SELECT round(123.456,2),round(123.456,-2),round(123.45,0),round(123.456)
FROM dual;
round(123.456,2)小數點兩位後四捨五入
round(123.456,-2)小數點前兩位四捨五入
round(123.45,0)按照小數點四捨五入
round(123.456)與round(123.456,0)相同
- TRUNC去尾
example :
SELECT trunc(12.456,2),trunc(123.456,-2),trunc(123.45,0),trunc(123.456)
FROM dual;
trunc(12.456,2)小數點後保留兩位
trunc(123.456,-2)小數點前保留兩位
trunc(123.45,0)按照小數點保留
trunc(123.456)與trunc(123.456,0)相同
- MOD求模
example :
SELECT mod(12,5)
FROM dual;
常用數值函數例子整合:
SELECT round(123.456,2),round(123.456,-2),round(123.45,0),round(123.456)
FROM dual;
SELECT trunc(12.456,2),trunc(123.456,-2),trunc(123.45,0),trunc(123.456)
FROM dual;
SELECT mod(12,5)
FROM dual;
常見日期函數
- SYSDATE獲取系統當前日期
example :
SELECT sysdate
FROM dual;
- MONTHS_BETWEEN獲取兩個日期間的相差月數
example : 獲取emp表中員工的入職日期到今天相差的月數
SELECT ename,months_between(sysdate,hiredate)
FROM emp;
- ADD_MONTH獲取幾個月後的日期
exmaple : 獲取三個月以後的日期
SELECT add_months(sysdate,3)
FROM dual;
- LAST_DAY獲取本月最後一天的日期
example :
SELECT last_day(sysdate)
FROM dual;
- EXTRACT從日期中獲取某一部分值
example : 獲取當前日期的年份
SELECT extract(YEAR FROM sysdate)
FROM dual;
example : 獲取當前日期的月份
SELECT extract(MONTH FROM sysdate)
FROM dual;
example : 獲取當前日期的號數
SELECT extract(DAY FROM sysdate)
FROM dual;
常見日期函數例子整合:
SELECT sysdate
FROM dual;
SELECT ename,months_between(sysdate,hiredate)
FROM emp;
SELECT add_months(sysdate,3)
FROM dual;
SELECT last_day(sysdate)
FROM dual;
SELECT extract(YEAR FROM sysdate)
FROM dual;
SELECT extract(MONTH FROM sysdate)
FROM dual;
SELECT extract(DAY FROM sysdate)
FROM dual;
常見轉換函數
- TO_CHAR將日期或數值轉換爲指定格式的字符
example : 將日期轉換爲指定格式的字符
SELECT to_char(sysdate,'YYYY-MM-DD DAY HH24:MM:SS')
FROM dual;
example : 將數值轉換爲指定格式的字符
SELECT to_char(123.45,'L9,999,999.00')
FROM dual;
其中L表示當地字符,00 表示小數點後如果沒有兩位小數,則用0填充
- TO_DATE將指定格式字符轉換爲日期
example :
SELECT to_date('1980-01-01','YYYY-MM-DD')
FROM dual;
- TO_NUMBER將指定格式字符串轉換爲數值
example :
SELECT to_number('$1,222.34','$9,999.99')
FROM dual;
常見轉換函數例子整合:
SELECT to_char(sysdate,'YYYY-MM-DD DAY HH24:MM:SS')
FROM dual;
SELECT to_char(123.45,'L9,999,999.00')
FROM dual;
SELECT to_date('1980-01-01','YYYY-MM-DD')
FROM dual;
SELECT to_number('$1,222.34','$9,999.99')
FROM dual;
其他函數
空值轉換函數:
- NVL字段爲空,則用相同類型替代
example :
SELECT ename,comm,nvl(comm,0)
FROM emp;
如果字段comm爲空,則用與comm數值類型相同的0代替
- NVL2如果字段爲空,則返回第二個參數,反之則返回第三個參數
example :
SELECT ename,comm,nvl2(comm,0,sal)
FROM emp;
如果comm字段爲空,則用0代替,如果不爲空,則用sal代替
- NULLIF兩個字段相同,則爲空,否則返回第一個參數的值
exmaple :
SELECT nullif('123','123')
FROM dual;
控制轉換函數例子整合:
SELECT ename,comm,nvl(comm,0)
FROM emp;
SELECT ename,comm,nvl2(comm,0,sal)
FROM emp;
SELECT nullif('123','123')
FROM dual;
條件分支函數
- CASE
example :
SELECT ename, deptno, sal,
CASE deptno
WHEN 10 THEN sal + 100
WHEN 20 THEN sal + 200
WHEN 30 THEN sal + 300
ELSE sal END AS salary
FROM emp;
- DECODE
example : 按照部門號碼進行薪資的增加,部門號爲10,薪資增加100,部門號爲20薪資增加200,部門號爲30,薪資增加300,其他則沒有變化
SELECT ename, deptno, sal,
decode(deptno,
10,sal + 100,
20,sal + 200,
30,sal + 300,
sal) AS salary
FROM emp;
SELECT ename, deptno, sal,
CASE
WHEN deptno = 10 THEN sal +100
WHEN deptno = 20 THEN sal +200
WHEN deptno = 30 THEN sal +300
ELSE sal END AS salary
FROM emp;
decode是一個函數, case是一個表達式
但是case有更強大的能力
條件分支函數例子整合:
SELECT ename, deptno, sal,
decode(deptno,
10,sal + 100,
20,sal + 200,
30,sal + 300,
sal) AS salary
FROM emp;
SELECT ename, deptno, sal,
CASE deptno
WHEN 10 THEN sal + 100
WHEN 20 THEN sal + 200
WHEN 30 THEN sal + 300
ELSE sal END AS salary
FROM emp;
SELECT ename, deptno, sal,
CASE
WHEN deptno = 10 THEN sal +100
WHEN deptno = 20 THEN sal +200
WHEN deptno = 30 THEN sal +300
ELSE sal END AS salary
FROM emp;