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


 

  • 【例3.69】~【例3.97】
  • 第三章 總結

1. 在SQLserver上運行,觀察運行效果,並把代碼寫到作業中。

2. 寫出自己的理解/收穫/心得體會(部分比較複雜的例題,建議增加測試方法和測試數據,舉一反三)。

作業原地址:作業

 

目錄

3.5.1插入數據

1.插入元組

2.插入子查詢結果

3.5.2修改數據

1.修改某一元組的值

3.帶子查詢的修改語句

3.5.3刪除數據

1.刪除一個元組的值

2.刪除多個元組的值

3.帶子查詢的刪除語句

3.6空值的處理

1.空值的產生

2.空值的判斷

3.空值的約束條件

4.空值的算術運算、比較運算和邏輯運算

3.7視圖

3.7.1定義視圖

1.建立視圖

2.刪除視圖

3.7.2查詢視圖

3.73更新視圖

總結

問題(暫無)

          以上



 

數據更新操作有三種:想表中添加若干行數據、修改表中的數據和刪除表中的若干行數據。

3.5.1插入數據

 

1.插入元組

 

【例3.69】——【例3.71】已做:【數據庫】作業5——SQL練習2 - INDEX / INSERT / SELECT

 

2.插入子查詢結果

 

INSERT

INTO <表名> [(<屬性列1> [,<屬性列2>… )]

子查詢;

 

【例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;                   /*按系分組求平均年齡*/

 

 

3.5.2修改數據

 

UPDATE <表名>

SET <列名>=<表達式>[,<列名>=<表達式>]…

[WHERE <條件>];

 

其功能是修改指定表中滿足WHERER子句條件的元組。

SET子句給出<表達式>的值用於取代相應的屬性列值。

 

1.修改某一元組的值

 

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

 

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

 

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

 

UPDATE Student
SET Sage=Sage+1;

 

3.帶子查詢的修改語句

 

子查詢也可以嵌套在UPDATE子句中,用以構造修改的條件。

 

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

 

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

 

 

3.5.3刪除數據

 

 

DELETE 

FROM <表名>

[WHERE <條件>];

 

刪除滿足WHERE子句條件的所有元組。

 

1.刪除一個元組的值

 

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

 

DELETE
FROM Student
WHERE Sno='201215128';

 

2.刪除多個元組的值

 

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

 

DELETE
FROM SC;

 

注:這條DELETE語句是SC成爲空表,它刪除了SC的所有元組。

 

3.帶子查詢的刪除語句

 

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

 

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

 

3.6空值的處理

 

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

情況:

  • 該屬性應該有一個值,但是目前不知道它的具體值。
  • 該屬性不應該有值。
  • 由於某種原因不便於填寫。

空值是一個很特殊的值,含有不確定性。

 

1.空值的產生

 

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

 

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

 

INSERT INTO SC(Sno,Cno)
       VALUES('201215129','1');        /*在插入語句中沒有賦值的屬性,其值爲空值*/ 

 

 

【例3.80】將Student表中學生號爲”201215200”的學生所屬的系改爲空值

 

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

 

 

2.空值的判斷

 

判斷一個屬性的值是否爲空值,用IS NULLNOT 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限制條件的屬性、碼屬性不能取空值。

 

4.空值的算術運算、比較運算和邏輯運算

 

 

 

【例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);

 

3.7視圖

 

視圖是從一個或幾個基本表(或視圖)導出的表,是一個虛表。

視圖一經定義,就可以和基本表一樣被查詢、被刪除,也可以在一個視圖之上再定義新的視圖,但對視圖的更新(增、刪、改)操作則有一定的限制。

 

3.7.1定義視圖

 

1.建立視圖

 

使用CREATE VIEW 命令建立視圖。

 

CREATE VIEW <視圖名> [(<列名> [,<列名>]…)]

AS <子查詢>

[WITH CHECK OPTION];

 

子查詢可以是任意的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;

 

注:由於在定義IS_Student視圖時加上了WITH CHECK OPTION 子句,關係數據庫管理系統會自動加上Sdept='IS'的條件。

行列子集視圖:若一個視圖是從單個基本表導出的,並且只是去掉了基本表中的某些行和某些列,但是保留了主碼,則稱這類視圖爲行列子集視圖。

 

【例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,2020-Sage
FROM Student;

 

分組視圖:帶有聚集函數和GROUP BY 子句的查詢來定義視圖。

 

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

 

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

 

【例3.90】將Student表中所有女生記錄定義爲一個視圖

 

CREATE VIEW F_Student(F_Sno,name,sex,age,dept)
AS
SELECT *
FROM Student
WHERE Ssex='女';

 

2.刪除視圖

 

DROP VIEW <視圖名>[CASCADE];

 

視圖刪除後視圖的定義將從數據字典中刪除。如果該視圖上還導出了其他視圖,則使用CASCADE級聯刪除語句把該視圖和由它導出的所有視圖一起刪除。

刪除字典中的視圖定義需要顯式地使用DROP VIEW 語句,

 

【例3.91】刪除視圖BT_S和視圖IS_S1

 

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

 

如果確定要刪除IS_S2視圖,則使用級聯刪除語句:

 

DROP VIEW IS_S1 CASCADE;

 

3.7.2查詢視圖

 

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

 

SELECT Sno,Sage
FROM IS_Student
WHERE Sage<20;

 

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

 

轉換:

 

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

 

【例3.93】查詢選修了1號課程的信息系學生

 

SELECT IS_Student,Sno,Sname
FROM IS_Student,SC
WHERE IS_Student.Sno=SC.Sno AND SC.Cno='1';

 

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

 

SELECT *
FROM S_G
WHERE Gavg>=90;

 

與定義S_G視圖的子查詢相結合:

 

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

注:WHERE子句中是不能用聚集函數作爲條件表達式的。

 

3.73更新視圖

 

更新視圖是指通過視圖來插入(INSERT)、刪除(DELETE)和修改(UPDATE)數據。

視圖是不實際存儲數據的虛表,對視圖的更新最終要轉換爲對基本表的更新。

 

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

 

UPDATE IS_Student
SET Sname='張力'
WHERE Sno='201215125';

轉換後的更新語句:

UPDATE Student
SET Sname='張力'
WHERE Sno='20121515' AND Sdept='IS';

 

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

 

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

 轉換爲對基本表的更新:

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

 

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

 

DELETE
FROM IS_Student
WHERE Sno='201215129';

轉換爲對基本表的更新:

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

 

注:並不是所有的視圖都是可更新的,因爲有些視圖的更新不能唯一地有意義地轉換爲對應基本表的更新。

例如,DB2規定以下情況視圖允許更新:

  1. 若視圖是由兩個以上基本表導出的。
  2. 若視圖的字段來自字段表達或常數,則不允許對此視圖執行INSERT 和 UPDATE 操作,但允許執行 DELETE 操作。
  3. 若視圖的字段來自聚集函數。
  4. 若視圖定義中含有GROUP BY 子句。
  5. 若視圖定義中含有DISTNCT 短語。
  6. 若視圖定義中有嵌套查詢,並且內層查詢的FROM子句中涉及的表也是導出該視圖的基本表。
  7. 一個不允許更新的視圖上定義的視圖。

 


總結

 

開頭幾個例題在之前的作業做過,而且當時也順着往下預習了一些,大概也有些瞭解,做題也是蠻順利的。

唯一難受的還是題量太大了(哭),將近30道例題。寫完腰都累疼了。

目前沒發現較大的問題,都還好,學了這麼久了,也悟出個一二三了。

 


 

上期傳送門:【數據庫】作業8——SQL練習5 - SELECT(嵌套查詢EXISTS、集合查詢、基於派生表的查詢)

下期傳送門:————

 


問題(暫無)

 

暫無。


完成時間:2h52min

          以上

                                         ————(2020.3.29)

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