數據更新
插入數據
兩種插入數據方式:
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 適當的利用視圖可以更清晰的表達查詢