Oracle數據庫
1、簡單介紹
Oracle服務器:是由Oracle實例和Oracle數據庫組成。
Oracle實例:內存映像(內存裏的數據結構)
Oracle數據庫:物理裏的文件集合(表等)
2、Oracle實例(兩階段提交原理)
3、基本select語句
format_model:9 數字、0 零、$ 美元符、L 本地貨幣符、. 小數點、,千位符
例1:查詢員工的薪水:兩位小數、本地貨幣符、千位符【轉換函數】
select ename,to_char(sal,'L9,999.99') from emp;
反過來:select to_number('Y1,600.00','L9,999.99') from emp;
例2:求10號部門的平均工資【分組函數】
select deptno,avg(sal)
from emp
where deptno=10
group by deptno //若不加這句,則會把所有10號部門輸出來,保證只有一個10號部門
例3:按部門統計員工人數:部門號 部門名稱 部門人數【外連接】
select d.deptno,d.dname,count(e.ename)
from deptno d,emp e
where d.deptno=e.deptno (+) //左外連接:當連接條件不成立的條件下,爲了顯示左邊有,而右邊沒有的信息
group by d.deptno,d.dname //d.dname必須包含在檢索項中
例4:查詢員工信息,老闆信息【自連接】
把一張表看成兩張表,自連接,員工表的老闆是老闆表的員工。
select e.ename || '老闆是' || nvl(b.ename,'他自己') //當老闆爲空時,顯示他自己
from emp e,emp b
where e.mgr=b.empno (+) //把員工的每一條記錄顯示出來,即員工老闆爲空時
例5:查詢員工信息,和141號工種一樣的,薪水比143號員工工資高的 col1,col2,col3信息【單行子查詢】
select last_name,job_id,salary
from emp
where job_id=(select job_id from emp where emp_id=141)
AND salary > (select srlary from emp where emp_id=143);
例6:查詢工資最低的員工信息【單行子查詢】
select *
from emp
where salary = (select min(salary) from emp);
例7:求各個部門編號和部門最低工資(這個最低工資要比50號部門的最低工資要高)【單行子查詢】
select dept_id,min(salary)
from emp
group by dept_id
Having min(salary)>(select min(salary) from emp where dept_id=50);
例8:查詢部門名稱爲SALES和ACCOUNTING的員工信息【多行子查詢】【in】
select *
from emp
where deptno in(select deptno from dept where dname='SALES' or dname='ACCOUNTING')
例9:查詢部門名稱不是SALES和ACCOUNTING的員工信息【多行子查詢】【not in】
select *
from emp
where deptno not in(select deptno from dept where dname='SALES' or dname='ACCOUNTING')
例10:查詢薪水比30號部門所有員工薪水高的員工信息【多行子查詢】【all】
select*
from emp
where sal > all (select sal from emp where deptno=30)
=where sal > (select max(sal) from emp where deptno=30)
例11:查詢薪水比30號部門任意一個員工薪高的員工信息【多行子查詢】 【any】
all/any 的運算和前面的邏輯比較運算相互關聯
4、面試強化
例1:查詢不是經理的員工信息
select *
from emp
where empno not in (select mgr from emp where mgr is not null) //有空值
例2:找到員工表中工資最高的前三名【TOP-M問題】
select rownum,empno,ename,sal
from (select empno,ename,sal from emp order by sal desc)
where rownum<=3
//rownum:是屬於服務器返回的結果集的固有屬性,只能使用where rownum<=3不能where rownum>=3,因爲生成結果集是1行1行生成的,沒有第一行就沒有第二行
例3:找到員工表中工資5~8名【分頁問題】
select r,empno,sal
from
(select rownum r,empno,sal
from (select empno,ename,sal
from emp
order by sal desc)
where rownum<=8)
where r>=5 //內部是rownum不能使用>=5機制,但取別名後可以使用
解決分頁問題:
總的原則:內層排序,外層選,需要三層查詢
內:排序
中:使用rownum選擇前n條,並給rownum指定一個別名,以供最外層過濾使用
外:去掉前m條結果
例4:找到員工表中薪水大於本部門平均薪水的員工
第一種方法:
select e.empno,e.ename,e.sal,d.avgsal
from emp e,(select deptno,avg(sal) avgsal from emp group by deptno) d
where e.deptno=d.deptno and e.sal>d.avgsal
第二種方法:相關子查詢(主查詢作爲子查詢的參數)
分析1:select empno ename,sal,(員工部門的平均工資) avgsal
from emp
where sal > (員工部門的平均工資)
分析2:員工部門的平均工資
select avg(sal) avgsal from emp where deptno=10——>10號部門的平均工資
分析3:select e.empno,e.ename,e.sal,(select avg(sal) avgsal from emp where deptno=e.deptno) avgsal
where sal>(where avg(sal) avgsal from emp where deptno=e.deptno)
總結:主查詢 通過別名 把主查詢的值 傳遞給 子查詢
5、事務
一個或多個DML語句,起始標誌:默認是打開的,不自動關閉,結束標誌:顯式提交commit,隱式提交:1)create table 2)正常退出 quit ,回滾:顯式 rollback;隱式 掉電
事務特性:
- 原子性:事務中的各項操作,要麼全成功,要麼全失敗
- 一致性:事務結後系統狀態一樣,比如兩個賬號轉錢,總的金額不變
- 隔離性:兩個事務之間彼此隔離
- 持久性:只要事務已提交,就不會更改
事務的隔離:多個客戶端同時操作數據庫時,要隔離他們的操作
否則:髒讀、不可重複讀、幻讀
- 髒讀:一個事務讀取到另外一個事務沒有提交的數據
- 不可重複讀:在同一個事務中,兩次讀取到同一數據,得到結果不同,因爲中間被另一個事務修改且提交了
- 幻讀:在同一事務中,用同樣的操作讀取兩次,得到的記錄數不同