===============單行函數(shù) 多行函數(shù) 單行函數(shù):
作用于一行 返回一個(gè)值 多汗函數(shù):
作用于多行 返回一個(gè)值
(1)字符函數(shù)
接收字符輸入返回字符或者數(shù)值比默,dual 是偽表
1.1:?把小寫的字符轉(zhuǎn)換成大的字符
upper('yes')
select? upper('yes')? from dual
1.2;把大寫的字符轉(zhuǎn)換成小寫的字符
lower('YES')
select lower('YES') from dual
數(shù)值函數(shù)
?1. 四舍五入函數(shù):
ROUND()默認(rèn)情況下 ROUND 四舍五入取整宗弯,可以自己指定保留的位數(shù)。
select round(56.16,2) from dual
select trunc(56.16,-1)? from dual?? 直接截取
select mod(10,3) from dual? 求余數(shù)
.日期函數(shù)
Oracle 中提供了很多和日期相關(guān)的函數(shù),包括日期的加減磷仰,在日期加減時(shí)有一些規(guī)律
日期 – 數(shù)字 = 日期
日期 + 數(shù)字 = 日期
?日期 – 日期 = 數(shù)字
范例:查詢emp中所有員工入職距離現(xiàn)在幾天
select sysdate-e.hiredate from emp e;
算出明天刺客
select sysdate? +1 from dual
查詢出emp中所有員工入職距離現(xiàn)在幾月
select months_between(sysdate,e.hiredate) from emp e;
查詢出emp中所有員工入職距離現(xiàn)在幾年
select months_between(sysdate,e.hiredate) /12 from emp e;
查詢出emp中所有員工入職距離現(xiàn)在幾周
select? (sysdate-e.hiredate)?/7 from? emp e;
轉(zhuǎn)換函數(shù)
TO_CHAR:字符串轉(zhuǎn)換函數(shù)
拆分時(shí)需要使用通配符
年:y, 年是四位使用 yyyy
月:m, 月是兩位使用 mm
日:d, 日是兩位使用 dd
select to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual
2019-08-23 03:18:35
select to_char(sysdate,'fm ?yyyy-mm-dd hh:mi:ss') from dual
2019-8-23 3:19:19
select to_char(sysdate,'fm yyyy-mm-dd hh24:mi:ss') from dual
2019-8-23 15:19:40
??TO_DATE:日期轉(zhuǎn)換函數(shù)
TO_DATE 可以把字符串的數(shù)據(jù)轉(zhuǎn)換成日期類型
select to_date('1994-05-14','yyyy-mm-dd' ) from dual??? ----1994/5/14
通用函數(shù)
nvl
計(jì)算emp員工公年薪
select sal*12 + nvl(comm,0) from emp
Decode 函數(shù)
1;case when
select? 條件,
case? 條件
when? 條件1? ? ?then? 賦值1
when? 條件2? ? ?then? 賦值2
--else??賦值3
end
from 表;
select emp.ename,
case emp.ename
when 'SMITH' then '1'
when 'allen' then '2'
--else '3'
end
from emp;
Decode 函數(shù)
該函數(shù)類似 if....else if...esle
語法:DECODE(col/expression, [search1,result1],[search2, result2]....[default])
Col/expression:列名或表達(dá)式
Search1,search2...:用于比較的條件
Result1, result2...:返回值
如果 col/expression 和 Searchi 匹配就返回 resulti,否則返回 default 的默認(rèn)值
select decode(emp.ename,'SMITH','aa','ALLEN','BB')? ? ?from emp
運(yùn)行結(jié)果 設(shè)置列的別 名
select decode(emp.ename,'SMITH','aa','ALLEN','BB')? ?name? from emp
select decode(emp.ename,'SMITH','aa','ALLEN','BB')? ?"name"? from emp
oracle 除了起別名? 都用單引號(hào)? 別名起在from 之前
==================多行函數(shù)
統(tǒng)計(jì)記錄數(shù) count()
select count(1) from emp?
最小值查詢 min()
select min(條件)? from 表? 例如:?select min(sal)? from emp
最大值查詢 max()
select max(條件)? from 表? 例如:?select max(sal)? from emp
查詢平均值 avg()
select?avg(條件)? from 表? 例如:?select?avg(sal)? from emp
求和函數(shù) sum()
select?sum(條件)? from 表? 例如:?select?sum(sal)? from emp
=================分組查詢
分組統(tǒng)計(jì)需要使用 GROUP BY 來分組
?語法:SELECT? ?*/列名? ?條件? ? from? 表名字? (表名字后面也可以加where 條件) GROUP BY? 分組字段????
分組查詢中祝蝠,出現(xiàn)在group by 后面的原始列,才能出現(xiàn)在select 后面?
沒有出現(xiàn)在group by 后面的原始列,想在select 后面 必須系上聚合函數(shù)
所有條件都不能使用別名??
例如查詢每個(gè)部門平均工資
select emp.deptno, avg(emp.sal)
from emp
group by emp.deptno
例如查詢每個(gè)部門平均工資高于2000的
select emp.deptno, avg(emp.sal)
from emp
group by emp.deptno
having avg(emp.sal)>2000
查詢每個(gè)部門工資高于800的員工的平均值
select emp.deptno ,avg(emp.sal)??
from emp
where? emp.sal >800
group by emp.deptno
whewe 是過濾分組前的數(shù)據(jù) having? 是過濾分組之后的 數(shù)據(jù)
表現(xiàn)形式 where 必須在group by前绎狭,having在group by后面
========================多表查詢
語法: SELECT {DISTINCT} *|列名.. FROM 表名 別名细溅,表名 1 別名
{WHERE 限制條件 ORDER BY 排序字段 ASC|DESC...}
select * from emp ,dept;
等值連接:
兩張表中我們發(fā)現(xiàn)有一個(gè)共同的字段,我們可以使用這個(gè)字段來做限制條件,兩張表的關(guān)聯(lián)查詢字段一般是其中一張表的主鍵儡嘶,另一張表的
外鍵喇聊。
select * from emp ,dept where emp.deptno = dept. deptno
內(nèi)連接
select * from emp? inner join dept on emp.deptno = dept.deptno
外連接? {左連接 和有=右連接}
查詢所有部門以及部門下的員工信息
select? * from emp right join? dept on??emp.deptno = dept.deptno
查詢所有員工信息,以及所屬不么
select? * from emp left join? dept on??emp.deptno = dept.deptno
oracle 專用外連接
select * from emp ,dept where emp.deptno(+) = dept. deptno
自連接
====查詢員工姓名和 員工l領(lǐng)導(dǎo)姓名
select? ?e1.ename ,e2.ename
from? ??emp e1, emp e2
where? e1.mgr = e2.empno
====查詢員工姓名和 員工姓名??員工領(lǐng)導(dǎo)姓名和 員工領(lǐng)導(dǎo)部門姓名
select e1.ename ,d1.dname, e2.ename, d2.dname
from? ? emp e1, emp e2 ,dept d1,dept d2
where e1.mgr = e2.empno
and e1.deptno = d1.deptno
and e2.deptno = d2.deptno
===============子查詢
子查詢:在一個(gè)查詢的內(nèi)部還包括另一個(gè)查詢蹦狂,則此查詢稱為子查詢誓篱。
子查詢?cè)诓僮髦杏腥悾?/p>
單列子查詢:返回的結(jié)果是一列的一個(gè)內(nèi)容
單行子查詢:返回多個(gè)列,有可能是一個(gè)完整的記錄
多行子查詢:返回多條記錄
====================Rownum與分頁查詢
ROWNUM:表示行號(hào)凯楔,實(shí)際上此是一個(gè)列,但是這個(gè)列是一個(gè)偽列,此列可以在每張表中出現(xiàn)窜骄。
當(dāng)我們select 操作的時(shí)候 沒查詢出一行記錄,就會(huì)在該還行上加一個(gè)行號(hào)? 行號(hào)從1開始 一次遞增不能跳著走
排序操作 影響ROWNUM順入
如果涉及到排序 但是還要使用ROWNUM 我們可以再次嵌套
ROWNUM行號(hào) 不能寫上大大于一個(gè)正數(shù)
select rownum,t.*from(select rownum, e.* from emp e order by e.sal desc) t
emp 表員工倒敘排列后 每頁5條數(shù)據(jù)查詢第二頁
? ? select * from(
? ?select? rownum rn , e. * from (
? ? ? ? ? ? ? ? ? ? select * from emp order by? sal desc
? )e? where rownum < 11?
)? where rn>5?
=========
第一種寫法:
select *
from (select rownum rm, a.* from (select * from emp) a where rownum < 11) b where b.rm >
5
第二種寫法:
select *
from (select rownum r ,emp.* from emp) b
where b.r >5 and b.r <11