1. 程式人生 > >資料庫開發(三)函式使用

資料庫開發(三)函式使用

函式: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)
  • 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
  • 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;