select單表查詢語句--使用函數
使用函數可以大大提高SELECT語句操作數據庫的能力;它給數據的轉換和處理提供了方便。函數只是將取出的數據進行處理,不會改變數據庫中的值。
Oracle函數分為單行函數和多行函數兩大類
【單行函數】
單行函數分類:字符函數 數值函數 日期函數 轉換函數 通用函數
--特點1:不改變真實數據,只對數據做了進一步的修飾顯示
--特點2:可以和字段混合使用
--字符函數:select 字段名,函數名(字段名),字段名... from 表名;
多行函數:sum() avg() 僅適用數值型 count() max() min() 適用任何類型數據
偽表:[不是真實存在的表,是為了方便進行數據的驗證臨時存在的表,表名:dual]
【常用字符函數】:
字符函數舉栗子:

1 --舉栗子【字符函數】 2 --1.首字母大寫:查詢emp表中姓名列首字符大寫 3 select ename,initcap(ename) as "首字母大寫" from emp; 4 --2.轉為小寫:查詢emp表中的職位全部小寫顯示 5 select job,lower(job) as "職位小寫顯示" from emp; 6 --3.轉為大寫:查詢emp表中的姓名全部大寫顯示 7 select ename,upper(ename) as "姓名大寫" from emp; 8 --4.左裁剪:ltrim('ltrimHello world','ltrim')=>Hello world 9 select ltrim('ltrimHello world','ltrim') from dual; 10 --5.右裁剪:rtrim('Oracle1234','1234')=>Oracle 11 select rtrim('Oracle1234','1234') from dual; 12 --6.按字符翻譯:abcd按字符翻譯成boom=>boom404 13 select translate('abcd404','abcd','boom') from dual; 14 --7.字符串替換:把java替換成oracle=>hello oracle 15 select replace('hello java','java','oracle') from dual; 16 --8.查找子串位置:查找下標從1開始,並不是從0 17 select instr('caoyinboom404','y') from dual; 18 --9.取子字符串:從第7個開始截取,取出后面7個字符 19 select substr('caoyinboom404',7,7) from dual; 20 --10.連接字符串 21 select concat('hello',' oracle') from dual;
【常用數值函數】:
數值函數舉栗子:

1 --舉栗子【數值函數】 2 --1.絕對值 3 select abs(-9) from dual; 4 --2.向上取整:不管小數點第一位是幾,都進以為數值 5 select ceil(55.12) from dual; 6 --3.正弦 7 select sin(45) from dual; 8 --4.余弦 9 select cos(45) from dual; 10 --5.取符號:正數 1、負數-1 11 select sign(5) from dual; 12 select sign(-5) from dual; 13 --6.向下取整:相當於只取出整數部分.小數部分忽略不計 14 select floor(99.99) from dual; 15 --7.m的n次冪 16 select power(5,2) from dual; 17 --8.取余數:是否帶符號取決於左邊的數值,[不存在- - 得 +] 18 select mod(10,8) from dual;-- 2 19 select mod(-10,8) from dual;-- -2 20 select mod(10,-8) from dual;-- 2 21 select mod(-10,-8) from dual;-- -2【不存在負負得正】 22 --9.四舍五入 23 select round(10.49) from dual; 24 --10.保留小數位 25 select trunc(10.98170,2) from dual; 26 --11.平方根 27 select sqrt(16) from dual;
【常用日期函數】:
日期函數舉栗子:

1 --舉栗子【日期函數】 2 --1.返回兩個日期間的月份:月份在前,否則就負值 3 select months_between('01-8月-2018','01-6月-2018') from dual; 4 --2.返回月份數添加到日期對應的新日期:參數2:相當於加減月份 5 select add_months('01-8月-2018',1) from dual;--2018/9/1 星期六 6 select add_months('01-8月-2018',-2) from dual;--2018/6/1 星期五 7 --3.返回指定日期后的星期對應的新日期 8 select next_day('02-10月-2018','星期一') from dual;--查詢最近星期的日期。2018/10/8 星期一 9 --4.返回指定日期所在月份的最后一天 10 select last_day('02-2月-2018') from dual;--2018/2/28 星期三 11 12 --5.按指定格式對日期進行四舍五入【掙扎了好久,外國的日期跟中國的習慣不一樣,不必要糾結日期這段,跳過去】 13 14 --指定年份:年的四舍五入按月份算 15 select round(to_date('30-6月-03'),'YEAR') from dual;--2003/1/1 星期三 16 select round(to_date('21-7月-03'),'YEAR') from dual;--2004/1/1 星期四 17 --指定月份:月的四舍五入按日份算 18 select round(to_date('15-8月-03'),'MONTH') from dual;--2003/8/1 星期五 19 select round(to_date('16-9月-03'),'MONTH') from dual;--2003/10/1 星期三 20 --指定日:按星期的中間天數 21 select round(to_date('01-10月-2018'),'DAY') from dual; 22 select round(to_date('01-4月-2018'),'DAY') from dual;
【多行函數】
【多行函數】:對一組數據進行運算,針對一組數據(多行記錄)只返回一個結果,也稱分組函數。
--多行函數不能和普通字段值及單行函數混合使用,除非分組
--作用:對查詢數據進行統計
--使用:select 多行函數名(字段名),多行函數名(字段名)...from 表名;
常用多行函數:sum() avg() 僅適用數值型 count() max() min() 適用任何類型數據
--max(字段名)返回該字段的最大值
--min(字段名)返回該字段的最小值
--sum(字段名)返回該字段的和
--avg(字段名)返回該字段的平均值
--count
--count(*)返回表的記錄數
--count(字段名)返回非空值的數量
--count(distinct 字段名)去除重復后的字段值的數量
多行函數舉栗子:
1 --查詢員工的最高工資 2 select max(sal) from emp; 3 --查詢員工的最底工資 4 select min(sal) from emp; 5 --查詢員工的平均工資 6 select avg(sal) from emp; 7 --查詢所有員工的平均工資之和 8 select sum(sal) from emp; 9 --查詢公司有多少員工 10 select count(*) from emp;--查詢表的記錄數 11 --查詢有獎金的員工人數 12 select count(comm) from emp;--查詢字段的值的數量,null自動過濾 13 --查詢公司有多少工作種類 14 select distinct job from emp; 15 select count(distinct job)from emp;
【轉換函數】
轉換函數:Oracle的類型轉換分為自動類型轉換和強制類型轉換。數據類型之間可以進行自動轉換,仍建議使用顯示轉換函數,以保持良好的設計風格。
常用類型轉換函數有:
--to_number(數值類型的字符):將字符轉換為數值
--to_char(數值或者是日期):將數值或者日期轉換為字符
--to_date(日期格式的字符):將字符轉換為日期
1 ---------------------數值和字符的互轉--------------------- 2 --字符轉換數字char --> number 3 select to_number('1999')+1 from dual; 4 --數字轉換字符number --> cahr 5 --指定顯示格式: 6 --9表示位置的占位:eg:999,999,999=>三位一組使用逗號隔開 7 --L表示人民幣符號 8 --$表示美元符號 9 --0也可以占位分組,但若真實數據位數不足,會使用0進行補位 10 select to_char(987654321,'¥999,999,999')from dual; 11 select to_char(123456789,'$999,999,999')from dual; 12 select to_char(123456789,'000,000,000,000.000')from dual; 13 --查詢工資大於2000的員工信息 14 --數值和字符之間的轉換可以隱式轉換.to_number可缺省 15 select * from emp where sal>'2000'--存在隱式自動轉換 to_number('2000') 16 select '154'+2 from dual;
1 ---------------------日期和字符的互轉--------------------- 2 --字符轉換日期 cahr-->date 3 --查詢員工入職日期在82年之后的信息 4 --使用to_date('要轉的字符','日期格式')函數將字符轉換為日期 5 --注意1:字符必須符合日期格式 6 --注意2:Oracle默認的轉換格式為日月年,'01-1月-2018' 7 --常用日期格式:yyyy-mm-dd yyyy/mm/dd 8 select * from emp where to_char(hiredate,'yyyy-mm-dd')>'1982-01-01'; 9 select * from emp where hiredate>to_date('1982-01-01','yyyy-mm-dd'); 10 select * from emp where hiredate>to_date('1982-01-01','yyyy/mm/dd'); 11 --日期轉換字符 date-->char 12 --使用to_char('要轉的日期','轉換格式') 13 --注意1:不指定轉換格式,使用默認格式,日月年:'01-01月-18' 14 select to_char(hiredate) from emp;--默認格式 15 --指定格式 16 select to_char(hiredate,'yyyy-mm-dd') from emp; 17 select to_char(hiredate,' yyyy"年" mm"月" dd"日" ') from emp;
【其他函數】
1 --查詢員工的薪水信息:如果獎金等於null,就返回0;不等於0,sal+comm 在進行計算相加 2 select ename,sal,comm,sal+nvl(comm,0) as "工資+獎金" from emp; 3 select ename, sal, comm, nvl2(comm, sal+comm, sal) as "工資+獎金" from emp;
--decode (value, key0,value0,key1,value 1,..... ,valuen)
--參數的意思,如果 value 的值 是 key0? 整個函數返回 value0 ,如果值是key1就返回value1,以此類推,如果都沒有找到合適,最后返回 valuen。
--decode(字段名,值1,處理1,值2,處理2,值3,處理3,...公共處理)
--如果字段的值和decode中的條件相同則執行對象的處理,都不是就則執行公共處理
1 --將emp 表中所有的員工的名字 工作 以及工作中文顯示 2 select ename, job, decode(job,'CLERK','職員','SALESMAN','銷售','PRESIDENT','主席','MANAGER','經理','ANALYST','分析師') 中文職業 from emp; 3 --職位除了:(job,'SALESMAN','銷售','PRESIDENT','主席','MANAGER','經理','ANALYST','分析師')其他都是職員 4 --處理大量的其他使用:比如:幾萬數據,除了職稱為管理員和老師之外的其他都是學生 5 select ename, job, decode(job,'SALESMAN','銷售','PRESIDENT','主席','MANAGER','經理','ANALYST','分析師','職員') 中文職業 from emp;