函數(shù)
函數(shù)一般是在數(shù)據(jù)上執(zhí)行的,它給數(shù)據(jù)的轉(zhuǎn)換和處理提供了方便宛琅。只是將取出的數(shù)據(jù)進(jìn)行處理,不會改變數(shù)據(jù)庫中的值嘿辟。
函數(shù)根據(jù)處理的數(shù)據(jù)分為單行函數(shù)和聚合函數(shù)(組函數(shù))
組函數(shù)又被稱作聚合函數(shù),用于對多行數(shù)據(jù)進(jìn)行操作红伦,并返回一個(gè)單一的結(jié)果,組函數(shù)僅可用于選擇列表或查詢的having子句
單行函數(shù)對單個(gè)數(shù)值進(jìn)行操作昙读,并返回一個(gè)值。
dual是一個(gè)系統(tǒng)表蛮浑。注意用于測試。
字符相關(guān)
-- dual用于測試
select * from dual;
-- 1.字符串連接
select concat('aa','12') from dual;
select 'aa'||'12' from dual;
-- 2.首字母大寫
select initcap('abc') from dual;
--- 把大寫轉(zhuǎn)化小寫
select lower('ABc') from dual;
select upper('abc') from dual;
-- 把所有員工的姓名小寫輸出
select lower(e.ename),e.empno
from emp e
-- 3.填充字符lpad/rpad
select lpad('sxt',5,'*') from dual;
select rpad('sxt',5,'*') from dual;
-- 4.去掉空白字符
select '? kallen' from dual;
select ltrim('? kallen',' ') from dual;
select rtrim('? kallen? ',' ') from dual;
-- trim 刪除左右兩邊的字符
select trim('a' from 'abc') from dual;
-- 5.求子串 substr(str,loc,len)-->loc從1開始
select substr('abcd',2,2) from dual;
-- 6.查找字符串
/*
如果找到返回>=1的索引艺沼;如果沒找到返回0
*/
select instr('abcd','b') from dual;
-- 7.求長度
select length('abcd') from dual;?
數(shù)值型函數(shù)
-- 數(shù)值型函數(shù)
-- 四舍五入round(x,y)對x保留y為小數(shù)
select round(23.652) from dual;
select round(23.652,1) from dual;
select round(25.652,-1) from dual;
-- 返回x按精度y截取后的值
select trunc(23.652) from dual;
select trunc(23.652,2) from dual;
select trunc(23.652,-1) from dual;
-- mod(x蕴掏,y)求余數(shù)
select mod(9,2) from dual;
-- ceil 向上取整
select ceil(1.9) from dual;
-- floor 向下取整
select floor(1.9) from dual;?
日期函數(shù)
-- 返回系統(tǒng)當(dāng)前時(shí)間
select sysdate from dual;
-- 返回當(dāng)前會話時(shí)區(qū)中的當(dāng)前日期
select current_date from dual;
-- 添加月數(shù)
select add_months(sysdate,1) from dual;
-- 返回兩個(gè)時(shí)間相差的月數(shù)
select months_between(sysdate,add_months(sysdate,2)) from dual;
-- 需求:查詢工作年限在30年以上
select e.ename,e.hiredate
from emp e
where months_between(sysdate,e.hiredate)/12 > 30
-- 返回date所在月份最后的一天
select last_day(add_months(sysdate,1)) from dual;
-- next_day(date1障般,week) 返回date1下周星期幾的日期
select sysdate "當(dāng)時(shí)日期",next_day(sysdate,'Monday') "下周星期一" from dual;
-- 查詢會話的環(huán)境參數(shù)
select * from nls_session_parameters;?
轉(zhuǎn)換函數(shù)
轉(zhuǎn)換函數(shù)就是把字符囚似、日期、數(shù)值型數(shù)據(jù)進(jìn)行相互轉(zhuǎn)換饶唤。類型轉(zhuǎn)換分兩種:隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換
組函數(shù)(A)
組函數(shù)把多行數(shù)據(jù)經(jīng)過運(yùn)算后返回單個(gè)值。也稱聚合函數(shù)募狂。
-- 求公司雇員的數(shù)量
select count(*)
from emp e;
select count(e.empno)
from emp e;
select count(1)
from emp e;
-- avg:對多個(gè)記錄的某個(gè)字段求平均值
-- 需求:求底薪的平均值
select avg(e.sal)
from emp e;
-- 需求:求雇員的最高薪資/最低薪資
select max(e.sal),min(e.sal),avg(e.sal)
from emp e;
-- 需求:求公司一個(gè)月的員工基本開銷
select sum(e.sal)
from emp e;
?
注意:
[1] 組函數(shù)或聚合函數(shù)是對一個(gè)數(shù)據(jù)集(表數(shù)據(jù)角雷、查詢出來的表、分組的表)進(jìn)行聚合勺三。
[2] 聚合函數(shù)對字段是null的值進(jìn)行忽略。count(*)
-- 求有津貼的員工的數(shù)量
select count(e.comm)
from emp e;
?
[3] max/min 適合任意數(shù)據(jù)類型吗坚,sum/avg 只適用于數(shù)值類型。
聚合函數(shù)的結(jié)果可以作為其他查詢條件商源。
-- 最早入職的員工
select e.ename,e.hiredate
from emp e
where e.hiredate = (select min(e.hiredate) from emp e);?
分組(group by)(A)
在處理統(tǒng)計(jì)或聚合數(shù)據(jù)時(shí),很多時(shí)候需要對數(shù)據(jù)進(jìn)行分組 語法
select field1,牡彻。。庄吼。
from tableName
group by field1[,field2,…]?
按照field1[,field2,…] 分組,字段值相同的記錄分到一組总寻。
group by的工作原理
?
對數(shù)據(jù)進(jìn)行分組后,select語句的字段值只能是分組字段或者聚合函數(shù)废菱。
[1]分組和聚合函數(shù)
-- 需求:求各個(gè)部門的人數(shù)
select e.deptno,e.ename
from emp e
group by e.deptno;? ?
-- 需求:統(tǒng)計(jì)部門10的人數(shù)
select count(1)
from emp e
where e.deptno = 10;
-- 需求:求各個(gè)部門的人數(shù)
select e.deptno,e.ename
from emp e
group by e.deptno;
-- 需求:求各個(gè)部門的平均薪資
select e.deptno,avg(e.sal)
from emp e
group by e.deptno
-- 需求:求各個(gè)部門的月收入平均值
select e.deptno,avg(e.sal+nvl(e.comm,0))
from emp e
group by e.deptno
?
[2]null值歸為一組
-- 特例:按照津貼分組
select e.comm,count(1)
from emp e
group by e.comm?
having
如果需要對分組的數(shù)據(jù)進(jìn)行條件過濾,必須使用having!!!
-- group by having
-- 查詢部門平均薪資大于3000的部門
select e.deptno
from emp e
group by e.deptno
having avg(e.sal) > 3000
-- 查詢部門薪資大于3000的雇員按部門分組的平均薪資
select e.deptno,avg(e.sal)
from emp e
where e.sal > 3000
group by e.deptno;?
注意:
[1] Where過濾行殊轴,having過濾分組袒炉。
[2] Having支持所有where操作符旁理。