單行函數(shù)
日期可以做減操作。
months_between:兩個日期相差的月數(shù)
add_months: 加上若干個月后的時間
last_day: 當前月的最后一天
next_day: 指定日期的下一個日期
round:也可以對日期進行四舍五入操作荆秦。
轉換函數(shù)
顯示轉換比隱式轉換性能高式镐。
to_date('1999-01-01','yyyy-mm-dd'):按照指定格式轉換成日期
to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'):按指定格式轉成字符串
to_number('123'):將字符串轉成數(shù)字
通用函數(shù)
nvl(expr1,expr2)
nvl(expr1,expr2,expr3):當expr1不為空返回expr2 否則返回expr3
nullif(expr1,expr2):當expr1=expr2時返回null 否則返回expr1
coalesce(expr1,expr2....exprn):找到參數(shù)列表中第一個不為空的值
條件表達式
case表達式:標準語法
select ename,job,sal 漲前工資,
case job when 'PRESIDENT' then sal+1000
when 'MANAGER' then sal+800
else sal+400
end 漲后工資
from emp;
decode函數(shù):Oracle自己的語法
select ename,job,sal 漲前工資, decode(job,'PRESIDENT',sal+1000,
'MANAGER', sal+800,
sal+400) 漲后工資
from emp;
組函數(shù)
組函數(shù)會自動慮空床玻,只統(tǒng)計非空的記錄
select sum(comm)/count(*) 方式一,sum(comm)/count(comm) 方式二, avg(comm) 方式三 from emp;
方式一 方式二 方式三
---------- ---------- ----------
157.142857 550 550
嵌套濾空函數(shù)使組函數(shù)無法忽略空值
select sum(comm)/count(*) 方式一, sum(comm)/count(nvl(comm,0)) 方式二, avg(comm) 方式三 from emp;
方式一 方式二 方式三
---------- ---------- ----------
157.142857 157.142857 550
注意: 所有沒有包含在select的組函數(shù)中的列赏陵,必須在group by后面
group by作用于多列:先按照第一列分組,如果相同买乃,則第二列分組触创;以此類推
-- 按部門求部門的平均工資,選出大于2000的部門
select deptno,avg(sal)
from emp
group by deptno
having avg(sal)>2000;
-- having 過濾必須在分組后使用,having是先分組后過濾为牍,注意性能問題哼绑。如果可以先用where 過濾后 在分組性能會更好。
group by的增強
select deptno,job,sum(sal)
from emp
group by rollup(deptno,job);
/*
怎么分組:
group by deptno,job
+
group by deptno
+
group by null
=
group by rollup(deptno,job)
----------------------------------
group by rollup(a,b)
=
group by a,b
+
group by a
+
group by null
*/
多表查詢
從笛卡爾積的集合中通過我們指定的條件選出正確的記錄
等值鏈接
--查詢員工信息碉咆,要求顯示員工的編號抖韩,姓名,月薪和部門名稱
select e.empno,e.ename,e.sal,d.dname
from emp e,dept d
where e.deptno=d.deptno;
不等值連接
-- 查詢員工的工資級別:編號 姓名 月薪和級別
select e.empno,e.ename,e.sal,s.grade
from emp e,salgrade s
where e.sal between s.losal and s.hisal;
外連接
當連接條件不成立時疫铜,任然希望在結果中包含某些不成立的記錄
左外連接
當連接條件不成立時茂浮,等號左邊所代表的表的信息仍然顯示
寫法: where e.deptno(+)=d.deptno
右外連接
當連接條件不成立時,等號右邊所代表的表的信息仍然顯示
寫法: where e.deptno=d.deptno(+)
自連接: 會產生笛卡爾積 最好只用于小表
利用表的別名壳咕,將同一張表視為多張表
對于大的表席揽,又有自連接查詢的需求時,Oracle提供了層次查詢谓厘。
connect by
select level,empno,ename,mgr
from emp
connect by prior empno=mgr
start with mgr is null
order by 1;
-- connect by prior empno=mgr 前一次查詢的empno員工號碼等于本次查詢的老板號碼mgr
-- start with mgr is null 層次查詢的起始條件幌羞。mgr老板號碼為null 也就是從boss開始
/*
LEVEL EMPNO ENAME MGR
---------- ---------- ---------- ----------
1 7839 KING
2 7566 JONES 7839
2 7698 BLAKE 7839
2 7782 CLARK 7839
3 7902 FORD 7566
3 7521 WARD 7698
3 7900 JAMES 7698
3 7934 MILLER 7782
3 7499 ALLEN 7698
3 7788 SCOTT 7566
3 7654 MARTIN 7698
LEVEL EMPNO ENAME MGR
---------- ---------- ---------- ----------
3 7844 TURNER 7698
4 7876 ADAMS 7788
4 7369 SMITH 7902
*/
/*
第一次: where mgr is null => 7839
第二次: where mgr = 7839 => 7566 7698 7782
第三次: where mgr in (7566,7698,7782)
*/