查詢數據庫

一、多表查詢

  語法: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連接,whereon替換

  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組函數

    acount() 求出全部的記錄數

       用法:selectcount(*) from emp;

    bmax() 求出一組數據中的最大值

       用法:selectmax(sal) from emp;

    cmin() 求出一組數據中的最小值

       用法:selectmin(sal) from emp;

    dsum():求和 

       用法:select sum(sal) from emp wheredeptno = 20;

    eavg():求平均值

       用法: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);

  在子查詢中,存在三種查詢的操作符號:inanyall

    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、數據庫的更新操作:insertupdatedelete

爲了保存原始的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: 將編號736988997788的領導及獎金取消

     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、幻讀:一個事務讀取了幾行記錄後,另一個事務插入一些記錄,幻讀就發生了。再後來的

查詢中,第一個事務就會發現有些原來沒有的記錄。

   


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章