- 【例3.69】~【例3.97】
- 第三章 總結
1. 在SQLserver上運行,觀察運行效果,並把代碼寫到作業中。
2. 寫出自己的理解/收穫/心得體會(部分比較複雜的例題,建議增加測試方法和測試數據,舉一反三)。
作業原地址:作業
目錄
數據更新操作有三種:想表中添加若干行數據、修改表中的數據和刪除表中的若干行數據。
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 NULL 或 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限制條件的屬性、碼屬性不能取空值。
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規定以下情況視圖允許更新:
- 若視圖是由兩個以上基本表導出的。
- 若視圖的字段來自字段表達或常數,則不允許對此視圖執行INSERT 和 UPDATE 操作,但允許執行 DELETE 操作。
- 若視圖的字段來自聚集函數。
- 若視圖定義中含有GROUP BY 子句。
- 若視圖定義中含有DISTNCT 短語。
- 若視圖定義中有嵌套查詢,並且內層查詢的FROM子句中涉及的表也是導出該視圖的基本表。
- 一個不允許更新的視圖上定義的視圖。
總結
開頭幾個例題在之前的作業做過,而且當時也順着往下預習了一些,大概也有些瞭解,做題也是蠻順利的。
唯一難受的還是題量太大了(哭),將近30道例題。寫完腰都累疼了。
目前沒發現較大的問題,都還好,學了這麼久了,也悟出個一二三了。
上期傳送門:【數據庫】作業8——SQL練習5 - SELECT(嵌套查詢EXISTS、集合查詢、基於派生表的查詢)
下期傳送門:————
問題(暫無)
暫無。
完成時間:2h52min
以上
————(2020.3.29)