SQL筆記 --- 基本表,視圖

目錄

基本表
視圖

基本表

定義基本表

語法格式:

CREATE TABLE <表名>
(<列名> <數據類型>[ <列級完整性約束條件> ]
[,<列名> <數據類型>[ <列級完整性約束條件>] ] …
[,<表級完整性約束條件> ] );

要求:

如果完整性約束條件涉及到該表的多個屬性列,則必須定義在表級上,否則既可以定義在列級也可以定義在表級

約束類型(五大約束):

名稱 作用 實現的完整性
Primary key 定義主鍵,保證主鍵列無重複值 實體完整性
Unique 保證該列無重複值 實體完整性
Foreign key 定義外鍵,保證數據表間數據的一致性 參照完整性
Check 定義表中某些列的數據範圍 自定義完整性
NOT NULL 定義表中某些列的數據不爲空 自定義完整性
Default 爲列的數據提供默認值 自定義完整性

數據基本類型:

數據類型 含義
CHAR(n) 長度爲n的定長字符串
VARCHAR(n) 最大長度爲n的變長字符串,實際存儲有效長度
INT 長整數(也可以寫作 INTEGER)
SMALLINT 短整數
NUMERIC(p,d) 定點數,由p位數字(不包括符號、小數點)組成,小數後面有d位數字
REAL 取決於機器精度的浮點數
Double Precision 取決於機器精度的雙精度浮點數
FLOAT(n) 浮點數,精度至少爲n位數字
DATE 日期,包含年、月、日,格式爲 YYYY-MM-DD
TIME 時間,包含一日的時、分、秒,格式爲 HH:MM:SS

數據庫與表:

  • 關係:
    • 每一個表都屬於某一個數據庫
    • 一個數據庫可以包含多個表

例子:

建立一個“學生選課”表SC

CREATE TABLE SC
(Sno CHAR(9), 
Cno CHAR(4), 
Grade SMALLINT,
PRIMARY KEY (Sno,Cno), 
/* 主碼由兩個屬性構成,必須作爲表級完整性進行定義*/
FOREIGN KEY (Sno) REFERENCES Student(Sno),
/* 表級完整性約束條件,Sno是外碼,被參照表是Student */
FOREIGN KEY (Cno) REFERENCES Course(Cno)
/* 表級完整性約束條件, Cno是外碼,被參照表是Course*/
);

 

修改基本表

語法格式:

ALTER TABLE <表名>
[ ADD <新列名> <數據類型> [ 完整性約束 ] ]
[ DROP <完整性約束名> ]
[ ALTER COLUMN<列名> <數據類型> ]
[ADD [COLUMN<約束名> ] <約束定義> ]
;

例子:

  • 向Student表增加“入學時間”列,其數據類型爲日期型  .
    ALTER TABLE Student
    ADD S_entrance DATE;
  • 將年齡的數據類型由字符型 (假設原來的數據類型是字符型)改爲整數 .
  • ALTER TABLE Student
    ALTER COLUMN Sage INT;

刪除基本表

語法格式:

DROP TABLE <表名>[RESTRICT| CASCADE];(缺省情況是 RESTRICT)

說明:

  • RESTRICT 欲刪除的基本表不能被其他表的約束所引用如果存在依賴該表的對象,則此表不能被刪除,刪除表是有限制的
  • CASCADE 在刪除基本表的同時,相關的依賴對象一起刪除,表上建立的索引、視圖、觸發器等一般也將被刪除.刪除該表沒有限制

例子:

  • 刪除Student表
    DROP TABLE Student CASCADE ;

 

視圖

特點:

  • 是從一個或幾個基本表(或視圖)導出的表
  • 只存放視圖的定義,不存放視圖對應的數據
  • 基表中的數據發生變化,從視圖中查詢出的數據也隨之改變
  • 一個窗口,透過它可以看到數據庫中自己感興趣的數據及其變化

特殊用途:

定義基本表是,爲了減少數據庫中的沉餘數據,表中只存放基本數據,由基本數據經過各種計算派生出的數據一般是不存儲的,但由於視圖中數據並不是實際存儲,所以定義視圖時可以根據應用的需要,設置一些派生屬性列.這些派生屬性由於在基本表中並不實際存在也稱它們爲虛擬列.帶虛擬列的視圖也稱爲帶表達式的視圖

作用:

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

基於視圖的操作:

  • 查詢
  • 刪除
  • 受限更新
  • 定義基於該視圖的新視圖

行列子集視圖:

從單個基本表導出,且只是去掉了基本表的某些行和某些列,但保留了主碼

建立視圖:

  • 語法格式:
    • CREATE VIEW
      <視圖名> [(<列名> [,<列名>]…)]
      AS <子查詢>
      [WITH CHECK OPTION];
  • 說明:
    • WITH CHECK OPTION
      • 表示對視圖進行 UPDATE , INSERT 和 DELETE 操作時要保證更新,插入,刪除的行滿足視圖定義的謂詞條件(即子查詢中的條件表達式)
    • RDBMS 執行 CREATE VIEW 語句時只是把視圖定義存入數據字典,並不執行其中的 SELECT 語句.
    • 在對視圖查詢時,按視圖的定義從基本表中將數據查出
  • 要求:
    • 子查詢可以使任意複雜的 SELECT 語句,但是子查詢不允許含有 ORDER BY 子句和 DISTINCT 短語
    • 下列三種情況下必須指明組成視圖的所有名字
      • 某個目標列不是單純的屬性名,而是聚集函數或列表達式
      • 多表連接時選出幾個同名列作爲視圖的字段
      • 需要在視圖中爲某個列啓用新的更合適的名字
  • 必須明確指定組成視圖的所有列名情況:
    • 的情況 某個目標列不是單純的屬性名,而是聚集函數或列表達式
    • 多表連接時選出了幾個同名列作爲視圖的字段
    • 需要在視圖中爲某個列啓用新的更適合的名字
  • 例子:
    • 建立信息系學生的視圖,並要求進行修改和插入操作時仍需保證該視圖只有信息系的學生
      CREATE VIEW IS_Student
      AS
      SELECT Sno,Sname,Sage
      FROM Student
      WHERE Sdept= 'IS'
      WITH CHECK OPTION;
    • 基於多個基表的視圖  (建立信息系選修了1號課程的學生視圖)
      CREATE VIEW IS_S1(Sno,Sname,Grade)
      AS
      SELECT Student.Sno,Sname,Grade
      FROM Student,SC
      WHERE Student.Sno=SC.Sno
      AND Sdept= 'IS'
      AND SC.Cno= '1';

       

    • 分組視圖  (將學生的學號及他的平均成績定義爲一個視圖假設SC表中“成績”列Grade爲數字型)
      CREATE VIEW S_G(Sno,Gavg)
      AS
      SELECT Sno,AVG(Grade)
      FROM SC
      GROUP BY Sno;
    • 基於視圖的視圖  (建立信息系選修了1號課程且成績在90分以上的學生的視圖)
      CREATE VIEW IS_S2
      AS
      SELECT Sno,Sname,Grade
      FROM IS_S1
      WHERE Grade>=90;
  • 例子解析:
    • 當對 IS_Student 視圖的更新操作
      • 修改操作:在選擇條件處自動加上 Sdept= 'IS' 的條件
      • 刪除操作:在選擇條件處自動加上 Sdept= 'IS' 的條件
      • 插入操作:在選擇條件處自動檢查 Sdept 屬性值是否爲 'IS' (如果不是,則拒絕該插入操作.如果沒有提供 Sdept 屬性值,則自動定義Sdept爲 'IS')

刪除視圖:

  • 語法格式:
    • DROP VIEW <視圖名>[CASCADE];
  • 作用:
    • 該語句從數據字典中刪除指定的視圖定義,如果該視圖上還導出了其他視圖,使用CASCADE級聯刪除語句,把該視圖和由它導出的所有視圖一起刪除
  • 注意:
    • 刪除基表時,由該基表導出的所有視圖定義都必須顯式地使用DROP VIEW語句刪除

視圖查詢:

  • 語法格式:
    • 用戶角度:查詢視圖與查詢基本表相同用SETECT來查詢視圖
  • RDBMS 實現視圖查詢方法:
    • 視圖消解法(View Resolution):
      • 進行有效性檢查
      • 轉換成等價的對基本表的查詢
      • 執行修正後的查詢
  • 視圖消解法的侷限:
    • 有些情況下,視圖消解法不能生成正確查詢

更新視圖:

  • 限制:
    • 一些視圖是不可更新的,因爲對這些視圖的更新不能唯一地有意義地轉換成對相應基本表的更新
    • 允許對行列子集視圖進行更新
    • 對其他類型視圖的更新不同系統有不同限制
      • 若視圖是由兩個以上基本表導出的,則此視圖不允許更新
      • 若視圖的字段來自字段表達式或常數,則不允許對此視圖執行INSERT和UPDATE操作,但是允許執行DELETE操作,
      • 若視圖的字段來自聚集函數,則此視圖不允許更新
      • 若視圖定義中含有GROUP BY子句,則此視圖不允許更新
      • 若視圖定義中含有DISTINCT,則此視圖不允許更新
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章