顯式數據類型轉換:
需要我們指定數據類型
select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss"今天是"day’) from dual;
查詢員工的薪水:兩位小數,千位符,本地貨幣代碼
select to_char(sal,‘L9,999.99’) from emp;
通用函數:
select ename 姓名,nvl(comm,0) 獎金 from emp order by 獎金 desc;
nvl2(a,b,c) 當a=null的時候,返回c;否則返回b;
select ename 姓名,sal*12+nvl2(comm,comm,0) 年收入 from emp order by 獎金 desc;
nullif(a,b) 當a=b,返回null;否則返回a
select nullif(‘abc’,‘abcd’) 值 from dual;
coalesce(a,b,c) 從左到右找到第一個不爲null的值
select comm,sal,coalesce(comm,sal) “第一個不爲null的值” from emp;
條件表達式:
給員工漲工資,總裁1000,經理800,其他100
select ename,job,sal 漲前,case job when ‘president’ then sal+1000
when ‘manager’ then sal+800
else sal+400
end漲後 from emp;
select ename,job,sal 漲前,
decode(job,‘president’,sal+1000,
‘manager’,sal+800,
sal+400) 漲後
from emp order by 漲後
多行函數
多行函數作用於一組數據,並返回一個值.
平均工資:
平均獎金:
null值: 組函數會自動濾空;可以嵌套濾空函數來屏蔽他的濾空功能.
select count(*),count(nvl(comm,0)) from emp;
查不重複的條數
select count(distinct job) from emp;
分組查詢:
按部門查詢:
select deptno,avg(sal) from emp group by deptno order by deptno;
按職位查詢:
select job,avg(sal) 平均薪水 from emp group by job order by 平均薪水 desc;
查詢多列
查詢多列時,所有未包含在組函數中的列都必須包含在group by子句中, 否則會出錯
包含在group by子句中的列不必包含在select列表中
所有包含於select列表中,而未包含於組函數中的列都必須包含於group by子句中.
多個列的分組
多個列的分組:先按照第一個列分組,如果相同,再第二個列分組,以此類推
過濾分組數據
查詢平均工資大於2000的部門
where和having 的區別:
where子句中不能使用多行函數和組函數
查詢10部門的平均工資
當having和where都可以使用時,儘量使用where;
group by 語句的增強:
select deptno,avg(sal) from emp group by deptno,job;
+
select deptno,sum(sal) from emp group by deptno;
+
select sum(sal) from emp;
=
select deptno,job,sum(sal) from emp group by rollup(deptno,job)
抽象:
group by rollup(a,b)
=
group by a,b
+
group by a
+
沒有group
break on deptno skip 2
相同的部門號只顯示一次,不同的部門號跳過兩行
break on null 恢復默認格式
select可以相加減,通過集合運算
多表查詢(重要)
什麼是笛卡爾積?
兩張表,列數相加,行數相乘.
連接條件(至少有n-1個,n代表表的個數):兩張表的相等的列
從笛卡爾積中選出正確的結果
oracle的連接條件的類型:
- 等值連接
- 不等值連接
- 外連接(重點)
- 自連接(重點)
等值連接例子:
查詢員工信息:員工表 姓名 月薪 部門名稱
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
外連接:希望把某些不成立的記錄(40號部門),任然包含在最後的結果中===>外連接
- 左外連接:當 where e.deptno=d.deptno不成立的時候,等號左邊的表仍然被包含在最後的結果中
- 寫法: where e.deptno=d.deptno(+)
- 右外連接:當 where e.deptno=d.deptno不成立的時候,等號右邊的表仍然被包含在最後的結果中
- 寫法: where e.deptno(+)=d.deptno
按部門統計員工信息:部門號 部門名稱 人數
右外連接:
select d.deptno 部門號,d.dname 部門名稱,count(e.empno) 人數 from emp e,dept d where e.deptno(+)=d.deptno group by d.deptno,d.dname;
自連接:
查詢員工信息:員工姓名 老闆姓名
select e.ename 員工姓名,b.ename 老闆姓名 from emp e,emp b where e.mgr=b.empno;
自連接就是通過表的別名,將同一張表視爲多張表
自連接不適合操作大表.
層次查詢: 單表查詢
select level,empno 員工號,ename 員工姓名,mgr 老闆姓名 from emp connect by prior empno = mgr start with mgr is null order by 1;
自連接比較直觀,不適合查詢大表;層次查詢速度快,可以查詢大表,但是查詢出來的東西不明顯.