一、多表查詢
語法:select * from 表名1,表名2 where 條件表達式(主鍵 = 外鍵)order by 排序
主鍵:必須有值(不爲null)且不重複,可以用作當前行的標識
主鍵 = 外鍵:當前表中的外鍵必須是另一張表的主鍵
1.1內聯查詢 (where條件中的內容:主鍵 = 外鍵)
查詢結果中,主鍵中有,外鍵中也有的值都會查詢得到,主鍵中沒有而外鍵中有的值不會查
詢得到
例:查詢出僱員的編號、僱員姓名、部門編號、部門名稱及部門位置
selecte.empno,e.ename,d.deptno,d.dname,d.loc from emp e,dept d where
e.deptno = d.deptno;
或:selecte.empno,e.ename,d.deptno,d.dname,d.loc from emp e inner join
dept d on e.deptno = d.deptno;
即:兩種表之間用inner join連接,where用on替換
1.2外聯查詢 (on條件中的內容:主鍵 = 外鍵)
左外聯:左表中的值都會出現在查詢結果中,即使右表中沒有對應的數據
例:select * from dept d left join empe on d.deptno = e.deptno;
部門40依然可以查詢得出,其emp中的數據由null代替
1.3自聯查詢(where條件中的內容:本表中的某列 = 本表中的主鍵列)
例1:查詢出每個僱員的編號,姓名,工作,部門及上級領導的姓名
select e.empno,e.ename,e.job,m.ename,d.dname from emp e,emp m,dept d
where e.mgr = m.empno and e.deptno =d.deptno;
例2:查詢出每個僱員的姓名,工資,部門名稱,工資等級及上級領導的姓名和工資所在的
等級
select e.ename,e.sal,m.ename,d.dname,s.grade,m.sal,sm.grade from emp
e,emp m,dept d,salgrade s,salgrade sm wheree.mgr = m.empno and e.deptno =
d.deptno and (e.sal between s.losal ands.hisal) and (m.sal between sm.losal
and sm.hisal) ;
二、組函數及分組統計
2.1組函數
a、count(): 求出全部的記錄數
用法:selectcount(*) from emp;
b、max(): 求出一組數據中的最大值
用法:selectmax(sal) from emp;
c、min(): 求出一組數據中的最小值
用法:selectmin(sal) from emp;
d、sum():求和
用法:select sum(sal) from emp wheredeptno = 20;
e、avg():求平均值
用法:select avg(sal) from emp wheredeptno = 20;
2.2分組統計 (使用group by 進行分組)
語法:select * from 表名稱 where 條件表達式 group by 分組條件 order by 排序
字段
例1:求出每個部門的僱員數量,按照部門編號劃分
select deptno,count(empno) from emp group by deptno;
例2:求出每個部門的平均工資
select deptno,avg(sal) from emp group by deptno;
例3:按照部門分組,並顯示部門的名稱,及每個部門的員工數
select d.dname,count(ename) from emp e,dept d where e.deptno = d.deptno
group by d.dname;
having 條件指令:
語法:select * form 表名稱 where 條件表達式 group by 分組條件 having 條件
表達式 order by 排序字段
例4:顯示出平均工資大於2000的部門編號及平均工資
select deptno,avg(sal) from emp group by deptno having avg(sal) >2000;
例5:顯示非銷售人員工作名稱以及從事同一工作的僱員的月工資的總和,並且要滿足從事
同一工作的僱員的月工資合計大於5000,輸出結果按照月工資的合計升序排序
select job,sum(sal) from emp where job <> 'SALESMAN' group by job
having sum(sal) >5000 order by sum(sal)asc;
例6:求出平均工資最高的部門
select max(avg(sal))from emp group by
三、子查詢
概念:在一個查詢的內部還包括另外一個查詢
語法:select * from 表名稱 where 條件表達式(select * from 表名稱 where 條件表達
式 group by 分組條件 having 條件表達式 order by 排序字段) group by 分組條件
having 條件表達式 order by 排序字段
例1:查詢出比7654工資要高的全部僱員信息
select * from emp where sal >(select sal from emp where empno =7654);
例2:查詢出工資比7654高,同時與7788從事相同工作的全部僱員信息
select * from emp where sal >(select sal from emp where empno = 7654)and
job = (select job from emp where empno =7788);
在子查詢中,存在三種查詢的操作符號:in、any、all
3.1 in操作符
作用:指定一個查詢的範圍
例3:求出每個部門的最低工資的僱員信息
select * from emp where sal in (select min(sal) from emp group by
deptno);
3.2 any操作符
=any (與in操作符的功能完全一樣)
> any (比裏面最小的值要大)
< any (比裏面最大的值要小)
select * from emp where sal = any(select min(sal)from emp group by
deptno);
3.3 all操作符
>all (比最大的值要大)
<all (比最小的值要小)
select * from emp where sal > all(select min(sal) from emp group by
deptno);
四、數據庫更新操作
數據庫的主要操作分爲兩種:
1、數據庫的查詢操作:select
2、數據庫的更新操作:insert、update、delete
爲了保存原始的emp表的信息,在進行增加、修改、刪除操作之前,先將此表複製一份,即:
create table myemp as select * from emp;
4.1增加數據 insertinto
語法:insert into 表名稱[(字段名1,字段名2...)]values(值1,值2...);
例1:爲myemp表增加一條新的記錄,按照標準的做法完成
insert into myemp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values
(7899,'張三','清潔工',7369,'14-2月-85',9000,300,40);
例2:插入一個新的僱員,但此時僱員暫時沒有領導,也沒有獎金
1)、不明確寫出要插入的字段名,沒有數據的字段寫成null
insert into myemp values(8881,'李四','清潔工',null,'17-5月-
86',9000,null,40);
2)、明確寫出要插入的字段名
insert into myemp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values
(8882,'王五','清潔工',null,'23-6月-87',9000,null,40);
3)、將一個字符串類型的數據變爲date類型的數據
insertinto myemp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values
(8883,'趙六','清潔工',7369,to_date('1988-12-23','yyyy-mm-dd'),9000,300,40);
4.2修改數據 update
語法:
1)、修改全部:update 表名稱 set 要修改的字段 = 新值,要修改的字段 = 新值...
2)、修改局部:update 表名稱 set 要修改的字段 = 新值,要修改的字段 = 新值...
where 修改條件
例3:將myemp表中的所有僱員的獎金修改爲1000 --->全部修改
update myemp set comm = 1000;
例4: 將編號爲7899的僱員的工資修改成5000 --->局部修改
update myemp set sal = 5000 where empno = 7899;
例5: 將編號7369、8899、7788的領導及獎金取消
update myemp set mgr = null,comm = null where empno in(7369,8899,7788);
4.3刪除數據 delete
語法:
1)、刪除全部: deletefrom 表名稱
2)、刪除局部: deletefrom 表名稱 where 刪除條件
例6: 刪除編號是7899的僱員信息
delete from myemp where empno = 7899;
例7: 刪除全部領取獎金的僱員
delete from myemp where comm is not null;
五、事務處理
概念:保證數據的完整性,所有的操作要麼同時成功,要麼同時失敗。 每一個連接到數據庫上
的用戶表示創建了一個session,一個session對數據庫所做的修改,不會立刻反映到數據庫的真
實數據之上,是允許回滾的,當一個session提交所有的操作之後,數據庫才真正的做出了修改。
在數據庫的操作中提供了以下兩個主要命令完成事物的處理:
--->提交事物:commit
--->回滾事物:rollback
例1: 創建一個只包含10部門僱員信息的臨時表
create table emp10 as select * from emp where empno = 10;
例2: 刪除emp10表中7782的僱員信息
delete from emp10 where empno = 7782;
事務的操作:先定義開始一個事務,然後對數據作修改操作,這時如果提交(COMMIT),這些修改就永
久地保存下來,如果回退(ROLLBACK),數據庫管理系統將放棄您所作的所有修改而回到開始事務時
的狀態。
事務的屬性:
1、原子性:指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
2、 一致性:事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態。(數據不被破
壞)
3、 隔離性:指一個事務的執行不能被其他事務干擾,即一個事務內部的操作及使用的數據
對併發的其他事務是隔離的,併發執行的各個事務之間不能互相干擾。
4、持久性:指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來的其他
操作和數據庫故障不應該對其有任何影響
多個事務併發運行時的併發問題:
1、髒讀:一個事務讀取了另一個事務改寫但還未提交的數據,如果這些數據被回滾,則讀到的
數據是無效的。
2、不可重複讀:在同一事務中,多次讀取同一數據返回的結果有所不同。換句話說就是,後
續讀取可以讀到另一事務已提交的更新數據。
3、可重複讀:在同一事務中多次讀取數據時,能夠保證所讀數據一樣,也就是,後續讀取不
能讀到另一事務已提交的更新數據。
4、幻讀:一個事務讀取了幾行記錄後,另一個事務插入一些記錄,幻讀就發生了。再後來的
查詢中,第一個事務就會發現有些原來沒有的記錄。