第14章Oracle中的函數(shù)與表達(dá)式ppt課件_第1頁
第14章Oracle中的函數(shù)與表達(dá)式ppt課件_第2頁
已閱讀5頁,還剩64頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第14章 Oracle中的函數(shù)與表達(dá)式Oracle中提供了大量的內(nèi)置函數(shù),以處置各種方式的運(yùn)算。這些函數(shù)涵蓋了字符串運(yùn)算、數(shù)值運(yùn)算、日期運(yùn)算等方面。同樣,Oracle允許運(yùn)用數(shù)值運(yùn)算、邏輯運(yùn)算等根本的表達(dá)式運(yùn)算,另外,提供了SQL規(guī)范所規(guī)定的特殊判式。Oracle中的字符串函數(shù);Oracle中的數(shù)學(xué)函數(shù);Oracle中的日期函數(shù);第14章 Oracle中的函數(shù)與表達(dá)式Oracle中的聚合函數(shù);Oracle中的運(yùn)算表達(dá)式;Oracle中的特殊判式;Oracle中的高級(jí)函數(shù)分析函數(shù)與窗口函數(shù)。14.1 Oracle中的字符串函數(shù)Oracle提供了豐富的字符串函數(shù),本小節(jié)將經(jīng)過實(shí)例講述Oracle中

2、各字符串函數(shù)的運(yùn)用。14.1.1 lpad()函數(shù)lpad()函數(shù)用于左補(bǔ)全字符串。在某些情況下,預(yù)期的字符串為固定長度,而且格式一致,此時(shí)可以思索運(yùn)用lpad()函數(shù)。例如,深市股票代碼都以0開頭,并且都為6位,可以利用lpad格式化股票代碼,以保證股票代碼的格式。select lpad(21,6,0) stock_code from dual;需求留意的是,當(dāng)原字符串的長度大于預(yù)期長度時(shí),實(shí)踐進(jìn)展的是截取字符串操作。select lpad(1234567,6,0) stock_code from dual;14.1.2 rpad()函數(shù)與lpad()函數(shù)相反,rpad()函數(shù)從右端補(bǔ)齊字符

3、串。select rpad(abc, 10, *) from dual; 留意與闡明:lpad()和rpad()都用于填充字符串,lpad()從左端進(jìn)展填充,而rpad()從右端進(jìn)展填充,但是,二者在最終截取字符串時(shí),都是從左端開場截取。select rpad(abcdefg, 6, *) from dual;14.1.3 lower()函數(shù)前往小寫字符串lower()函數(shù)用于前往字符串的小寫方式。lower()函數(shù)在查詢語句中經(jīng)常扮演重要角色。例如,對(duì)于用戶名和密碼的校驗(yàn)來說,用戶名普通并不區(qū)分大小寫,用戶無論輸入了大寫還是小寫方式,都被以為是合法用戶。因此,在數(shù)據(jù)庫查詢時(shí),應(yīng)該將數(shù)據(jù)庫中用

4、戶名與用戶輸入的用戶名進(jìn)展一致。select user_id, user_name from t_users where lower(user_name) = lower(Alex);14.1.4 upper()函數(shù)前往大寫字符串upper()函數(shù)用于前往字符串的大寫方式。與lower()函數(shù)類似,upper()函數(shù)也可以用在查詢語句中,以一致數(shù)據(jù)庫和查詢條件的一致性。select user_id, user_name from t_users where upper(user_name) = upper(ALEX);留意與闡明:upper()函數(shù)和lower()函數(shù)只針對(duì)英文字符其作用,由于

5、只需英文字符才有大小寫之分。14.1.5 initcap ()函數(shù)單詞首字母大寫initcap()函數(shù)將單詞的首字母大寫。select initcap(big) from dual;需求留意的是,initcap()函數(shù)不能自動(dòng)識(shí)別單詞 select initcap(bigbigtiger) from dual;initcap()函數(shù)會(huì)將參數(shù)中的非單詞字符作為單詞分隔符select initcap(big_big_tiger) from dual; select initcap(big/big/tiger) from dual; select initcap(big big tiger) fro

6、m dual; 14.1.6 length()函數(shù)前往字符串長度length()函數(shù)用于前往字符串的長度。select length(abcd ) from dual;空字符串的長度不是0,而是null。由于空字符串被視作null,所以,length(null)前往的依然是null。select length() from dual;對(duì)其其他數(shù)據(jù)類型,照樣可以經(jīng)過length()函數(shù)來獲得其長度。length()函數(shù)會(huì)首先將參數(shù)轉(zhuǎn)換為字符串,然后計(jì)算其長度。select length(12.51) from dual;14.1.7 substr()函數(shù)截取字符串substr()函數(shù)用于截取字符

7、串。該函數(shù)可以指定截取的起始位置,截取長度,可以實(shí)現(xiàn)靈敏的截取操作,因此,成為字符串操作中最常用的函數(shù)之一。例如,對(duì)于字符串“1234567890,現(xiàn)欲截取自第5位開場的4個(gè)字符。select substr(1234567890, 5, 4) from dual;需求留意的是,Oracle中字符位置從1開場,而不是像某些編程言語如Java那樣從0開場。 假設(shè)不指定長度,那么substr()函數(shù)將獲取起始位置參數(shù)至字符串結(jié)尾處的一切字符。 select substr(1234567890, 5) from dual; 14.1.8 instr()函數(shù)獲得字符串出現(xiàn)的位置instr()函數(shù)用于獲得

8、子字符串在父字符串中出現(xiàn)的位置。select instr(big big tiger, big) from dual;可以指定額外的參數(shù),以命令該函數(shù)從指定位置開場搜索。 select instr(big big tiger, big, 2) from dual; 還可以指定出現(xiàn)次數(shù)參數(shù),以指定是第幾次搜索到子字符串。select instr(big big tiger, big, 2, 2) from dual;14.1.9 ltrim()函數(shù)刪除字符串首部空格ltrim()中的l代表left。該函數(shù)用于刪除字符串左端的空白符。select ltrim( abc) from dual; 需求

9、留意的是,空白符不僅僅包括了空格符,還包括TAB鍵、回車符和換行符。14.1.10 rtrim()函數(shù)刪除字符串尾部空格rtrim()中的r代表right。該函數(shù)用于刪除字符串右端空白符。刪除字符串首尾空白符可以結(jié)合運(yùn)用ltrm()和rtrim()函數(shù)。select rtrim(ltrim( abc ) from dual;14.1.11 trim()函數(shù)刪除字符串首尾空格trim()函數(shù)可用于刪除首尾空格,相當(dāng)于ltrim()和rtrim()的組合。select trim( abc ) from dual;14.1.12 to_char()函數(shù)將其他類型轉(zhuǎn)換為字符類型to_char()函數(shù)用

10、于將其他數(shù)據(jù)類型的數(shù)據(jù)轉(zhuǎn)換為字符型,這些類型主要包括數(shù)值型、日期型。1. 將數(shù)值型轉(zhuǎn)換為字符串select to_char(120, 99999) result from dual; select to_char(0.96, 9.99) result from dual; select to_char(0.96, 0.00) result from dual; select to_char(5897.098, 999,999,999.000) result from dual; select to_char(5987.098, $999,999,999.000) result from dua

11、l;2. 將日期型轉(zhuǎn)換為字符串select to_char(sysdate, yyyy-mm-dd) result from dual; select to_char(sysdate, YYYY-MON-DD) from dual; 14.1.13 chr()函數(shù)將ascii碼轉(zhuǎn)換為字符串chr()函數(shù)用于將ascii碼轉(zhuǎn)換為字符串。經(jīng)過chr()函數(shù),可以對(duì)不宜直接輸入的字符進(jìn)展操作。例如,將回車換行符插入到數(shù)據(jù)中。insert into test_data values (6, 周林|chr(13)|chr(10)|梁軍, 20); select * from test_data wher

12、e id = 6; 14.1.14 translate()函數(shù)交換字符translate()函數(shù)用于交換字符串。交換的規(guī)那么類似于翻譯的過程。 select translate(56338, 1234567890, avlihemoqr) result from dual;需求留意的是,當(dāng)字符不能被勝利“翻譯,那么,Oracle將運(yùn)用空字符交換它。利用此特性,可以運(yùn)用translate()函數(shù)來刪除一個(gè)含有數(shù)字和英文字母的字符串中的一切字母:select translate(21343yuioioizf899dasiwpe58595oda0j098, #abcdefghijklmnopqrst

13、uvwxyz, ) reulst from dual; 14.2 Oracle中的數(shù)學(xué)函數(shù)Oracle提供的數(shù)學(xué)函數(shù)可以處置日常運(yùn)用到的大多數(shù)數(shù)學(xué)運(yùn)算。本小節(jié)將講述Oracle中常用的幾種數(shù)學(xué)函數(shù)。14.2.1 abs ()函數(shù)前往數(shù)字的絕對(duì)值abs()函數(shù)的參數(shù)只能是數(shù)值型,該參數(shù)用于前往參數(shù)的絕對(duì)值。select abs(-2.1) from dual; 14.2.2 round ()函數(shù)前往數(shù)字的“四舍五入值round()函數(shù)用于前往某個(gè)數(shù)字的四舍五入值。為了運(yùn)用該函數(shù),除了提供原始值之外,還應(yīng)提供準(zhǔn)確到的位數(shù)。準(zhǔn)確位數(shù)可以為正整數(shù)、0和負(fù)整數(shù)。select round(2745.173

14、, 2) result from dual; 假設(shè)不運(yùn)用第二個(gè)參數(shù),那么,相當(dāng)于運(yùn)用了參數(shù)0,即準(zhǔn)確到整數(shù)。select round(2745.173) result from dual; 假設(shè)第二個(gè)參數(shù)為負(fù)數(shù),那么,相當(dāng)于將數(shù)值準(zhǔn)確到小數(shù)點(diǎn)之前的位數(shù)。 select round(2745, -1) result from dual; 14.2.3 ceil()函數(shù)向上取整ceil()函數(shù)只能有一個(gè)參數(shù)。該函數(shù)將參數(shù)向上取整,以獲得大于等于該參數(shù)的最小整數(shù)。select ceil(21.897) result from dual; 需求留意的是該函數(shù)針對(duì)負(fù)數(shù)的運(yùn)算: select ceil(-

15、21.897) result from dual; 由于ceil()函數(shù)前往的是大于等于參數(shù)的最小整數(shù),所以,該函數(shù)前往的并非-22,而是-21。14.2.4 floor()函數(shù)向下取整與ceil函數(shù)相反,floor()函數(shù)用于前往小于等于某個(gè)數(shù)值的最大整數(shù)。select floor(21.897) result from dual; select floor(-21.897) result from dual;14.2.5 mod ()函數(shù)取模操作mod()函數(shù)有兩個(gè)參數(shù),第一個(gè)參數(shù)為被除數(shù),第二個(gè)參數(shù)為除數(shù)。mod()函數(shù)的實(shí)踐功能為獲得兩數(shù)相除之后的余數(shù)。select mod(5,2)

16、result from dual; 14.2.6 sign()函數(shù)前往數(shù)字的正負(fù)性sign()函數(shù)只需一個(gè)參數(shù)。該函數(shù)將前往參數(shù)的正負(fù)性。假設(shè)前往值為1,表示該參數(shù)大于0;假設(shè)前往值為-1,表示該參數(shù)小于0;假設(shè)前往值為0,表示該參數(shù)等于0。select sign(8) result from dual; select sign(-8) result from dual; select sign(0) result from dual; sign()函數(shù)為判別兩個(gè)數(shù)值的大小關(guān)系提供了方便。由于在oracle中,利用類似if else的構(gòu)造來判別兩個(gè)數(shù)值之間的大小關(guān)系,并不像編程言語中那樣方便,

17、而且極易呵斥代碼的復(fù)雜化。14.2.7 sqrt()函數(shù)前往數(shù)字的平方根sqrt()函數(shù)也只需一個(gè)參數(shù)。該函數(shù)用于前往參數(shù)的平方根??梢岳胷ound()函數(shù)和sqrt()函數(shù)前往某個(gè)數(shù)值的近似平方根。select round(sqrt(2), 3) result from dual; 14.2.8 power()函數(shù)乘方運(yùn)算power()函數(shù)有兩個(gè)參數(shù)。該函數(shù)用于實(shí)現(xiàn)數(shù)值的乘方運(yùn)算。select power(6, 2) result from dual; 14.2.9 trunc()函數(shù)截取數(shù)字trunc()函數(shù)用于截取部分?jǐn)?shù)字。其任務(wù)機(jī)制非常類似于round()函數(shù)。與round()函數(shù)不

18、同的是,該函數(shù)不對(duì)數(shù)值做四舍五入處置,而是直接截取。select trunc(2745.173, 2) result from dual; 保管位數(shù)的值可以為0,當(dāng)該參數(shù)的值為0時(shí),將保管到整數(shù)。 select trunc(2745.173) result from dual; 當(dāng)保管位數(shù)小于0時(shí),表示保管到小數(shù)點(diǎn)之前的位數(shù)。 select trunc(2745.173, -1) result from dual; 14.2.10 vsize()函數(shù)前往數(shù)據(jù)的存儲(chǔ)空間vsize()函數(shù)根據(jù)數(shù)據(jù)庫的存儲(chǔ)格式,來前往其所占用的存儲(chǔ)空間的字節(jié)數(shù)。select vsize(abc123) from d

19、ual; 留意與闡明:vsize()函數(shù)在前往的是Oracle實(shí)踐存儲(chǔ)數(shù)據(jù)的字節(jié)數(shù),在實(shí)踐開發(fā)中運(yùn)用的幾率也較小。讀者可以不用了解Oracle本身的存儲(chǔ)機(jī)制。14.2.11 to_number()函數(shù)將字符串轉(zhuǎn)換為數(shù)值類型to_number()函數(shù)可以將字符串轉(zhuǎn)換為數(shù)值型。select to_number(257.90) result from dual; 需求留意的是,被轉(zhuǎn)換的字符串必需符合數(shù)值類型格式。假設(shè)被轉(zhuǎn)換的字符串不符合數(shù)值型格式,Oracle將拋出錯(cuò)誤提示。select to_number(a) result from dual;14.3 Oracle中的日期函數(shù)Oracle提供了

20、豐富的日期函數(shù)。利用日期函數(shù)可以靈敏的對(duì)日期進(jìn)展運(yùn)算。14.3.1 to_date()函數(shù)將字符串轉(zhuǎn)換為日期型to_date()函數(shù)用于將字符串轉(zhuǎn)換為日期。被轉(zhuǎn)換的字符串必需符合特定的日期格式。select to_date(12/02/09, mm/dd/yy) result from dual; 14.3.2 add_months()函數(shù)為日期加上特定月份add_months()函數(shù)將為日期添加特定月份,并獲得新的日期。select to_char(add_months(sysdate, 2), yyyy-mm-dd) result from dual;14.3.3 last_day()函數(shù)

21、前往特定日期所在月的最后一天last_day()函數(shù)將接受一個(gè)日期參數(shù)。該函數(shù)首先獲得日期參數(shù)所在月的信息,然后獲得該月最后一天的日期。select to_char(last_day(sysdate), yyyy-mm-dd) result from dual;可以綜合利用add_months()函數(shù)來獲得假設(shè)干月之后的月份的最后一天。 select to_char(last_day(add_months(sysdate, 3), yyyy-mm-dd) result from dual;14.3.4 months_between ()函數(shù)前往兩個(gè)日期所差的月數(shù)months_between()

22、函數(shù)用于獲取兩個(gè)日期所間隔的月數(shù)。該函數(shù)的前往值是一個(gè)實(shí)數(shù)。select months_between(sysdate, to_date(2021-02-08, yyyy-mm-dd) result from dual;當(dāng)?shù)谝粋€(gè)日期早于第二個(gè)日期,那么前往值將是負(fù)值。select months_between(to_date(2021-02-08, yyyy-mm-dd), to_date(2021-03-08, yyyy-mm-dd) result from dual; 14.3.5 current_date()函數(shù)前往當(dāng)前會(huì)話時(shí)區(qū)的當(dāng)前日期current_date()函數(shù)用于前往當(dāng)前會(huì)話時(shí)

23、區(qū)的當(dāng)前日期。select sessiontimezone, to_char(current_date, yyyy-mm-dd hh:mi:ss) result from dual; 留意與闡明:current_date等無參數(shù)函數(shù)作為Oracle的關(guān)鍵字存在。在運(yùn)用時(shí),不能為其添加小括號(hào)。即select current_date() from dual是錯(cuò)誤的SQL語句。14.3.6 current_timestamp()函數(shù)前往當(dāng)前會(huì)話時(shí)區(qū)的當(dāng)前時(shí)間戳current_timestamp()函數(shù)用于前往當(dāng)前會(huì)話時(shí)的區(qū)時(shí)間戳??梢越Y(jié)合sessiontimezone來查看其用法。select s

24、essiontimezone, current_timestamp from dual;14.3.7 extract()函數(shù)前往日期的某個(gè)域日期由假設(shè)干域組成,例如年、月、日、小時(shí)等等。extract()函數(shù)可以前往這些域的詳細(xì)值。為了運(yùn)用該函數(shù),除了要指定原日期外,還應(yīng)該指定要前往的域名。select extract(year from sysdate) result from dual;需求留意的是,year、month、day域只能從日期如sysdate中獲得,而hour、minute、second只能從時(shí)間型如systimestamp中獲得。 14.4 Oracle中的聚合函數(shù)所謂聚合

25、函數(shù)是指針對(duì)多條記錄的函數(shù)。Oracle最常用的聚合函數(shù)包括,max()、min()、avg()、sum()和count()函數(shù)。本節(jié)將講述這些函數(shù)的用法。14.4.1 max()函數(shù)求最大值max()函數(shù)用于獲得記錄集在某列的最大值。例如,為了前往員工最高工資,可以利用max()函數(shù)。select max(salary) max_salary from t_salary; 需求留意的是,聚合函數(shù)往往是前往記錄集的統(tǒng)計(jì)值,因此,不能與其中的單條記錄同時(shí)出現(xiàn)。例如,不能將max(salary)與詳細(xì)列一同查詢。select employee_id, max(salary) max_salary

26、from t_salary; select distinct e.employee_name, s.salary from t_employees e, t_salary swhere e.employee_id = s.employee_id and s.salary = (select max(salary) from t_salary)14.4.2 min()函數(shù)求最小值min()函數(shù)可以用來獲得記錄集在某列上的最小值,其功能與max()函數(shù)相反。select distinct e.employee_name, s.salary from t_employees e, t_salary

27、swhere e.employee_id = s.employee_id and s.salary = (select min(salary) from t_salary)14.4.3 avg()函數(shù)求平均值avg()函數(shù)用于獲得記錄集在某列上的平均值。select e.employee_name, avg(salary)from t_employees e, t_salary swhere e.employee_id = s.employee_idgroup by e.employee_id, e.employee_name14.4.4 sum()函數(shù)求和sum()函數(shù)用于獲得結(jié)果集上某列值

28、的和。select e.employee_name, sum(salary)from t_employees e, t_salary swhere e.employee_id = s.employee_idgroup by e.employee_id, e.employee_name14.4.5 count()函數(shù)獲得記錄數(shù)count()函數(shù)的作用對(duì)象同樣為記錄集。與其他聚合函數(shù)不同的是,count()函數(shù)可以有三種方式來進(jìn)展計(jì)數(shù):count(*)計(jì)算行數(shù)、count(column)計(jì)算某列和count(1)累加1。insert into t_employees values (16, nul

29、l, null,null);select count(*) from t_employees; select count(employee_id) from t_employees;select count(employee_name) from t_employees;select count(1) from t_employees; 普通來說,利用count(1)進(jìn)展計(jì)數(shù)的速度最快,但是特別留意的是,預(yù)期的結(jié)果是針對(duì)整行數(shù)據(jù),還是某列的數(shù)據(jù)。14.5 Oracle中的其他函數(shù)除了數(shù)值函數(shù)、字符串函數(shù)、日期函數(shù)和聚合函數(shù)外,Oracle還提供了其他功能性更強(qiáng)的函數(shù)。本節(jié)將引見decode()

30、、nvl()和cast()函數(shù)。14.5.1 decode()函數(shù)多值判別decode()函數(shù)用于多值判別。其執(zhí)行過程類似于解碼操作。該函數(shù)最常見的運(yùn)用為,實(shí)現(xiàn)類似if else的功能。例如,可以利用decode()函數(shù)為員工工資添加標(biāo)識(shí),工資大于6000者為高收入,其他的為普通收入。select e.employee_id, e.employee_name, decode(sign(avg(s.salary) - 6000),1, 高收入, 普通收入) incommingfrom t_employees e, t_salary swhere e.employee_id = s.employe

31、e_idgroup by e.employee_id, e.employee_name 14.5.2 nvl()函數(shù)為空值重新賦值nvl()函數(shù)用于處置某列的值。該函數(shù)有兩個(gè)參數(shù),第一個(gè)參數(shù)為要處置的列。假設(shè)其值為空,那么前往第二個(gè)參數(shù)的值,否那么,將前往列值。select employee_id, nvl(employee_name, 未知) employee_name from t_employees;nvl()函數(shù)更常見的用途為判別數(shù)值能否為空。由于sum()等函數(shù)往往會(huì)前往null,例如,表示匯率的列一旦為null,那么最終的貨幣結(jié)算額度也為null,所以,必需對(duì)匯率列進(jìn)展nvl()的

32、處置。在統(tǒng)計(jì)員工工資時(shí),null同樣是不受歡迎的結(jié)果,那么可以利用nvl()函數(shù)進(jìn)展處置。select e.employee_id, nvl(e.employee_name, 未知) employee_name, nvl(sum(s.salary), 0) salaryfrom t_employees e, t_salary swhere e.employee_id = s.employee_id(+)group by e.employee_id, e.employee_name14.5.3 cast()函數(shù)強(qiáng)迫轉(zhuǎn)換數(shù)據(jù)類型cast()函數(shù)用于強(qiáng)迫轉(zhuǎn)換數(shù)據(jù)類型。Oracle會(huì)根據(jù)操作符來自動(dòng)進(jìn)

33、展數(shù)據(jù)類型的轉(zhuǎn)換,例如:select 123 + 200 result from dual;Oracle會(huì)根據(jù)運(yùn)算符“+將123轉(zhuǎn)換為數(shù)值型123。 select 123 | 200 result from dual;Oracle會(huì)根據(jù)運(yùn)算符“|將數(shù)字200轉(zhuǎn)換為字符串200。 cast()函數(shù)最常用的場景是轉(zhuǎn)換列的數(shù)據(jù)類型,以創(chuàng)建新表create table tmp_salary asselect cast(salary_id as varchar2(20) salary_id, cast(employee_id as varchar2(20) employee_id, cast(month

34、 as varchar2(20) month, cast(salary as varchar2(20) salaryfrom t_salarydesc tmp_salary; 14.6 Oracle中的運(yùn)算表達(dá)式Oracle中的常用運(yùn)算包括:數(shù)學(xué)運(yùn)算、邏輯運(yùn)算和按位運(yùn)算。本節(jié)將經(jīng)過范例著重講述這三種運(yùn)算的常用運(yùn)算符和運(yùn)算規(guī)那么。14.6.1 數(shù)學(xué)運(yùn)算數(shù)學(xué)運(yùn)算是最常用的運(yùn)算方式,Oracle中的數(shù)學(xué)運(yùn)算符包括:+、-、*、/,分別代表了加、減、乘除運(yùn)算。在運(yùn)用數(shù)學(xué)運(yùn)算時(shí),Oracle會(huì)自動(dòng)將其他數(shù)據(jù)類型轉(zhuǎn)換為數(shù)值型,然后再參與運(yùn)算。select 5+3 result from dual;sele

35、ct 5-3 result from dual;select 5*2 result from dual;select 5/2 result from dual;需求留意的是,任何一種運(yùn)算符與null的運(yùn)算結(jié)果均為null。 select 5+null result from dual;select 5-null result from dual;select 5*null result from dual;select 5/null result from dual;14.6.2 邏輯運(yùn)算Oracle中的邏輯運(yùn)算包括:大于運(yùn)算,可用于數(shù)值型、日期型和字符串類型;=:大于等于運(yùn)算,可用于數(shù)值型、

36、日期型和字符串類型;:小于運(yùn)算,可用于數(shù)值型、日期型和字符串類型;=:大于等于運(yùn)算,可用于數(shù)值型、日期型和字符串類型;=:等于,可用于數(shù)值型、日期型和字符串類型;:不等于,可用于數(shù)值型、日期型和字符串類型;!=:與用法一樣;NOT:取反操作;AND:布爾值的與操作;OR:布爾值的或操作。14.6.2 邏輯運(yùn)算需求留意的是,Oracle中的邏輯運(yùn)算符只能作為條件判別,并不前往值。為了查詢工資在5000-7000之間的記錄,可以利用邏輯運(yùn)算符來組合查詢條件。select * from t_salary where salary=5000 and salary=7000; 對(duì)于null值,需求特別留

37、意的是,無論運(yùn)用哪種運(yùn)算符,結(jié)果都會(huì)前往null。當(dāng)比較的結(jié)果為null,并作為條件出現(xiàn)時(shí),Oracle都會(huì)將其解釋為false。select 1 result from dual where 1=null;select 1 result from dual where 1null; select 1 result from dual where null=null; select 1 result from dual where nullnull;14.6.3 位運(yùn)算 從Oracle8i開場,系統(tǒng)曾經(jīng)提供了位運(yùn)算符。最常用的莫過于bitand運(yùn)算符。select bitand(192, 10

38、0) result from dual; 14.7 Oracle中的特殊判式除了邏輯運(yùn)算之外,Oracle提供了一些特殊判式。這些判式可以用來生成更加復(fù)雜和靈敏的查詢條件。本節(jié)將著重引見以下幾種判式。Between:取值范圍。In:集合成員測試。Like:方式匹配。is null:空值判別。all,some,any:數(shù)量判別。exists:存在性判別。14.7.1 between范圍測試between判式,用于判別某個(gè)值能否在另外兩個(gè)值之間。這些值可以為數(shù)值型、字符串和日期型。運(yùn)用betwwen判式來獲得ID號(hào)在1-5之間的員工信息。select * from t_employees wher

39、e employee_id between 1 and 5; betwwen判式同樣可以運(yùn)用于字符串和日期型。字符串是按照字母表的順序進(jìn)展比較,而日期型是按照日期的先后順序進(jìn)展比較。select * from t_employees where b between b and c;select * from t_employees where b between bc and c; 留意與闡明:between判式與=、=的組合是等價(jià)關(guān)系。但是,效率上要比后者差。14.7.2 in集合成員測試in用于判別某個(gè)值能否一個(gè)集合的成員。select * from t_employees where s

40、tatus in(NEW, ACT); 值得留意的是,in判式中的集合的成員的數(shù)據(jù)類型可以不一致,例如,select * from t_employees where status in(NEW, ACT, sysdate, 1)中的數(shù)據(jù)類型包含了字符串、日期型和數(shù)值型。14.7.3 like方式匹配like判式的最大特點(diǎn)在于,可以運(yùn)用通配符。其通常的運(yùn)用場景為處置模糊查詢。select * from t_employees where employee_name like 鐘%; 假設(shè)要求字符串中含有原義字符“%,例如,含有百分比的字符串。那么,like判式應(yīng)寫作:like 鐘% escap

41、e 。Oracle會(huì)首先解釋escape關(guān)鍵字,并將其后的字符“解釋為本義字符。那么在“鐘%中的“%不再表示通配符,而是表示原義字符“%。“_下劃線是可用于like判式的另一個(gè)通配符,該通配符表示一個(gè)恣意的字符。14.7.4 is null空值判別在邏輯判別中,對(duì)于列值為空的判別,不能運(yùn)用=或者。oracle對(duì)與空值的判別提供了專門的判式is null。例如,為了獲取表t_employees中員工信息不全的記錄,可以利用如下所示的查詢語句。select * from t_employees where employee_id is null or employee_name is null o

42、r work_years is null or status is null; 14.7.5 exists存在性判別in判式用于判別表的列值能否存在于列表集合中。而exists判式那么可用于判別查詢結(jié)果集合能否為空。例如,為了查詢出表t_employees所存儲(chǔ)的員工信息中,哪些員工存在于工資表中,即可利用exists判式。select * from t_employees e where exists(select * from t_salary where employee_id = e.employee_id);14.7.6 all,some,any數(shù)量判別all,some和any判式的

43、作用對(duì)象為記錄集合。all表示,記錄集中的一切記錄,some表示其中的一些記錄,any判式那么表示其中的恣意記錄。例如,在員工工資表t_salary中,為了查找高于id為4和5的工資信息,即可運(yùn)用all判式。select * from t_salary where employee_id = 4 or employee_id = 5; select * from t_salary where salary all(select distinct salary from t_salary where employee_id = 4 or employee_id = 5); select * fr

44、om t_salary where salary some(select distinct salary from t_salary where employee_id = 4 or employee_id = 5); 此時(shí)的some判式實(shí)踐相當(dāng)于邏輯運(yùn)算中的or運(yùn)算,即salary6000 or salary7000。此時(shí),運(yùn)用any判式,將前往同樣的結(jié)果。 14.8 Oracle高級(jí)函數(shù)分析函數(shù)與窗口函數(shù)Oracle中的分析函數(shù)具有非常強(qiáng)大的功能。分析函數(shù)往往與另一類函數(shù)窗口函數(shù)同時(shí)運(yùn)用。窗口函數(shù)總是為查詢過程中的當(dāng)前記錄提供一個(gè)相關(guān)記錄集,而且隨著當(dāng)前記錄的推移,相應(yīng)的記錄集也會(huì)隨之改動(dòng)

45、,這非常類似于“滑動(dòng)窗的概念。分析函數(shù)的操作對(duì)象即為“滑動(dòng)窗所指定的記錄集合。本節(jié)將經(jīng)過實(shí)例來講述分析函數(shù)和窗口函數(shù)的運(yùn)用。14.8.1 排名分析函數(shù)中的排名函數(shù)可以針對(duì)窗口中的記錄生成排序序號(hào)。常用的排名函數(shù)有rank()、dense_rank()和row_number()。rank()函數(shù)用于前往當(dāng)前記錄在窗口函數(shù)所指定的記錄集中的排名。rank()函數(shù)在排名過程中,具有騰躍的特點(diǎn)。select * from students; select student_name, rank() over(order by student_age) position from students;sel

46、ect student_name, dense_rank() over(order by student_age) position from students; select student_name, row_number() over(order by student_age) position from students; 14.8.2 分區(qū)窗口對(duì)于窗口函數(shù),利用partition by關(guān)鍵字可以指定分區(qū)窗口。現(xiàn)欲統(tǒng)計(jì)各員工的工資在各自部門的高低情況,那么可以利用partition by進(jìn)展分區(qū),然后利用分析函數(shù)對(duì)分區(qū)內(nèi)的記錄進(jìn)展統(tǒng)計(jì) select t.*, dense_rank()

47、over(partition by department order by salary) position from salary t order by t.employee_id另外一種常見需求為,在獲得員工工資的同時(shí),也需求部門一切員工的工資總額 select t.*,sum(salary) over(partition by department) total_salary,round(avg(salary) over(partition by department) average_salary from salary t order by employee_id留意,avg(sal

48、ary) over(partition by department)是不可分割的一個(gè)整體。對(duì)于數(shù)據(jù)表salary中每條記錄都會(huì)前往單個(gè)值,因此,當(dāng)運(yùn)用round()函數(shù),函數(shù)的作用對(duì)象應(yīng)為avg(salary) over(partition by department)這個(gè)整體,而不能運(yùn)用諸如round(avg(salary) over(partition by department)等方式。另外,利用partition by進(jìn)展分區(qū)之后,當(dāng)前記錄總是處于某個(gè)分區(qū)中,此時(shí)的窗口即為該分區(qū)。14.8.3 窗口子句對(duì)于每條記錄,一旦運(yùn)用了窗口函數(shù),都會(huì)為其產(chǎn)生一個(gè)可操作的記錄集合。而對(duì)于該記錄集,

49、可以運(yùn)用窗口子句,來進(jìn)一步限制窗口范圍。常用的窗口子句包括兩類:利用rows子句的行方式進(jìn)展限制;利用range子句的值方式進(jìn)展限制。rows子句select employee_id, employee_name,sum(salary) over(order by employee_id rows between 1 preceding and 1 following) three_total from salaryrows子句由于和位置相關(guān),因此,在窗口函數(shù)中必需含有排序子句order by。假設(shè)未運(yùn)用order by子句,而直接運(yùn)用rows子句,Oracle將拋出錯(cuò)誤提示, 14.8.3 窗口子句留意,rows betwwen 1 preceding and 1 following不一定前往3條記錄。例如,對(duì)于employee_id為1的記錄,排序之后,該記錄為第一條記錄,不存在前一條記錄,因此只前往兩條記錄,而求和操作前往的實(shí)踐為employee_id為1和2的員工的工資總和10500。2. range子句range子句按照列值進(jìn)展窗口的進(jìn)一步限制。select employee_id, employe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論