1. 程式人生 > >資料庫總結(三)

資料庫總結(三)

關係資料庫標準語言SQL

3.1  資料定義 
SQL的資料定義功能: 
模式定義
表定義
檢視和索引的定義 

3.2資料查詢
語句格式
       SELECT [ALL|DISTINCT] <目標列表達式>[,<目標列表達式>] …
       FROM <表名或檢視名>[,<表名或檢視名> ]…|(SELECT 語句)      
                   [AS]<別名>
[ WHERE <條件表示式> ]
[ GROUP BY <列名1> [ HAVING <條件表示式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
SELECT子句:指定要顯示的屬性列
FROM子句:指定查詢物件(基本表或檢視)
WHERE子句:指定查詢條件
GROUP BY子句:對查詢結果按指定列的值分組,該屬性列值相等的元組為一個組。通常會在每組中作用聚集函式。
HAVING短語:只有滿足指定條件的組才予以輸出
ORDER BY子句:對查詢結果表按指定列值的升序或降序排序 

連線查詢 
連線查詢:同時涉及兩個以上的表的查詢
連線條件或連線謂詞:用來連線兩個表的條件
     一般格式:
[<表名1>.]<列名1>  <比較運算子>  [<表名2>.]<列名2>
[<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>
連線欄位:連線謂詞中的列名稱
連線條件中的各連線欄位型別必須是可比的,但名字不必相同


多表連線
多表連線:兩個以上的表進行連線

[例3.54]查詢每個學生的學號、姓名、選修的課程名及成績
  SELECT Student.Sno, Sname, Cname, Grade
   FROM    Student, SC, Course    /*多表連線*/
   WHERE Student.Sno = SC.Sno 
                  AND SC.Cno = Course.Cno;

巢狀查詢概述
一個SELECT-FROM-WHERE語句稱為一個查詢塊
將一個查詢塊巢狀在另一個查詢塊的WHERE子句或HAVING短語的條件中的查詢稱為巢狀查詢

     SELECT Sname                               /*外層查詢/父查詢*/
     FROM Student
     WHERE Sno IN
                        ( SELECT Sno        /*內層查詢/子查詢*/
                          FROM SC
                          WHERE Cno= ' 2 ');

帶有IN謂詞的子查詢
將第一步查詢嵌入到第二步查詢的條件中
    SELECT Sno, Sname, Sdept
        FROM Student
       WHERE Sdept  IN
                  (SELECT Sdept
                   FROM Student
                   WHERE Sname= ' 劉晨 ');
    此查詢為不相關子查詢。


帶有比較運算子的子查詢
可能的執行過程(續) 
執行內層查詢,得到值88(近似值),用該值代替內層查詢,得到外層查詢:
           SELECT Sno,Cno
           FROM     SC x
          WHERE  Grade >=88


帶有ANY(SOME)或ALL謂詞的子查詢 
使用ANY或ALL謂詞時必須同時使用比較運算
語義為:
      > ANY    大於子查詢結果中的某個值       
> ALL    大於子查詢結果中的所有值
< ANY    小於子查詢結果中的某個值    
< ALL    小於子查詢結果中的所有值
>= ANY    大於等於子查詢結果中的某個值    
>= ALL    大於等於子查詢結果中的所有值
使用ANY或ALL謂詞時必須同時使用比較運算
語義為(續)
<= ANY    小於等於子查詢結果中的某個值    
<= ALL    小於等於子查詢結果中的所有值
= ANY    等於子查詢結果中的某個值        
=ALL    等於子查詢結果中的所有值(通常沒有實際意義)
!=(或<>)ANY    不等於子查詢結果中的某個值
!=(或<>)ALL    不等於子查詢結果中的任何一個值
[例 3.58]  查詢非計算機科學系中比計算機科學系任意一個學生年齡小的學生姓名和年齡
    SELECT Sname,Sage
    FROM    Student
    WHERE Sage < ANY (SELECT  Sage
                                         FROM    Student
                                         WHERE Sdept= ' CS ')
     AND Sdept <> ‘CS ' ;           /*父查詢塊中的條件 */

帶有EXISTS謂詞的子查詢
EXISTS謂詞
存在量詞  
帶有EXISTS謂詞的子查詢不返回任何資料,只產生邏輯真值“true”或邏輯假值“false”。
若內層查詢結果非空,則外層的WHERE子句返回真值
若內層查詢結果為空,則外層的WHERE子句返回假值
由EXISTS引出的子查詢,其目標列表達式通常都用 * ,因為帶EXISTS的子查詢只返回真值或假值,給出列名無實際意義。

NOT EXISTS謂詞
若內層查詢結果非空,則外層的WHERE子句返回假值
若內層查詢結果為空,則外層的WHERE子句返回真值
[例 3.61]  查詢沒有選修1號課程的學生姓名。
     SELECT Sname
     FROM     Student
     WHERE NOT EXISTS
                   (SELECT *
                    FROM SC
                    WHERE Sno = Student.Sno AND Cno='1')


集合查詢
[例 3.64]  查詢計算機科學系的學生及年齡不大於19歲的學生。
        SELECT *
        FROM Student
        WHERE Sdept= 'CS'
        UNION
        SELECT *
        FROM Student
        WHERE Sage<=19;

UNION:將多個查詢結果合併起來時,系統自動去掉重複元組
UNION ALL:將多個查詢結果合併起來時,保留重複元組 


WHERE子句的條件表示式的可選格式
(1)
                            <屬性列名>
<屬性列名> θ      <常量>
                        [ANY|ALL] (SELECT語句)
 
(2)                         
                        <屬性列名>                    <屬性列名>  
<屬性列名> [NOT] BETWEEN   <常量>               AND   <常量>      
                                       (SELECT語句)          (SELECT語句)
(3)                       (<值1>[,<值2> ] …)
 <屬性列名> [NOT] IN                    
                                   (SELECT語句)
 
  (4)   <屬性列名> [NOT] LIKE <匹配串>
  (5)  <屬性列名> IS [NOT] NULL
  (6)  [NOT] EXISTS (SELECT語句)
(7)
                  AND                        AND
 <條件表示式>                <條件表示式>                   <條件表達>    …
                  OR                          OR

    x       y

  x   AND   y

  x    OR     y

   NOT    x

    T      T

         T

         T

     F

    T      U

         U

         T

     F

    T      F

         F

         T

     F

    U     T

         U

         T

     U

    U     U

         U

         U

     U

    U     F

         F

         U

     U

    F     T

         F

         T

     T

    F     U

         F

         U

     T

    F     F

         F

         F

     T

 

[例 3.83]  選出選修1號課程的不及格的學生以及缺考的學生
SELECT Sno
FROM SC
WHERE Grade < 60 AND Cno='1'
UNION
SELECT Sno
FROM SC
WHERE Grade IS NULL AND Cno='1'
或者
SELECT Sno
FROM SC
WHERE Cno='1' AND (Grade<60 OR Grade IS NULL);

3.7  檢視檢視的特點
虛表,是從一個或幾個基本表(或檢視)匯出的表
只存放檢視的定義,不存放檢視對應的資料
基表中的資料發生變化,從檢視中查詢出的資料也隨之改變
1. 建立檢視
語句格式
       CREATE  VIEW 
             <檢視名>  [(<列名>  [,<列名>]…)]
       AS  <子查詢>
       [WITH  CHECK  OPTION];
WITH CHECK OPTION
對檢視進行UPDATE,INSERT和DELETE操作時要保證更新、插入或刪除的行滿足檢視定義中的謂詞條件(即子查詢中的條件表示式)
子查詢可以是任意的SELECT語句,是否可以含有ORDER BY子句和DISTINCT短語,則決定具體系統的實現。


[例3.84]  建立資訊系學生的檢視。

        CREATE VIEW IS_Student
        AS 
        SELECT Sno,Sname,Sage
        FROM     Student
        WHERE  Sdept= 'IS';

2. 刪除檢視
語句的格式:
        DROP  VIEW  <檢視名>[CASCADE];
該語句從資料字典中刪除指定的檢視定義
如果該檢視上還匯出了其他檢視,使用CASCADE級聯刪除語句,把該檢視和由它匯出的所有檢視一起刪除 
刪除基表時,由該基表匯出的所有檢視定義都必須顯式地使用DROP VIEW語句刪除 
   [例3.91 ] 刪除檢視BT_S和IS_S1
        DROP VIEW BT_S;    /*成功執行*/
        DROP VIEW IS_S1;    /*拒絕執行*/
          
           要刪除IS_S1,需使用級聯刪除:
           DROP VIEW IS_S1 CASCADE;            
3.7.2  查詢檢視
使用者角度:查詢檢視與查詢基本表相同
關係資料庫管理系統實現檢視查詢的方法
檢視消解法(View Resolution)
進行有效性檢查
轉換成等價的對基本表的查詢
執行修正後的查詢
[例3.92]  在資訊系學生的檢視中找出年齡小於20歲的學生。
       SELECT   Sno,Sage
       FROM      IS_Student
       WHERE   Sage<20;

檢視消解轉換後的查詢語句為:
 SELECT  Sno,Sage       
 FROM  Student
 WHERE  Sdept= 'IS'  AND  Sage<20;
錯誤:
SELECT Sno,AVG(Grade)
FROM     SC
WHERE  AVG(Grade)>=90
GROUP BY Sno;

正確:
SELECT  Sno,AVG(Grade)
FROM  SC
GROUP BY Sno
HAVING AVG(Grade)>=90;

更新檢視
[例3.95]  將資訊系學生檢視IS_Student中學號”201215122”的學生姓名改為”劉辰”。
UPDATE  IS_Student
SET  Sname= '劉辰'
WHERE  Sno= ' 201215122 ';
轉換後的語句:
UPDATE  Student
SET Sname= '劉辰'
WHERE Sno= ' 201215122 ' AND Sdept= 'IS';


3.7.4  檢視的作用
檢視能夠簡化使用者的操作
檢視使使用者能以多種角度看待同一資料 
檢視對重構資料庫提供了一定程度的邏輯獨立性 
檢視能夠對機密資料提供安全保護
適當的利用檢視可以更清晰的表達查詢