1. 程式人生 > >SQL(3)--檢視與索引

SQL(3)--檢視與索引

介紹資料修改的SQL語句以及檢視與索引。

資料修改

三種修改方式:

  1. 修改某一個元組的值

    /* 將學生201215121的年齡改為22歲 */
    UPDATE  Student
    SET Sage=22
    WHERE  Sno=' 201215121 '; 
    
  2. 修改多個元組的值

    /* 將所有學生的年齡增加1歲 */
    UPDATE Student
    SET Sage= Sage+1;
    
  3. 帶子查詢的修改語句

    /* 將計算機科學系全體學生的成績置零 */
    UPDATE  SC
    SET  Grade=0
    WHERE  Sno  IN
    (SELECT Sno
    FROM     Student
    WHERE
    Sdept= 'CS' );

要求

  • 關係資料庫管理系統在執行修改語句時會檢查修改操作是否破壞表上已定義的完整性規則
    • 實體完整性
    • 主碼不允許修改(如果被外碼參照)
    • 使用者定義的完整性
      • NOT NULL約束
      • UNIQUE約束
      • 值域約束

刪除資料

  • 語句格式

    • DELETE
      FROM     <表名>
      [WHERE <條件>];
      
  • 功能

    • 刪除指定表中滿足WHERE子句條件的元組
  • WHERE子句

    • 指定要刪除的元組
    • 預設表示要刪除表中的全部元組,表的定義仍在字典中

刪除方式

  1. 刪除某一個元組的值

    /* 刪除學號為201215128的學生記錄。 */
    DELETE
    FROM Student
    WHERE Sno= '201215128';
    
  2. 刪除多個元組的值

    /* 刪除所有的學生選課記錄 */
    DELETE
    FROM SC;
    
  3. 帶子查詢的刪除語句

    /* 刪除計算機科學系所有學生的選課記錄。*/
    DELETE
    FROM  SC
    WHERE  Sno  IN
    (SELETE  Sno
    FROM
    Student WHERE Sdept= 'CS') ;

空值

空值是一個很特殊的值,含有不確定性。對關係運算帶來特殊的問題,需要做特殊的處理。

空值的產生

向SC表中插入一個元組,學生號是”201215126”,課程號是”1”,成績為空。

INSERT INTO SC(Sno,Cno,Grade)
 VALUES('201215126 ','1',NULL);   
/*該學生還沒有考試成績,取空值*/INSERT INTO SC(Sno,Cno)
 VALUES(' 201215126 ','1');             
/*沒有賦值的屬性,其值為空值*/

將Student表中學生號為”201215200”的學生所屬的系改為空值。

UPDATE Student
SET Sdept = NULL
WHERE Sno='201215200';

空值的判斷

判斷一個屬性的值是否為空值,用IS NULLIS NOT NULL來表示。

/* 從Student表中找出漏填了資料的學生資訊*/
SELECT  *
FROM Student
WHERE Sname IS NULL OR Ssex IS NULL OR Sage IS NULL OR Sdept IS NULL;

空值的約束條件

屬性定義(或者域定義)中

  • NOT NULL約束條件的不能取空值
    • Primary Key不能為空值
  • 加了UNIQUE限制的屬性不能取空值
  • 碼屬性不能取空值

空值的運算

  • 空值與另一個值(包括另一個空值)的算術運算的結果為空值
  • 空值與另一個值(包括另一個空值)的比較運算的結果為UNKNOWN
  • UNKNOWN後,傳統二值(TRUE,FALSE)邏輯就擴充套件成了三值邏輯
    • 無論判斷結果是否為True,都不會返回空值

找出選修1號課程的不及格的學生。

SELECT Sno
FROM SC
WHERE Grade < 60 AND Cno='1';

查詢結果不包括缺考的學生,因為他們的Grade值為null。

檢視

  • 虛表,是從一個或幾個基本表(或檢視)匯出的表
  • 只存放檢視的定義,不存放檢視對應的資料
  • 基表中的資料發生變化,從檢視中查詢出的資料也隨之改變

建立檢視

CREATE  VIEW 
<檢視名>  [(<列名>  [,<列名>])]
AS  <子查詢>
[WITH  CHECK  OPTION];
  • 組成檢視的屬性列名:全部省略或全部指定

    • 全部省略
      • 由子查詢中SELECT目標列中的諸欄位組成
    • 明確指定檢視的所有列名
      • 某個目標列是聚集函式或列表達式
      • 多表連線時選出了幾個同名列作為檢視的欄位
      • 需要在檢視中為某個列啟用新的更合適的名字
  • 關係資料庫管理系統執行CREATE VIEW語句時只是把檢視定義存入資料字典,並不執行其中的SELECT語句。

  • WITHCHECK OPTION

    • 對檢視進行UPDATE,INSERT和DELETE操作時要保證更新、插入或刪除的行滿足檢視定義中的謂詞條件(即子查詢中的條件表示式)
  • 在對檢視查詢時,按檢視的定義從基本表中將資料查出。

  • 建立資訊系學生的檢視

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

基於多個基表的檢視

  • 建立資訊系選修了1號課程的學生的檢視(包括學號、姓名、成績)

  • CREATE VIEW IS_S1(Sno,Sname,Grade)
    AS 
    SELECT Student.Sno,Sname,Grade
    FROM  Student,SC
    WHERE  Sdept= 'IS' AND
    Student.Sno=SC.Sno AND
    SC.Cno= '1';
    

帶表示式的檢視

  • 定義一個反映學生出生年份的檢視。

  • CREATE  VIEW BT_S(Sno,Sname,Sbirth)
    AS 
    SELECT Sno,Sname,2014-Sage
    FROM  Student;
    

分組檢視

  • 將學生的學號及平均成績定義為一個檢視

  • CREAT  VIEW S_G(Sno,Gavg)
    AS  
    SELECT Sno,AVG(Grade)
    FROM  SC
    GROUP BY Sno;
    

刪除檢視

  • 語句的格式

    • DROP  VIEW <檢視名>[CASCADE];
      
    • 該語句從資料字典中刪除指定的檢視定義

  • 如果該檢視上還匯出了其他檢視,使用CASCADE級聯刪除語句,把該檢視和由它匯出的所有檢視一起刪除

  • 刪除基表時,由該基表匯出的所有檢視定義都必須顯式地使用DROP VIEW語句刪除

查詢檢視

  • 使用者角度
    • 查詢檢視與查詢基本表相同
  • 關係資料庫管理系統實現檢視查詢的方法
    • 檢視消解法(View Resolution)
    • 進行有效性檢查
    • 轉換成等價的對基本表的查詢
    • 執行修正後的查詢

檢視的作用

  • 檢視能夠簡化使用者的操作
  • 檢視對重構資料庫提供了一定程度的邏輯獨立性
    • 在新表上建立一箇舊表檢視。應用程式在舊錶上的SQL可以保持不變。
  • 檢視能夠對機密資料提供安全保護
  • 適當的利用檢視可以更清晰的表達查詢

索引

  • 建立索引的目的:加快查詢速度
  • 關係資料庫管理系統中常見索引:
    • 順序檔案上的索引
    • B+樹索引
    • 雜湊(hash)索引
    • 點陣圖索引
  • 特點
    • B+樹索引具有動態平衡的優點
    • HASH索引具有查詢速度快的特點

建立索引

語句格式

CREATE [UNIQUE] [CLUSTER] INDEX <索引名> 
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]);
  • <表名>:要建索引的基本表的名字
  • 索引:可以建立在該表的一列或多列上,各列名之間用逗號分隔
  • <次序>:指定索引值的排列次序,升序:ASC,降序:DESC。預設值:ASC
  • UNIQUE:此索引的每一個索引值只對應唯一的資料記錄
  • CLUSTER:表示要建立的索引是聚簇索引

修改索引

ALTER INDEX <舊索引名> RENAME TO <新索引名>

刪除索引

刪除索引時,系統會從資料字典中刪去有關該索引的描述。

DROP INDEX <索引名>;