資料庫開發(三)函式使用
阿新 • • 發佈:2018-12-01
函式:oracle內建了很多函式
單行函式:作用於一行,一行可以得到一個結果
多行函式(組函式):多行(一組)可以得到一個結果
單行函式:
- 字元函式
- 數值函式
- 日期函式
- 轉換函式
字元函式:
- LOWER:轉換成小寫
- UPPER:裝換成大寫
- INITCAP:每個單詞首字母變大寫,其餘小寫,單詞用空格隔開
- CONCAT:字串連線(拼接)
- SUBSTR(str,start,length):字串的擷取 資料庫中位置從1開始,而不是像程式語言中從1開始
- LENGTH:求字串的長度
- NVL:空值置換
eg1:大小寫轉換
SELECT LOWER('Hello')
FROM dual;
SELECT UPPER('HelloWorld')
FROM dual;
eg2:查詢包含字母b(不區分大小寫)的姓
SELECT last_name
FROM s_emp
--WHERE last_name LIKE '%b%' OR last_name LIKE '%B%'; --此方法字元多時不好用
--WHERE LOWER(last_name) LIKE '%b%';
WHERE UPPER(last_name) LIKE '%B%';
eg3:INITCAP
SELECT INITCAP('hELlo wORld') FROM dual;
eg4: CONCAT:字串連線(拼接)
SELECT CONCAT('aa','bb')
FROM dual;
eg5:SUBSTR(str,start,length):字串的擷取
SELECT SUBSTR('helloworld', 2, 6)
FROM dual;
數值函式:
- ROUND:四捨五入
- TRUNC:擷取,不就行四捨五入
- MOD:取餘
eg1:ROUND
--擷取到小數點後兩位 415.63 SELECT ROUND(415.627, 2) FROM dual; --擷取到整數位 416 SELECT ROUND(415.627, 0) FROM dual; --擷取十位 420 SELECT ROUND(415.627, -1) FROM dual; --預設為0,即整數位 416 SELECT ROUND(415.627) FROM dual;
eg2:TRUNC
--與ROUND的唯一區別是不用進位 415.62
SELECT TRUNC(415.627, 2)
FROM dual;
--擷取到整數位 415
SELECT TRUNC(415.627, 0)
FROM dual;
--擷取十位 410
SELECT TRUNC(415.627, -1)
FROM dual;
--預設為0,即整數位 415
SELECT TRUNC(415.627)
FROM dual;
eg3:MOD
SELECT MOD(15, 8)
FROM dual;
日期函式:
- MONTHS_BETWEEN(date1,date2):求兩個時間月份差,有小數點
- ADD_MONTHS(date, n):給指定時間加n個月
- NEXT_DAY(date,'星期幾'): 中文直接寫星期幾,英文寫對應的單詞
- date之後最近的一個星期幾 (如:下一個星期六是那天)
- LAST_DAY(date),date所在月份的最後一天
- ROUND(date, 精確度):對指定日期進行四捨五入,逢16日往月份進一,逢7月往年份進一
- 精確度:
- year:年
- yyyy:年
- month:月
- mm:月
- dd:日
- hh:小時
- mi:分
- ss:秒
- 精確度:
- TRUNC(date, 精確度):對指定日期進行擷取
- SYSDATE函式:當前系統時間,預設顯示格式 01-SEP-18
- DATE型別:精確到秒
- SYSTIMESTAMP:可以看到更多資訊
- TIMESTAMP:精確到毫秒
eg1:MONTHS_BETWEEN
SELECT MONTHS_BETWEEN('01-NOV-18','30-AUG-18')
FROM dual;
eg2:ADD_MONTHS
SELECT ADD_MONTHS(sysdate,3)
FROM dual;
eg3:
- 增加1年:
SELECT ADD_MONTHS(sysdate,12) FROM dual;
- 增加1天:
SELECT sysdate + 1 FROM dual;
- 增加1小時:
SELECT sysdate + 1/24 FROM dual;
- 增加1分:
SELECT sysdate + 1/24/60 FROM dual;
- 增加1秒:
SELECT sysdate + 1/24/60/60 FROM dual;
eg4:
- NEXT_DAY
SELECT NEXT_DAY(sysdate, 'Thursday') FROM dual;
- LAST_DAY
SELECT LAST_DAY(sysdate) FROM dual;
eg5:ROUND(date, 精確度)
--精確到年,看月,大於7月進位,6月以下捨去
SELECT ROUND(sysdate,'year')
FROM dual;
--精確到月,看日,大於16日進位,15以下捨去
SELECT ROUND(sysdate,'month')
FROM dual;
--精確到日,看小時,大於12小時進位
eg6:TRUNC()
--TRUNC 不進位,都舍掉
SELECT TRUNC(sysdate,'year')
FROM dual;
SELECT TRUNC(sysdate,'month')
FROM dual;
eg7:查詢本月入職的所有員工
- 通用:
WHERE start_date BETWEEN TRUNC(sysdate, 'month') AND sysdate;
- 本年:
WHERE start_date BETWEEN TRUNC(sysdate, 'year') AND sysdate;
- 本週:
--從本週一0時開始 WHERE start_date BETWEEN TRUNC(NEXT_DAY(sysdate-7,'Monday'), 'dd') AND sysdate;
轉換函式:
- 數值<==>文字
- 數值->文字:to_char TO_CHAR(number, 'fmt')
- 佔位符:
- 0:不滿的位用0填充
- 9:整數位不滿用空格填充,小數位用0填充
- 貨幣:$表示美元,L表示本地貨幣單位
- 佔位符:
- 文字->數值:to_number TO_NUMBER(char)
- 數值->文字:to_char TO_CHAR(number, 'fmt')
- eg1:
--用9作佔位符 123456.7890 SELECT to_char(123456.789, '99999999.9999') FROM dual; --用0作佔位符 00123456.7890 SELECT to_char(123456.789, '00000000.0000') FROM dual; --貨幣表示 123,456.7890 SELECT to_char(123456.789, '99,999,999.0000') FROM dual; --美元 $123,456.7890 SELECT to_char(123456.789, '$99,999,999.0000') FROM dual; --當前環境貨幣表示 ¥123,456.7890 SELECT to_char(123456.789, 'L99,999,999.0000') FROM dual; --文字轉數值 123 SELECT to_number('123') FROM dual;
- 時間<==>文字,(掌握)
- 時間->文字:to_char TO_CHAR(number, 'fmt')
- 日期格式模型元素:
- 數字格式(一般使用這個)
- d:星期幾,1~7(星期日到星期六)
- dd:一個月的第幾天
- ddd:一年中的第幾天
- yyyy:四位的年
- mm:兩位的月
- hh24:24進位制的小時
- hh:12進位制的小時
- mi:分
- ss:秒
- rr:兩位的年,50以上表示上個世紀,49以下表示本個世紀(eg:89年為上個世紀)
- yy:兩位的年,和當前時間一個世紀 注:一般推薦使用四位的年
- 英文格式
- year:英文年份
- month:英文月份
- mon:英文月份縮寫
- day:星期幾第幾天
- DY:星期幾的縮寫
- ddsp;英文拼寫的天
- ddspth:英文評選的第幾天
- 數字格式(一般使用這個)
- 日期格式模型元素:
- 文字->時間:to_date
- 時間->文字:to_char TO_CHAR(number, 'fmt')
- eg2:查詢當前系統時間,要求顯示年月日時分秒
--日期格式轉換 2018-11-17 10:53:02 SELECT to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') FROM dual;
- eg3:'1997-01-01':是一個字串,轉換成時間
--字串轉換成時間 01-JAN-97 SELECT to_date('1997-01-01', 'yyyy-mm-dd') FROM dual;