作業9

數據更新
一、插入數據

1、插入元組

語句格式:
INSERT
INTO <表名> [(<屬性列1>[,<屬性列2 >…)]
VALUES (<常量1> [,<常量2>]… );

降新元組插入指定表中

INTO子句
(1)指定要插入數據的表名及屬性列
(2)屬性列的順序可與表定義中的順序不一致
(3)沒有指定屬性列:表示要插入的是一條完整的元組,且屬性列屬性與表定義中的順序一致
(4)指定部分屬性列:插入的元組在其餘屬性列上取空值
VALUES子句
提供的值的個數和類型必須與INTO子句匹配
例3.69 將一個新學生元組(學號:201215128;姓名:陳冬;性別:男;所在系:IS;年齡:18歲)插入到Student表中。

INSERT
INTO  Student (Sno,Sname,Ssex,Sdept,Sage)
VALUES ('201215128','陳冬','男','IS',18);

1
2
3
在Student表中插入一個元組

下列語句運行失敗:

INSERT  INTO Course(Cno,Cname,Cpno,Ccredit)
VALUES ('1','數據庫','5',4);

1
2
是因爲其中Cpno爲5,而課程號爲5的課程尚未錄入,應先設爲NULL,待該課程錄入後在修改爲5。
例3.71 插入一條選課記錄( ‘200215128’,'1 ')。

INSERT
INTO SC(Sno,Cno)
VALUES ('201215128','1');

1
2
3
關係數據庫管理系統將在新插入記錄的Grade列上自動地賦空值。

或者:

INSERT
INTO SC
VALUES ('201215128','1',NULL);

1
2
3
例3.70 將學生張成民的信息插入到Student表中。(INTO 子句不寫屬性名的情況)

INSERT
INTO  Student
VALUES ('201215126','張成民','男’,18,'CS'); 

1
2
3
INTO子句不寫屬性名,則需按照該表的屬性列順序插入指定信息。

2、插入子查詢結果(可以一次插入多個元組)

語句格式:
INSERT
INTO <表名> [(<屬性列1> [,<屬性列2>… )]
子查詢;
子查詢SELECT子句目標列值的個數和類型必須與INTO子句匹配

例3.72 對每一個系,求學生的平均年齡,並把結果存入數據庫
第一步:建表

CREATE  TABLE  Dept_age
      ( Sdept     CHAR(15),                     /*系名*/
        Avg_age SMALLINT);          	/*學生平均年齡*/

1
2
3
第二步:插入數據

INSERT
INTO  Dept_age(Sdept,Avg_age)
	SELECT  Sdept,AVG(Sage)
	FROM     Student
	GROUP BY Sdept;

1
2
3
4
5
RDBMS在執行插入語句時會自動檢查所插元組是否破壞表上已定義的完整性規則
(1)實體完整性
(2)參照完整性
(3)用戶定義的完整性
二、修改數據
語句格式
UPDATE <表名>
SET <列名>=<表達式>[,<列名>=<表達式>]…
[WHERE <條件>];

功能
(1)修改指定表中滿足WHERE子句條件的元組
(2)SET子句給出<表達式>的值用於取代相應的屬性列
(3)如果省略WHERE子句,表示要修改表中的所有元組

三種修改方式
1、修改某一個元組的值
2、修改多個元組的值
3、帶子查詢的修改語句

1、修改某一個元組的值

例3.73 將學生201215121的年齡改爲22歲

UPDATE  Student
SET Sage=22
WHERE  Sno=' 201215121 '; 

1
2
3
2、修改多個元組的值

例3.74 將所有學生的年齡增加1歲。

UPDATE Student
SET Sage= Sage+1;

1
2
3、帶子查詢的修改語句

例3.75 將計算機科學系全體學生的成績置零。

UPDATE SC
SET     Grade=0
WHERE Sno  IN
           (SELECT Sno
            FROM     Student
            WHERE  Sdept= 'CS' );

1
2
3
4
5
6
先找出計算機科學系學生的學號,再將學號對應的成績置零。

RDBMS在執行修改語句時會檢查修改操作是否破壞表上已定義的完整性規則
(1)實體完整性
(2)主碼不允許修改
(3)用戶定義的完整性

三、刪除數據

語句格式:
DELETE
FROM <表名>
[WHERE <條件>];
功能:
刪除指定表中滿足WHERE子句條件的元組
WHERE子句:
(1)指定要刪除的元組
(2)缺省表示要刪除表中的全部元組,表的定義仍在字典中

三種刪除方式
1、刪除某一個元組的值
2、刪除多個元組的值
3、帶子查詢的刪除語句

1、刪除某一個元組的值

例3.76 刪除學號爲201215128的學生記錄。

DELETE
FROM Student
WHERE Sno= 201215128 ';

1
2
3
得先將SC中該學號的內容刪除,才能運行成功。

2、刪除多個元組的值

例3.77 刪除所有的學生選課記錄。

DELETE
FROM SC;

1
2
3、帶子查詢的刪除語句

例3.78 刪除計算機科學系所有學生的選課記錄。

DELETE
FROM  SC
WHERE  Sno  IN
		(SELECT  Sno
	     FROM   Student
	     WHERE  Sdept= 'CS') ;

1
2
3
4
5
6
空值的處理
空值就是“不知道”或“不存在”或“無意義”的值。
一般有以下幾種情況:
(1)該屬性應該有一個值,但目前不知道它的具體值
(2)該屬性不應該有值
(3)由於某種原因不便於填寫

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

1、空值的產生

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

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

1
2

INSERT INTO SC(Sno,Cno)
VALUES(' 201215126 ','1');             /*沒有賦值的屬性,其值爲空值*/

1
2
例3.80 將Student表中學生號爲”201215200”的學生所屬的系改爲空值。

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

1
2
3
2、空值的判斷

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

例 3.81 從Student表中找出漏填了數據的學生信息

SELECT  *
FROM Student
WHERE Sname IS NULL OR Ssex IS NULL OR Sage IS NULL OR Sdept IS NULL;

在這裏插入圖片描述
3、空值的約束條件

屬性定義(或者域定義)中
(1)有NOT NULL約束條件的不能取空值
(2)加了UNIQUE限制的屬性不能取空值
(3)碼屬性不能取空值

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

SELECT Sno
FROM SC
WHERE Grade < 60 AND Cno=‘1’;
在這裏插入圖片描述
例 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'

在這裏插入圖片描述
視圖
視圖的特點
(1)虛表,是從一個或幾個基本表(或視圖)導出的表
(2)只存放視圖的定義,不存放視圖對應的數據
(3)基表中的數據發生變化,從視圖中查詢出的數據也隨之改變

一、定義視圖

1、建立視圖

語句格式:
CREATE VIEW
<視圖名> [(<列名> [,<列名>]…)]
AS <子查詢>
[WITH CHECK OPTION];

WITH CHECK OPTION
對視圖進行更新操作時自動添加子查詢中的條件

組成視圖的屬性列名:全部省略或全部指定
全部省略:
由子查詢中SELECT目標列中的諸字段組成
全部指定:(明確指定所有列名)
(1)某個目標列是聚集函數或列表達式
(2)多表連接時選出了幾個同名列作爲視圖的字段
(3)需要在視圖中爲某個列啓用新的更合適的名字

1、關係數據庫管理系統執行CREATE VIEW語句時只是把視圖定義存入數據字典,並不執行其中的SELECT語句。
2、在對視圖查詢時,按視圖的定義從基本表中將數據查出。
3、若一個視圖是從單個基本表導出的,並且只是去掉了基本表的某些行和某些列,但保留了主碼,我們稱這類視圖爲行列子集視圖。
例3.84 建立信息系學生的視圖。

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

1
2
3
4
5
例3.85 建立信息系學生的視圖,並要求進行修改和插入操作時仍需保證該視圖只有信息系的學生 。

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

例3.86 建立信息系選修了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';

例3.88 定義一個反映學生出生年份的視圖。

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

1
2
3
4
分組視圖

例3.89 將學生的學號及平均成績定義爲一個視圖

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

1
2
3
4
5
例3.90 將Student表中所有女生記錄定義爲一個視圖

 CREATE VIEW F_Student(F_Sno,name,sex,age,dept)
 AS
  SELECT  *                        /*沒有指定屬性列*/
  FROM  Student
  WHERE Ssex='女';

1
2
3
4
5
2、刪除視圖

語句的格式:
DROP VIEW <視圖名>[CASCADE];

· 該語句從數據字典中刪除指定的視圖定義
· 如果該視圖上還導出了其他視圖,使用CASCADE級聯刪除語句,把該視圖和由它導出的所有視圖一起刪除
· 刪除基表時,由該基表導出的所有視圖定義都必須顯式地使用DROP VIEW語句刪除

例3.91 刪除視圖BT_S和IS_S1

DROP VIEW BT_S;	/*成功執行*/
DROP VIEW IS_S1;	/*拒絕執行*/

1
2
要刪除IS_S1,需使用級聯刪除,同時刪除IS_S2:
1
DROP VIEW IS_S1 CASCADE;
1
二、查詢視圖

用戶角度:查詢視圖與查詢基本表相同
RDBMS實現視圖查詢的方法:
1、視圖消解法(View Resolution)
(1)進行有效性檢查
(2)轉換成等價的對基本表的查詢
(3)執行修正後的查詢

視圖消解:從數據字典中取出視圖的定義,把定義中的子查詢和用戶的查詢結合起來,轉換成等價的對基本表的查詢,然後再執行修正了的查詢。這一轉換過程稱爲視圖消解。

例3.92 在信息系學生的視圖中找出年齡小於20歲的學生。

SELECT   Sno,Sage
FROM      IS_Student
WHERE   Sage<20;

1
2
3
視圖消解轉換後的查詢語句爲:

 SELECT  Sno,Sage       
 FROM  Student
 WHERE  Sdept= 'IS'  AND  Sage<20;

1
2
3
視圖消解法的侷限
有些情況下,視圖消解法不能生成正確的查詢。
例3.94 在S_G視圖中查詢平均成績在90分以上的學生學號和平均成績

SELECT *
FROM   S_G
WHERE  Gavg>=90;

1
2
3
S_G視圖定義:

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

1
2
3
4
5
錯誤:

SELECT Sno,AVG(Grade)
FROM     SC
WHERE  AVG(Grade)>=90
GROUP BY Sno;

1
2
3
4
正確:

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

1
2
3
4
例3.94 可以用如下SQL語句完成

SELECT *
FROM  (SELECT Sno,AVG(Grade)
	       FROM  SC 
	       GROUP BY Sno) AS S_G(Sno,Gavg)
WHERE Gavg>=90;

1
2
3
4
5
三、更新視圖(通過視圖進行)

例3.95 將信息系學生視圖IS_Student中學號”201215122”的學生姓名改爲”劉辰”。

UPDATE  IS_Student
SET  Sname= '劉辰'
WHERE  Sno= '201215122 ';

1
2
3
同改表內信息類似
轉換後的語句:

UPDATE  Student
SET Sname= '劉辰'
WHERE Sno= '201215122 ' AND Sdept= 'IS';

1
2
3
例3.96 向信息系學生視圖IS_S中插入一個新的學生記錄,其中學號爲”201215129”,姓名爲”趙新”,年齡爲20歲

INSERT
INTO IS_Student
VALUES('201215129','趙新',20);

1
2
3
轉換爲對基本表的更新:

INSERT
INTO   Student(Sno,Sname,Sage,Sdept)
VALUES('200215129 ','趙新',20,'IS' );

1
2
3
例3.97 刪除信息系學生視圖IS_Student中學號爲”201215129”的記錄

DELETE
FROM IS_Student
WHERE Sno= '201215129 ';

1
2
3
轉換爲對基本表的更新:

DELETE
FROM Student
WHERE Sno= '201215129 ' AND Sdept= 'IS';

1
2
3
更新視圖的限制:一些視圖是不可更新的,因爲對這些視圖的更新不能唯一地有意義地轉換成對相應基本表的更新

例:例3.89定義的視圖S_G爲不可更新視圖。

UPDATE  S_G
SET          Gavg=90
WHERE  Sno= '201215121';

1
2
3
因爲Gavg並不存在對應的基本表中的實際數據

一般的,行列子集視圖是可更新的。目前各個關係數據庫管理系統一般都只允許對行列子集視圖進行更新,而且各個系統對視圖的更新還有進一步的規定,這些規定不盡相同

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