1. 程式人生 > >Oracle學習筆記<3>

Oracle學習筆記<3>

單值函式

1.函式的分類
Oracle資料庫中函式分為兩類:
1)單值函式
n條資料經過函式處理得到n條結果
例如:查詢所有員工last_name,並以全部大寫形式輸出
2)多值函式(組函式)
n條資料經過函式處理可能得到小於n條結果
例如:查詢某班級每個小組的平均成績。
假設某班級48名同學,8人一組分為6組。
計算小組平均成績則需把每個小組的成績相加除以小組人數。
最終,48條資料參與運算,結果只有6條。
多值函式計算時要使用group by根據某個欄位值進行分組,
所以多值函式也稱組函式。

2.啞表--dual
dual是Oracle資料庫中的一張啞表(虛表、偽表)
啞表並非用來儲存資料,所以本質上來講不是一張真正意義的表。


啞表存在的意義僅僅是為了滿足select基本語法結構。
我們在使用select語句計算或處理某些並不來源於某張表的資料時,
就可以使用啞表。
例如:使用select計算1+1:
select 1+1 from dual;
如上所述,1+1並不來源於某張特定的表,但是select又不能缺失from子句。
所以這時候可以使用啞表來補全查詢語句結構。
特點:啞表中始終只有一條資料。

3.單值函式在字串的應用
·LOWER函式 將字串轉換成全部小寫形式
語法:lower(要轉換的字串)
查詢所有員工的last_name,要求全部小寫輸出
select lower(last_name) from s_emp;
·UPPER函式 將字串轉換成全部大寫形式


語法:upper(要轉換的字串)
查詢所有員工的last_name,要求全部大寫輸出
select upper(last_name) from s_emp;
·INITCAP函式 轉換成每個單詞首字母大寫,其餘字母小寫的形式

語法:initcap(要轉換的字串)

查詢所有員工的last_name,要求首字母大寫,其餘字母小寫。

select initcap(last_name) from s_emp;

·CONCAT函式 拼接字串
該函式效果類似||
語法:concat(串1,串2)
注意:Oracle中的concat函式只能有兩個引數,
如果需要拼接多個字串,則需要巢狀使用。
例如:
將'I'、'LOVE'、'CHINA'拼接成一個字串
concat(concat('I','LOVE'),'CHINA')
或者concat('I',concat('LOVE','CHINA'))
如果使用||的話可以直接'I'||'LOVE'||'CHINA'
*Mysql資料庫中可以concat('I','LOVE','CHINA')
·SUBSTR 函式 求子串


String.substring(int beginIndex,int endIndex);
語法:substr(字串,開始位置,長度)
字元索引值從1開始
例如:
'Hello world!'
substr('Hello World',3,5);

·LENGTH 函式 求字串的長度
語法:length(字串)
查詢所有員工的last_name的長度?
select length(last_name) from s_emp;
·NVL函式 處理空值
語法:nvl(要處理的欄位,預設值)
如果查到的欄位值不為空,則取該欄位值
如果為空,則取預設值

4.單值函式在數字的應用
·round函式 四捨五入
執行下列SQL命令,並觀察規律:
select round(45.67,0) from dual; //46
select round(45.67,1) from dual; //45.7
select round(45.67,2) from dual; //45.67
select round(45.67,-1) from dual; //50
select round(45.67,-2) from dual; //0
select round(55.67,-2) from dual; //100
如果只寫一個引數,代表預設保留到個位,即round(45.67,0)
第二個引數代表保留到個位旁邊的第幾位。
負數向左數,正數向右數。
·trunc函式 只舍不取
執行下列SQL命令,並觀察規律:
select trunc(45.67,0) from dual; //45
select trunc(45.67,1) from dual; //45.6
select trunc(45.67,2) from dual; //45.67
select trunc(45.67,-1) from dual; //40
select trunc(45.67,-2) from dual; //0
select trunc(55.67,-2) from dual; //0
·mod函式 取餘
計算1600/300的餘數?
語法:mod(被除數,除數)
select mod(1600,300)
from dual;
結果:100

5.單值函式在日期上的應用
·MONTHS_BETWEEN 函式 計算兩個日期間隔了的月數
查詢2008年8月8號,距現在多少個月?
語法:months_between(日期1,日期2)
select months_between(sysdate,'09-8月-2008')
from dual;
·ADD_MONTHS函式 一個日期加上幾個月之後的日期
語法:add_months(日期,月數)
查詢現在的日期加上三個月?
select add_months(sysdate,3)
from dual;
·NEXT_DAY函式 查詢某個日期之後的下一個星期幾是幾號?
語法:next_day(日期,星期幾)
“星期幾”有兩種表達方式:
1)星期的名字
查詢當前時間的下一個星期一是幾號?
select next_day(sysdate,'星期一')
from dual;
select next_day(sysdate,'monday')
from dual;
注意:不同語言環境下星期的名字寫法。
2)星期的序號
注意:一個星期的第一天是週日。
所以,查詢當前時間的下一個週一日期:
select next_day(sysdate,2)
from dual;
·LAST_DAY函式 查詢某個日期所在月的最後一天
語法:last_day(日期)
查詢當前月的最後一天?
select last_day(sysdate)
from dual;
·ROUND函式 四捨五入
語法:round(日期,取捨規則)
取捨規則:保留哪一位

1)保留到年
原則:根據月份進行判斷,6舍7入
語法:round(日期,'year')
舍:舍到今年的1月1號 00:00:00
入:入到明年的1月1號 00:00:00
查詢當前日期根據年四捨五入的結果?
select round(sysdate,'year')
from dual;
2)保留到月
原則:根據日進行判斷,15舍16入
舍:舍到當前月的1號 00:00:00
入:入到下個月的1號 00:00:00
select round(sysdate,'month')
from dual;
3)保留到日(星期)
原則:根據當前星期數進行計算
取捨到上一個或者下一個星期日
select round(sysdate,'day') from dual;
週日 - 週二 舍 日 一 二
週三 - 週六 入 三 四 五 六
4)預設
select round(sysdate) from dual;
根據當前時間(小時數)進行取捨
在12:00之前的,舍到今天的00:00:00
過了12:00的,入到明天的00:00:00

·TRUNC函式 只舍不取
與ROUND函式使用方法類似,只不過只舍不取。


6.轉換函式的應用
1)to_char函式
a)數字型別轉換成字串
語法:to_char(數字,'fmt')
fmt:格式
select to_char(salary,'$9,999.00')
from s_emp;
0:代表強制補位
9:不會進行部位
,:分割
.:小數位
L:當地的貨幣符號
$:西方人的貨幣符號

b)日期型別轉換成字串
語法:to_char(日期,'fmt')
YYYY 四位數的完整年份
select to_char(sysdate,'YYYY')
from dual;
MM 兩位數的月份數 阿拉伯數字
查詢當前時間?以年和月的形式顯示?
select to_char(sysdate,'YYYY-MM')
from dual;
D 一個星期中的第幾天
查詢當前日期是一週中的第幾天?
select to_char(sysdate,'D')
from dual;
DD 一個月中的第幾天
查詢當前日期,以年/月/日的形式顯示?
select to_char(sysdate,'YYYY/MM/DD')
from dual;

HH 小時
預設為12小時制
HH24
代表24小時制的小時數
MI 分鐘
SS 秒鐘

查詢當前日期,以‘年-月-日 時:分:秒’
select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS')
from dual;
AM/PM
select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS PM')
from dual;

DDD 一年中的第幾天
查詢當前日期是今年的第幾天?
select to_char(sysdate,'DDD')
from dual;
YEAR 年份的數字全稱
select to_char(sysdate,'YEAR')
from dual;
MONTH 月份的完整名字
MON 月份的簡稱 JAN FEB APR MAR MAY
ddsp sp:spelled 一個月中的第幾天用英文拼寫
select to_char(sysdate,'ddsp')
from dual;

ddspth 一個月中的第幾天英文拼寫(序數詞)
select to_char(sysdate,'ddspth')
from dual;
DAY 星期的全稱
DY 星期的簡稱
2)to_number
把字串轉換為數字型別
to_number(字串)
字串中的內容必須是數字
select to_number('1111') from dual;
3)to_date
把字串轉換成日期格式。
'01-FEB-18'
語法:to_date('2018-03-01','yyyy-dd-mm')
'2018-02-03'