- 王珊《數據庫系統概論》(第4版)章節專項練習及詳解
- 圣才電子書
- 4506字
- 2021-06-04 17:41:46
第3章 關系數據庫標準語言SQL
一、選擇題
1SQL的運算參數和結果都是( )形式。
A.關系
B.元組
C.數據項
D.屬性
【答案】A
【解析】結構化查詢語言是一種非過程化、面向集合的數據庫語言。面向集合的特點是指SQL的運算參數和結果都是集合形式-表或關系。
2以下有關索引的敘述中正確的是( ?。?/p>
A.索引越多,更新速度越快
B.索引可以用來提供多種存取路徑
C.索引需要用戶維護,并列索引中列的個數不受限制
D.索引需要用戶維護
【答案】B
【解析】索引是建立在列上的一種數據對象,它對表中的數據提供一種邏輯順序,當在數據庫表中搜索某一行時,可以通過使用索引來找到它的物理位置。索引一旦建立后就交由DBMS管理,不需人工干預,所以索引是動態的,每當數據庫表更新,相應的索引也隨之更新,為此,過多的索引列和頻繁的數據更新都會消耗系統資源,增加系統開銷,從而降低索引應有的作用。
3下面描述正確的是( ?。?/p>
A.可以在任何數據庫中創建視圖
B.可以在視圖上創建索引
C.如果視圖引用的基表或者視圖被刪除,則該視圖不能再被使用,直到創建新的基表或者視圖
D.通過視圖查詢數據時,SQL Server不檢查數據完整性規則
【答案】C
【解析】創建和使用視圖需遵循一些基本原則,為此還應注意以下問題:
①只能在當前數據庫中創建視圖。
②如果視圖引用的基表或者視圖被刪除,則該視圖不能再被使用,直到創建新的基表或者視圖。
③不能在視圖上創建索引,不能在規則、默認、觸發器的定義中引用視圖。
④當通過視圖查詢數據時,SQL Server要檢查數據完整性規則,以確保語句中涉及的所有數據庫對象存在,而且數據修改語句不能違反數據完整性規則。
4查詢選課關系SC(Sno,Cno,Score)表中還沒有給定成績(Score)的課程號(Sno)和學號(Cno),下列語句正確的是( ?。?/p>
A.SELECT Sno,Cno FROM SC WHERE Score IS NULL
B.SELECT*FROM SC WHERE Score=NULL
C.SELECT Sno,Cno FROM SC
D.SELECT Score FROM SC WHERE Sno,Cno IS NOT NULL
【答案】A
【解析】在數據庫基本表中,還沒有給定成績的屬性列,意味著該屬性列的數據還從未更新過,為此,其值應該是空(NULL),SQL中可以用IS NULL和IS NOT NULL來查詢屬性列值是空值或不為空值的元組。根據題意,應該選擇A項。注意,IS不能用“=”來代替。
5SQL語言中,HAVING子句用于篩選滿足條件的( )。
A.列
B.行
C.分組
D.元組
【答案】C
【解析】HAVING子句常與GROUP BY子句聯合使用,GROUP BY通常指出分組的依據列,即依據那個屬性列來分組,而HAVING子句則指出各分組提取的條件。例如:要求列出某班本學期所有課程中,班級平均成績高于75的課程號、課程名稱時,GROUP BY子句應該指出分組的依據是選課關系中的課程號屬性列,HAVING子句則提出該課程的全班平均成績AVG要高于75,低于75的就不提取了。
6某校選課關系基本表SC(S#,C#,Grade),其中S#,C#分別代表學號和課程號且均為字符型數據,Grade表示成績為數值型數據,現要往該表中插入數據,請問以下語句中不正確的是( )。
A.INSERT INTO SC(S#,C#,Grade)VALUES(‘S4’,‘C6’,90)
B.INSERT INTO SC(S#,C#)VALUES(‘S5’,‘C8’)
C.INSERT INTO SC VALUES<‘S4’,‘C4’,85)
D.INSERT INTO SC(S#,C#,Grade)VALUES(S2,C3,89)
【答案】D
【解析】在SQL語言中,使用INSERT語句插入數據時,需要注意以下幾個問題:首先,列名表和元組值中的項數應該對稱相等,并且保持數據類型一致;其次,元組值中給出的數據元素個數應該小于等于關系模式中的屬性列個數,而且此時列名表不可缺省,列名表中未給出的屬性列的值在插入時取默認值1此外,列表名缺省時意味著取關系模式中的全部屬性列,而且其順序與模式定義一致,插入時還需要注意非空屬性列值的輸入及主碼列值的唯一性等問題。
7下列哪個函數能將一個表達式從一種數據類型改變為另一種數據類型?( ?。?/p>
A.COUNT(*)
B.COUNT(*)
C.CONVERT(*)
D.AVG(*)
【答案】C
【解析】CONVERT函數能將某種數據類型的表達式顯式轉換為另一種數據類型。其他3個都是聚集函數,COUNT( )的功能是統計一列中值的個數;COUNT(*)統計元組個數;AVG( ?。┯嬎阋涣兄档钠骄担ù肆斜仨毷菙抵敌停?。此外,SQL語言中還提供了另一個數據類型轉換函數CAST,這兩個函數均能將表達式值轉換為指定的數據類型,CONVERT可以指定長度,而CAST不能指定長度。
8下列說法正確的是( )。
A.可以利用存儲過程在當前數據庫中創建固定數據庫角色
B.當前數據庫中的用戶自定義角色可以用存儲過程刪除
C.不能將數據庫用戶賬戶添加為當前數據庫中角色的成員
D.Public角色可以被刪除
【答案】B
【解析】在T-SQL中,通過sp-helpdbfixedrole存儲過程,查看SQL Server固定數據庫角色列表;利用sp-addrolemember存儲過程將數據庫用戶的賬戶,添加為當前數據庫中數據庫角色的成員;利用sp-droprolemember存儲過程從當前數據庫的數據庫角色中,刪除數據庫安全賬戶。但不能利用存儲過程在當前數據庫中創建固定數據庫角色,排除A項。此外,SQL Server包括兩類具有隱含權限的預定義角色,固定服務器角色和固定數據庫角色。這些隱含權限不能授予其他用戶賬戶。如果有用戶需要這些權限,則必須將其賬戶添加到這些預定義角色中,排除C項;Public角色是SQL Server數據庫管理系統中每個數據庫都存在的特殊角色。它提供數據庫中用戶默認權限,每個數據庫用戶都自動是此角色的成員。所以Public角色不能被刪除,排除D項;在T-SQL中,通過sp-helprole存儲過程,查看角色;利用sp-addrole存儲過程在當前數據庫創建新的數據庫角色;利用sp-droprole存儲過程從當前數據庫刪除角色。B項是正確的。
9以下有關SELECT子句的敘述中不正確的是( ?。?/p>
A.SELECT子句中只能包含表中的列及其構成的表達式
B.SELECT子句規定了結果集中的列序列
C.SELECT子句中可以使用別名
D.如果FROM子句引用的兩個表中有同名的列,則在SELECT子句中引用它們時必須使用表名前綴加以限定
【答案】A
【解析】SQL語言提供了SELECT語句進行數據庫查詢,該語句具有靈活的使用方式和豐富的功能。語句的功能是根據WHERE子句的條件表達式,從FROM子句指定的基本表或視圖中找出滿足條件的元組。再按SELECT子句中目標列表達式,選出元組中屬性值形成結果表。在同一個表自身聯合查詢時可以采用別名的方式以示區別,并在引用時通過表名前綴加以限定。故四個選項中A項是不正確的。
10以下定義的4個視圖中,能夠進行更新操作的是( )。
A.
B.
C.
D.
【答案】C
【解析】根據視圖更新操作的限制,A項的視圖數據來源于多個基本表,所以不能進行更新操作。B項的視圖數據來源于一個基本表的聚合結果,所以不能進行更新操作。D項中視圖不含有基本表的主碼,所以不能進行更新操作。
二、填空題
1SQL語言的數據定義功能包括______、______、______和______。
【答案】定義數據庫;定義基本表;定義視圖;定義索引
2在SELECT命令中,______子句用于選擇滿足給定條件的元組,使用______子句可按指定列的值分組,同時使用______子句可提取滿足條件的組。
【答案】WHERE;GROUP BY;HAVING
3視圖是一個虛表,它是從______導出的表。在數據庫中,只存放視圖的______,不存放視圖對應的______。
【答案】一個或幾個基本表;定義;數據
4設有如下關系表R:R(NO,NAME,SEX,AGE,班號)主碼是NO。其中NO為學號,NAME為姓名,SEX為性別,AGE為年齡,班號為班號。
寫出實現下列功能的SQL語句。
①插入一個記錄(25,‘李明’,‘男’,21,‘09031’):______。
②插入‘09031’班學號為30、姓名為‘鄭和’的學生記錄:______。
③將學號為10的學生姓名改為‘王華’______。
④將所有‘95101’班號改為‘10091’:______。
⑤刪除學號為20的學生記錄:______。
⑥刪除姓‘王’的學生記錄:______。
【答案】
①INSERT INTO R VALUES(25,‘李明’,‘男’,21,‘09031’)
②INSERT INTO R(NO,NAME,班號)VALUES(30,‘鄭和’,‘09031’)
③UPDATE R SET NAME=‘王華’WHERE NO=10
④UPDATE R SET 班號=‘10091’WHERE 班號=‘95101’
⑤DELETE FROM R WHERE NO=20
⑥DELETE FROM R WHERE NAME LIKE‘王%’
5在SELECT命令中進行查詢,若希望查詢的結果不出現重復元組,應在SEL ECT語句中使用______保留字。
【答案】DISTINCT
三、判斷題
1在SQL中,ALTER TABLE語句中MODIFY用于修改字段的類型和長度等,ADD用于添加新的字段。( )
【答案】×
【解析】ALTER TABLE語句中,ALTER COLUMN用于修改字段的類型和長度等,ADD用于添加新的字段。
2可以用UNION將兩個查詢結果合并為一個查詢結果。( ?。?/p>
【答案】√
3視圖是觀察數據的一種方法,只能基于基本表建立。( )
【答案】×
【解析】也可以建立視圖的視圖。
4在SELECT語句中,需要對分組情況滿足的條件進行判斷時,應使用WHERE子句。( )
【答案】×
【解析】應使用HAVING子句。
5在CREATE INDEX語句中,使CLUSTERED來建立簇索引。( ?。?/p>
【答案】√
四、問答題
1設有一個SPJ數據庫,包括S、P、J、SPJ 4個關系模式:
S(Sno,Sname,Status,City)
P(Pno,Pname,Color,Weight)
J(Jno,Jname,City)
SPJ(Sno,Pno,Jno,Qty)
供應商表S由供應商代碼(Sno)、供應商姓名(Sname)、供應商狀態(Status)、供應商所在城市(City)組成。零件表P由零件代碼(Pno)、零件名(Pname)、顏色(Color)、重量(Weight)組成。工程項目表J由工程項目代碼(Jno)、工程項目名(Jname)、工程項目所在城市(City)組成。供應情況表SPJ由供應商代碼(Sno)、零件代碼(Pno)、工程項目代碼(Jno)、供應數量(Qty)組成,表示某供應商供應某種零件給某工程項目的數量為Qty。請為“三建”工程項目建立一個供應情況的視圖,包括供應商代碼(Sno)、零件代碼(Pno)、供應數量(Qty)。針對該視圖完成下列查詢:
(1)找出“三建”工程項目使用的各種零件代碼及其數量。
(2)找出供應商S1的供應情況。
(3)把對表S的INSERT權限授予用戶張勇,并允許他再將此權限授予其他用戶。
(4)把查詢SPJ表和修改Qty屬性的權限授給用戶李天明。
答:建立視圖:
CREATE VIEW V_SPJ AS SELECT Sno,Pno,Qty FROM SPJ
WHERE Jno=(SELECT Jno FROM J WHERE Jname=‘三建’);
(1)SELECT Pno,Qty FROM V_SPJ;
(2)SELECT Pno,Qty FROM V_SPJ WHERE Sno=‘S1’;
(3)GRANT INSERT ON TABLE S TO張勇WITH GRANT OPTION;
(4)GRANT SELECT,UPDATE(Qty)ON TABLE SPJ TO 李天明;
2設有關系R和S,如圖3-1所示。試用SQL語句實現:
(1)查詢屬性C>50時,R中與之相關聯的屬性B的值。
(2)當屬性C=40時,將R中與之相關聯的屬性B值修改為b4。

圖3-1 關系R和S
答:(1)對應的SQL語句如下:

(2)對應的SOL語句如下:

3設有4個關系模式如下:
S(供應商號,姓名,STATE,CITY)
P(PNO,PNAME,COLOR,WEI,PRICE)
J(JNO,JNAME,CITY)
SPJ(學號,PNO,JNO,QTY)
其中,S表示供應商,它的各屬性依次為供應商號、供應商名、供應商所在省份和供應商所在城市;P表示零件,它的各屬性依次為零件號、零件名、零件顏色、零件重量和單價;J表示工程,它的各屬性依次為工程號、工程名和工程所在城市;SPJ表示供貨關系,它的各屬性依次為供應商號、零件號、工程號和供貨數量。用SQL語句實現下面的查詢要求:
(1)查詢列出供應了全部零件的供應商名和其所在城市。
(2)查詢列出供應紅色零件的供應商名。
答:(1)對應的SQL語句如下:

(2)對應的SQL語句如下:

4設計一個程序采用游標方式輸出求每個學生的班號、學號、姓名、課程名和分數,并以班號和學號排序,給出程序的執行結果。
答:對應的程序如下:

本程序的執行結果如下:

5設有如圖3-2所示的3個基本表。表中各個屬性的含義如下:A#(商店代號)、ANAME(商店名)、WQTY(店員人數)、CITY(所在城市)、B#(商品號)、BNAME(商品名稱)、PRICE(商品價格)、QTY(商品數量)。試用SQL語句寫出下列查詢:
(1)找出店員人數不超過100人或者在長沙市的所有商店的商店代號和商店名。
(2)找出供應書包的商店名。
(3)找出至少供應代號為256的商店所供應的全部商品的商店名和所在城市。

圖3-2 3個關系表
答:(1)對應的SQL語句如下:

(2)對應的SQL語句如下:
方法1:

方法2:

(3)對應的SQL語句如下:
