數據庫作業9:SQL練習6 - INSERT / UPDATE / DELETE / NULL / VIEW

數據更新

插入數據
兩種插入數據方式:
1 插入元組
2 插入子查詢結果
可以一次插入多個元組

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

[3.69]將一個新學生元組(學號:201215133;姓名:陳東;性別:男;所在系:IS;年齡:18歲)插入到Student表中。

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

[例3.70]將學生張成民的信息插入到Student表中。

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

[例3.71] 插入一條選課記錄( ‘200215128’,'1 ')

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

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

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

第二步:插入數據

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

修改數據

語句格式 :
UPDATE <表名>
SET <列名>=<表達式>[,<列名>=<表達式>]…
[WHERE <條件>];

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

三種修改方式
修改某一個元組的值
修改多個元組的值
帶子查詢的修改語句
[例3.73] 將學生201215121的年齡改爲22歲

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

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

    UPDATE Student
       SET Sage= Sage+1;

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

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

刪除數據

語句格式
DELETE
FROM <表名>
[WHERE <條件>];

功能
刪除指定表中滿足WHERE子句條件的元組
WHERE子句
指定要刪除的元組
缺省表示要刪除表中的全部元組,表的定義仍在字典中

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

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

    DELETE
     FROM Student
     WHERE Sno= 201215128 ';

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

    DELETE
    FROM SC;

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

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

空值的處理

空值就是“不知道”或“不存在”或“無意義”的值。

一般有以下幾種情況:
該屬性應該有一個值,但目前不知道它的具體值
該屬性不應該有值
由於某種原因不便於填寫

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

1.空值的產生

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

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

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

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

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.空值的約束條件

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

[例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'
或者
SELECT Sno
FROM SC
WHERE Cno='1' AND (Grade<60 OR Grade IS NULL);

視圖

視圖的特點

虛表,是從一個或幾個基本表(或視圖)導出的表
只存放視圖的定義,不存放視圖對應的數據
基表中的數據發生變化,從視圖中查詢出的數據也隨之改變

定義視圖

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

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

組成視圖的屬性列名:全部省略或全部指定

全部省略:
由子查詢中SELECT目標列中的諸字段組成

全部指定:(明確指定所有列名)
某個目標列是聚集函數或列表達式
多表連接時選出了幾個同名列作爲視圖的字段
需要在視圖中爲某個列啓用新的更合適的名字

關係數據庫管理系統執行CREATE VIEW語句時只是把視圖定義存入數據字典,並不執行其中的SELECT語句。
在對視圖查詢時,按視圖的定義從基本表中將數據查出。

[例3.84] 建立信息系學生的視圖。

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

[例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.87] 建立信息系選修了1號課程且成績在90分以上的學生的視圖。

    CREATE VIEW IS_S2
    AS
    SELECT Sno,Sname,Grade
    FROM  IS_S1
    WHERE  Grade>=90;

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

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

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

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

2.刪除視圖

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

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

[例3.91 ] 刪除視圖BT_S和IS_S1

DROP VIEW BT_S; /*成功執行*/
DROP VIEW IS_S1; /*拒絕執行*/
	要刪除IS_S1,需使用級聯刪除,同時刪除IS_S2:
	DROP VIEW IS_S1 CASCADE;

3.查詢視圖

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

SELECT   Sno,Sage       
FROM      IS_Student       
WHERE   Sage<20; 

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

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

[例3.94]在S_G視圖中查詢平均成績在90分以上的學生學號和平均成績

SELECT *
FROM   S_G
WHERE  Gavg>=90;        
S_G視圖定義:             
CREATE VIEW S_G (Sno,Gavg)            
AS 
SELECT  Sno,AVG(Grade)
FROM  SCGROUP BY Sno;

[例3.94]可以用如下SQL語句完成

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

4.更新視圖

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

UPDATE  IS_Student
SET  Sname= '劉辰'
WHERE  Sno= ' 201215122 ';
轉換後的語句:
UPDATE  Student
SET Sname= '劉辰'
WHERE Sno= ' 201215122 ' AND Sdept= 'IS';

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

INSERT
INTO IS_Student
VALUES(‘201215129’,’趙新’,20);
轉換爲對基本表的更新:
INSERT
INTO   Student(Sno,Sname,Sage,Sdept)
VALUES(‘200215129 ','趙新',20,'IS' );

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

DELETE
FROM IS_Student
WHERE Sno= ' 201215129 ';
轉換爲對基本表的更新:
DELETE
FROM Student
WHERE Sno= ' 201215129 ' AND Sdept= 'IS';

視圖的作用

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

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