【數據庫系列知識】Oracle數據庫

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;隱式  掉電

事務特性:

  • 原子性:事務中的各項操作,要麼全成功,要麼全失敗
  • 一致性:事務結後系統狀態一樣,比如兩個賬號轉錢,總的金額不變
  • 隔離性:兩個事務之間彼此隔離
  • 持久性:只要事務已提交,就不會更改

事務的隔離:多個客戶端同時操作數據庫時,要隔離他們的操作

否則:髒讀、不可重複讀、幻讀

  • 髒讀:一個事務讀取到另外一個事務沒有提交的數據
  • 不可重複讀:在同一個事務中,兩次讀取到同一數據,得到結果不同,因爲中間被另一個事務修改且提交了
  • 幻讀:在同一事務中,用同樣的操作讀取兩次,得到的記錄數不同
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章