第三部分 關系數據庫語言SQL
(一)、考核內容
(1)SQL功能特點、SQL基本操作
(2)SQL數據查詢
(3)SQL視圖操作、子查詢
(二)、考核要求
(1)了解SQL語言的概貌、發展、標准化、主要特點。
(2)掌握SQL表基本操作方法:定義、修改與撤消基本表。
(3)掌握SQL數據更新方法:INSERT、DELETE、UPDATE語句的格式和用法。
(4)掌握SQL數據查詢方法:SELECT語句的格式及各種用法。
(5)了解SQL的庫函數。
(6) 了解視圖的概念、作用;掌握視圖的定義與撤消。
(一)選擇
1.SQL語言是( )的語言,易學習。
A.過程化 B.非過程化 C.格式化 D.導航式
2.SQL語言是( )語言。
A.層次數據庫 B.網絡數據庫 C.關系數據庫 D.非數據庫
3.SQL語言具有( )的功能。
A.關系規范化、數據操縱、數據控制 B.數據定義、數據操縱、數據控制
C.數據定義、關系規范化、數據控制 D.數據定義、關系規范化、數據操縱
4.SQL語言具有兩種使用方式,分別稱為交互式SQL和( )。
A.提示式SQL B.多用戶SQL C.嵌入式SQL D.解釋式SQL
5.假定學生關系是S(S#,SNAME,SEX,AGE),課程關系是C(C#,CNAME,TEACHER),學生選課關系是SC(S#,C#,GRADE)。要查找選修“COMPUTER”課程的“女”學生姓名,將涉及到關系( )。
A.S B.SC,C C.S,SC D.S,C,SC
6.若用如下的SQL語句創建一個student表:
CREATE TABLE student(NO Char(4) NOT NULL,
NAME Char(8) NOT NULL,
SEX Char(2),
AGE tinyint)
可以插入到student表中的是 。
A.(‘1031’,‘曾華’,男,23) B.(‘1031’,‘曾華’,NULL,NULL)
C.(NULL,‘曾華’,‘男’,‘23’) D.(‘1031’,NULL,‘男’,23)
7. SL語言的數據操縱語句包括SELECT,INSQERT,UPDATE和DELETE等。其中最重要的,也是使用最頻繁的語句是()。
A.SELECT B.INSERT C.UPDATE D.DELETE
第8到第10題基於這樣的三個表即學生表S、課程表C和學生選課表SC,它們的結構如下:
S(S#,SN,SEX,AGE,DEPT)
C(C#,CN)
SC(S#,C#,GRADE)
其中:S#為學號,SN為姓名,SEX為性別,AGE為年齡,DEPT為系別,C#為課程號,CN為課程名,GRADE為成績。
8.檢索所有比“王華”年齡大的學生姓名、年齡和性別。正確的SELECT語句是( )
A.SELECT SN,AGE,SEX FROM S
WHERE AGE>(SELECT AGE FROM S
WHERE SN=“王華”)
B.SELECT SN,AGE,SEX
FROM S
WHERE SN=“王華”
C.SELECT SN,AGE,SEX FROM S
WHERE AGE>(SELECT AGE
WHERE SN=“王華”)
D.SELECT SN,AGE,SEX FROM S
WHERE AGE>王華.AGE
9、檢索選修課程“C2”的學生中成績最高的學生的學號。正確的SELECT語句是 。
A.SELECT S# FORM SC
WHERE C#=“C2” AND GRAD>=(SELECT GRADE FORM SC
WHERE C#=“C2”)
B.SELECT S# FORM SC
WHERE C#=“C2” AND GRADE IN
(SELECT GRADE FORM SC
WHERE C#=“C2”)
C.SELECT S# FORM SC
WHERE C#=“C2” AND GRADE NOT IN
(SELECT GRADE FORM SC
WHERE C#=“C2”)
D.SELECT S# FORM SC
WHERE C#=“C2” AND GRADE>=ALL
(SELECT GRADE FORM SC
WHERE C#=“C2”)
10、檢索學生姓名及其所選修課程的課程號和成績。正確的SELECT語句是 。
A.SELECT S.SN,SC.C#,SC.GRADE
FROM S
WHERE S.S#=SC.S#
B.SELECT S.SN,SC.C#,SC.GRADE
FROM SC
WHERE S.S#=SC.GRADE
C.SELECT S.SN,SC.C#,SC.GRADE
FROM S,SC
WHERE S.S#=SC.S#
D.SELECT S.SN,SC.C#,SC.GRADE
FROM S.SC
11.視圖是一個“虛表”,視圖的構造基於( )
A.基本表 B.視圖
C.基本表或視圖 D.數據字典
12.關系代數中的π運算符對應SELECT語句中的以下哪個子句?( )
A.SELECT B.FROM
C.WHERE D.GROUP BY
13.關系代數中的σ運算符對應SELECT語句中的以下哪個子句?( )
A.SELECT B.FROM
C.WHERE D.GROUP BY
14.關系代數中的×(笛卡爾積)運算符對應SELECT語句中的以下哪個子句?( )
A.SELECT B.FROM
C.WHERE D.GROUP BY
15.在SQL的排序子句:ORDER BY 總分 DESC, 英語 DESC 表示( )
A. 總分和英語分數都是最高的在前面
B. 總分和英語分數之和最高的在前面
C. 總分高的在前面,總分相同時英語分數高的在前面
D. 總分和英語分數之和最高的在前面,相同時英語分數高的在前面
16.使用查詢語句:
SELECT STUDENT.學號, STUDENT.姓名, SUM(分數) FROM STUDENT, GRADE
WHERE STUDENT.學號=GRADE.學號
GROUP BY STUDENT.學號, STUDENT.姓名
查詢結果是()
A.按學號分類的每個學生所有課程成績的總分
B.按學號分類的每個學生各課程成績
C.全體學生的各課程分類的成績總分
D.所有學生的所有課程成績總分
17.在T-SQL語言中,用於刪除一個視圖的命令的關鍵字是()
A. DELETE B. DROP C. CLEAR D. REMOVE
18. T-SQL語言的GRANT和REMOVE語句主要是用來維護數據庫的()
A.完整性 B.可靠性 C.安全性 D.一致性
19.SQL語言中,實現數據檢索的語句是( )。
A.SELECT B.INSERT
C.UPDATE D.DELETE
20.下列SQL語句中,修改表結構的是( )。
A.ALTER B.CREATE
C.UPDATE D.INSERT
21. 用於實現數據存取安全性的SQL語句是( )
A.CREATE TABLE B.COMMIT
C.GRANT和REVOKE D.ROLLBACK
(二)概念、術語:
術語
聚合函數
分組查詢
視圖
簡述
(1)簡述數據定義語句、數據查詢語句、數據操縱語句和數據控制語句的功能用途是什么?
(2)簡述 SQL 的定義功能。
(3)簡述視圖的優點。
(三)應用題
1.以下面的數據庫關系模式為例,寫出完成以下查詢功能的SQL語句。(每小題2分)
關系模式如下:
l 學生(學號,學生姓名,出生年月,出生地,專業號,班級)
簡寫為:s(s#,sname,ssex,sbirthin,placeofb,scode#,class)
l 課程(課程號,課程名,學時)
簡寫為:c(c#,cname,classh)
l 學習關系(學號,課程號,分數)
簡寫為:sc(s#,c#,grade)
l 專業(專業代碼,專業名稱)
簡寫為:ss(scode#,ssname)
l 教師(教職工號,教師姓名,教師性別,教師出生年月,職稱,教研室,電話號碼)
簡寫為:t(t#,tname,tsex,tbirthin,titleof,tresction,tel)
l 講授關系(教職工號,課程號)
簡寫為:teach(t#,c#)
(1)查詢201002班男生的信息。
(2)查詢最低分大於70、最高分小於90的學生的姓名。
(3)查詢所有女生記錄信息,並以班級降序排列。
(4)查詢選取修數據結構課程的學生姓名及所在專業代碼。
(5)查詢至少有5名學生選修的並以3開頭的課程號的平均分。
2. 以下面的數據庫關系模式為例,寫出完成以下查詢功能的SQL語句。(每小題2分)
關系模式如下:
l 學生(學號,學生姓名,出生年月,出生地,專業號,班級)
簡寫為:s(s#,sname,ssex,sbirthin,placeofb,scode#,class)
l 課程(課程號,課程名,學時)
簡寫為:c(c#,cname,classh)
l 學習關系(學號,課程號,分數)
簡寫為:sc(s#,c#,grade)
l 專業(專業代碼,專業名稱)
簡寫為:ss(scode#,ssname)
l 教師(教職工號,教師姓名,教師性別,教師出生年月,職稱,教研室,電話號碼)
簡寫為:t(t#,tname,tsex,tbirthin,titleof,tresction,tel)
l 講授關系(教職工號,課程號)
簡寫為:teach(t#,c#)
(1)查詢來自南京或上海的學生學號和姓名。
(2)查詢選修課程號為C401001的學號和成績,並要求對查詢結果按成績降序排列,如果成績相同則按學號升序排列。
(3)查詢計算機科學或網絡工程專業姓張的學生的信息。
(4)查詢缺少了成績的學生的學號和課程號。
(5)查詢每個專業的男、女生分別有多少人數。
3. 設有如下所示的三個關系A、B、AB。
其中各個屬性的含義如下:A#(商店代號)、ANAME(商店名)、WQTY(店員人數)、CITY(所在城市)、B#(商品號)、BNAME(商品名稱)、PRICE(價格)、QTY(商品數量)。
試用SQL語言寫出下列查詢,並給出執行結果:


(1).找出店員人數不超過100人或者在長沙市的所有商店的代號和商店名。
(2).找出供應書包的商店名。
(3).找出至少供應代號為256的商店所供應的全部商品的商店名和所在城市。
4. 己知三個關系R(A,B,C)、S(A,D,E)和T(D,F),其中,名稱相同的屬性為關聯屬性,C、E為數值型屬性。
試用SQL語句實現如下操作:
(1).將R、S和T三個關系按關聯屬性建立一個視圖R-S-T;
(2).對視圖R-S-T按屬性A分組后,求屬性C和E的平均值。
5. 設有關系R(A,B)和S(A,C),A為相同屬性。
試用SQL語句實現:
(1).查詢屬性C>50時,R中相關聯的屬性B之值。
(2).當屬性C=40時,將R中與之相關連的屬性B值修改為b4。
6. 已知學生表S和學生選課表SC。其關系模式如下:
S(SNo,SN,SD,PROV)
SC(SNO,CN,GR)
其中,SNO為學號,SN為姓名,SD為系名,PROV為省區,CN為課程名,GR為分數。
試用SQL語言實現下列操作:
(1).查詢“信息系”的學生來自哪些省區。
(2).按分數降序排序,輸出“英語系”學生選修了“計算機”課程的學生的姓名和分數。
7. 設有關系模式:
SB(SN,SNAME,CITY)
其中,S表示供應商,SN為供應商代號,SNAME為供應商名字,CITY為供應商所在城市,主關鍵字為SN。
PB(PN,PNAME,COLOR,WEIGHT)
其中P表示零件,PN為零件代號,PNAME為零件名字,COLOR為零件顏色,WEIGHT為零件重量,主關鍵字為PN。
JB(JN,JNAME, CITY)
其中,J表示工程,JN為工程編號,JNAME為工程名字,CITY為工程所在城市,主關鍵字為JN。
SPJB(SN,PN,JN,QTY)
其中,SPJ表示供應關系,SN是為指定工程提供零件的供應商代號,PN為所提供的零件代號,JN為工程編號,QTY表示提供的零件數量,主關鍵字為(SN,PN,JN),外部關鍵字為SN,PN,JN。
寫出實現以下各題功能的SQL語句:
(1).取出所有工程的全部細節;
(2).取出所在城市為上海的所有工程的全部細節;
(3).取出重量最輕的零件代號;
(4).取出為工程J1提供零件的供應商代號;
(5).取出為工程J1提供零件P1的供應商代號;
(6).取出由供應商S1提供零件的工程名稱;
(7).取出供應商S1提供的零件的顏色;
(8).取出為工程J1或J2提供零件的供應商代號;
(9).取出為工程J1提供紅色零件的供應商代號;
(10).取出為所在城市為上海的工程提供零件的供應商代號;
(11).取出為所在城市為上海或北京的工程提供紅色零件的供應商代號;
(12).取出供應商與工程所在城市相同的供應商提供的零件代號;
(13).取出上海的供應商提供給上海的任一工程的零件的代號;
(14).取出至少由一個和工程不在同一城市的供應商提供零件的工程代號;
(15).取出上海供應商不提供任何零件的工程的代號;
(16).取出這樣一些供應商代號,它們能夠提供至少一種由紅色零件的供應商提供的零件;
(17).取出由供應商S1提供零件的工程的代號;
8. 以下面的數據庫為例,用SQL完成以下檢索。關系模式如下:
倉庫(倉庫號,城市,面積)←→ WAREHOUSE(WMNO,CITY,SIZE)
職工(倉庫號,職工號,工資)←→ EMPLOYEE(WHNO,ENO,SALARY)
訂購單(職工號,供應商號,訂購單號,訂購日期)←→ ORDER(SNO,SNO,ONO,DATE)
供應商(供應商號,供應商名,地址)←→ SUPPLIER(SNO,SNAME,ADDR)
(1).檢索在北京的供應商的名稱。
(2).檢索發給供應商S6的訂購單號。
(3).檢索出職工E6發給供應商S6的訂購單號。
(4).檢索出向供應商S3發過訂購單的職工的職工號和倉庫號。
(5).檢索出目前與S3供應商沒有聯系的職工信息。
(6).檢索出目前沒有任何訂購單的供應商信息。
(7).檢索出和職工E1、E3都有聯系的北京的供應商信息。
(8).檢索出目前和華通電子公司有業務聯系的每個職工的工資。
(9).檢索出與工資在1220元以下的職工沒有聯系的供應商的名稱。
(10).檢索出向S4供應商發出訂購單的倉庫所在的城市。
(11).檢索出在上海工作並且向S6供應商發出了訂購單的職工號。
(12).檢索出在廣州工作並且只向S6供應商發出了訂購單的職工號。
(13).檢索出由工資多於1230元的職工向北京的供應商發出的訂購單號。
(14).檢索出倉庫的個數。
(15).檢索出有最大面積的倉庫信息。
(16).檢索出所有倉庫的平均面積。
(17).檢索出向S4供應商發出訂購單的那些倉庫的平均面積。
(18).檢索出每個城市的供應商個數。
(19).檢索出每個倉庫中工資多於1220元的職工個數。
(20).檢索出和面積最小的倉庫有聯系的供應商的個數。
(21).檢索出工資低於本倉庫平均工資的職工信息。
9. 以下面的數據庫為例,用SQL完成以下更新操作。關系模式如下:
倉庫(倉庫號,城市,面積)←→ WAREHOUSE(WMNO,CITY,SIZE)
職工(倉庫號,職工號,工資)←→ EMPLOYEE(WHNO,ENO,SALARY)
訂購單(職工號,供應商號,訂購單號,訂購日期)←→ ORDER(SNO,SNO,ONO,DATE)
供應商(供應商號,供應商名,地址)←→ SUPPLIER(SNO,SNAME,ADDR)
(1).插入一個新的供應商元組(S9,智通公司,沈陽)。
(2).刪除目前沒有任何訂購單的供應商。
(3).刪除由在上海倉庫工作的職工發出的所有訂購單。
(4).北京的所有倉庫增加100m2的面積。
(5).給低於所有職工平均工資的職工提高5%的工資。
10.現有關系數據庫如下:
學生(學號,姓名,性別,專業)
課程(課程號,課程名,學分)
學習(學號,課程號,分數)
分別用關系代數表達式和SQL語句實現下列1—5小題(注意:每小題都要分別寫出關系代數表達式和SQL語句):
(1)檢索所有選修了課程號為“C112”的課程的學生的學號和分數;
(2)檢索“英語”專業學生所學課程的信息,包括學號、姓名、課程名和分數;
(3)檢索“數據庫原理”課程成績高於90分的所有學生的學號、姓名、專業和分數;
(4)檢索沒學課程號為“C135”課程的學生信息,包括學號,姓名和專業;
(5)檢索至少學過課程號為“C135”和“C219”的課程的學生的信息,包括學號、姓名和專業。
11.關系模式如下:
學生S(SNO, SN, SEX, AGE)
課程C(CNO, CN, PCNO) PCNO為直接先行課
選課SC(SNO,CNO,G) G為課程考試成績
(1)用關系代數及SQL語言寫出查詢語句,查詢所有學生都選修的課程名CN。
(2)用關系代數及SQL語言寫出查詢語句,查詢“DB”課成績在90分以上的學生的姓名。
(3)將選修課程“DB”的學生學號,姓名建立視圖SDB。
(4)在學生選課關系SC中,把英語課的成績提高10%。
12. 在教學管理數據庫中有學生、課程和選課三個表,它們的定義分別為為:
Student(Sno Char(5),Sname Char(6),Ssex Char(2),
Sage Int,Sdept Char(2))
Course(Cno Char(1), Cname Char (10), Cpno Char(1),
Ccredit Int)
SC(Sno Char(5), Cno Char(1), Grade int)
根據下面的要求,寫出SQL語句。
① 用SQL語句建立數據表SC,以(Sno, Cno)作為主鍵;
② 向Student表插入一條記錄(95011, 張三, 女, 19,CS);
③ 檢索計算機系(CS)所有女同學的姓名和年齡;
④ 檢索選修了2號課程學生的學號、姓名、成績,並按成績降序排序;
⑤ 建立一個信息系(IS)所有不及格(Grade<60)學生的視圖。
第三部分 關系數據庫語言SQL
(一)選擇
1. B 2. C 3. B 4. C 5. D
6. B 7. A. 8. A 9. D 10. C
11. C 12 . A 13. C 14. B 15. C
16. A 17. B 18. C 19. A 20. A
21. C
(二)概念、術語
術語
聚合函數:能夠根據查詢結果的記錄集或根據查詢結果的記錄集中某列值的特點返回一個匯總信息的函數。
分組查詢:在SQL語言中,把元組按某個或某些列上相同的值分組,然后再對各組進行相應操作的查詢方式稱為分組查詢。
視圖:也稱用戶視圖或外模式,反映了數據庫的局部邏輯結構,是數據庫應用系統中各不同用戶看到和使用的數據庫。
簡述
(1)簡述數據定義語句、數據查詢語句、數據操縱語句和數據控制語句的功能用途是什么?
答:數據定義語句用於定義數據庫的邏輯結構,包括定義基本表、定義視圖和定義索引。
數據查詢語句按不同查詢條件實現對數據庫中數據的檢索查詢。
數據操縱語句用於更改和操作表中的數據,包括數據插入、數據修改和數據刪除。
數據控制語句法實現用戶授權、基本表和視圖授權、事務控制、完整性和安全性控制等。
(2)簡述 SQL 的定義功能。
答:SQL 的數據定義功能包括定義表、定義視圖和定義索引。 SQL 語言使用 cREATE TABLE 語句建立基本表, ALTER TABLE 語句修改基本表定義, DROP TABLE 語句刪除基本表;使用 CREATE INDEX 語句建立索引, DROP INDEX 語句刪除索引;使用 CREATE VIEW 語句建立視圖, DROP VIEW 語句刪除視圖。
(3)簡述視圖的優點。
答:
( l )視圖能夠簡化用戶的操作; ( 2 )視圖使用戶能以多種角度看待同一數據; ( 3 )視圖對重構數據庫提供了一定程度的邏輯獨立性; ( 4 )視圖能夠對機密數據提供安全保護。
(三)應用題
1.
參考答案:
(1)查詢201002班男生的信息。
select * from s where class=‘201002’ and ssex=‘男’
(2)查詢最低分大於70、最高分小於90的學生的姓名。
select s# from sc group s#
having min(grade)>70 and max(grade)<90
(3)查詢所有女生記錄信息,並以班級降序排列。
select * from s where ssex=‘女’ order by class desc
(4)查詢選取修數據結構課程的學生姓名及所在專業代碼。
select sname,scode# from s,sc,c where s.s#=sc.s# and sc.c#=c.c# and cname=‘數據結構’;
(5)查詢至少有5名學生選修的並以3開頭的課程號的平均分。
select c#,avg(grade) from sc where c# like ‘3%’ group by c# having count(*)>=5
2.
參考答案:
(1)查詢來自南京或上海的學生學號和姓名。
select s#,sname from s where placeofb='上海' or placeofb='南京'
(2)查詢選修課程號為C401001的學號和成績,並要求對查詢結果按成績降序排列,如果成績相同則按學號升序排列。
select s#,grade from sc where c#='C401001' order by grade desc,s# asc
(3)查詢計算機科學或網絡工程專業姓張的學生的信息。
select * from s where scode# in (select scode# from ss where ssname=’計算機科學’or ssname=’網絡工程’) and sname like '張%'
(4)查詢缺少了成績的學生的學號和課程號。
select s#,c# from sc where grade is null
(5)查詢每個專業的男、女生分別有多少人數。
select scode#,ssex,count(*) from s group by scode#,ssex
3. 參考答案:
(1).找出店員人數不超過100人或者在長沙市的所有商店的代號和商店名。
SELECT A#,ANAME
FROM A;
WHERE WQTY<=100 OR CITY=“長沙”
(2).找出供應書包的商店名。
SELECT A.ANAME
FROM A,B,AB;
WHERE A.A#=AB.A# AND B.B#=AB.B# AND B.BNAME=“書包”
(3).找出至少供應代號為256的商店所供應的全部商品的商店名和所在城市。
SELECT A.ANAME,A.CITY
FROM A,B;
WHERE A.A#=AB.A# AND AB.B# IN
(SELECT AB.B#;
FROM AB
WHERE A#=“256”)
4. 參考答案:
(1).CREATE VIEW R-S-T
AS SELECT R.A,B,C,S.D,E,F
FROM R,S,T
WHERE R.A=S.A AND S.D=T.D
(2).SELECT AVG(C),AVG(E)
FROM R-S-T
GROUP BY A
5. 參考答案:
(1).SELECT B
FROM R,S
WHERE R.A=S.A AND C>50
(2).UPDATE R
SET B=‘b4’
WHERE A IN
(SELECT A
FROM S
WHERE C=40)
6. 參考答案:
(1).SELECT DISTINCT PROV
FROM S
WHERE SD=“信息系”
(2).SELECT SN,GR
FROM S,SC
WHERE SD=“英語系”AND CN=“計算機”AND S.SNO=SC.SNO
ORDER BY GR DESC;
7. 參考答案:
(1).取出所有工程的全部細節;
SELECT *
FROM JB
(2).取出所在城市為上海的所有工程的全部細節;
SELECT *
FROM JB
WHERE CITY=“上海”
(3).取出重量最輕的零件代號;
SELECT PN
FROM PB
WHERE WEIGHT=
(SELECT MIN(WEIGHT) FROM PB)
(4).取出為工程J1提供零件的供應商代號;
SELECT SN
FROM SPJB
WHERE JN=“J1”
(5).取出為工程J1提供零件P1的供應商代號;
SELECT SN
FROM SPJB;
WHERE JN=‘Jl’AND PN=‘Pl’
(6).取出由供應商S1提供零件的工程名稱;
SELECT JB.JNAME
FROM JB,SPJB
WHERE JB.JN=SPJB.JN AND SPJB.SN=‘S1’
(7).取出供應商S1提供的零件的顏色;
SELECT DISTINCT PB.COLOR
FROM PB,SPJB
WHERE PB.PN=SPJB.PN AND SPJB.SN=‘S1’
(8).取出為工程J1或J2提供零件的供應商代號;
SELECT DISTINCT SN
FROM SPJB
WHERE JN=‘J1’OR JN=‘J2’
(9).取出為工程J1提供紅色零件的供應商代號;
SELECT DISTINCT SPJB.SN
FROM SPJB,PB
WHERE PB.PN=SPJB.PN AND SPJB.JN=‘J1’AND PB.COLOR=‘紅’
(10).取出為所在城市為上海的工程提供零件的供應商代號;
SELECT DISTINCT SPJB.SN
FROM SPJB, JB
WHERE SPJB.JN=JB.JN AND JB.CITY‘上海’
(11).取出為所在城市為上海或北京的工程提供紅色零件的供應商代號;
SELECT SPJB.SN
FROM PB,JB SPJB
WHERE SPJB.PN=PB.PN AND JB.JN=SPJB.JN AND PB.COLOR=’紅’ AND JB.CITY=’上海’
(12).取出供應商與工程所在城市相同的供應商提供的零件代號;
SELECT DISTINCT SPJB.PN
FROM SB,JB,SPJB
WHERE SB.SN=SPJB.SN AND JB.JN=SPJB.JN AND SB.CITY=JB.CITY
(13).取出上海的供應商提供給上海的任一工程的零件的代號;
SELECT SPJB.PN
FROM SB,JB,SPJB
WHERE SB.SN=SPJB.SN AND JB.JN=SPJB.JN AND SB.CITY=’上海’
(14).取出至少由一個和工程不在同一城市的供應商提供零件的工程代號;
SELECT DISTINCT SPJB.JN
FROM SB,JB,SPJB
WHERE SB.SN=SPJB.SN AND JB.JN=SPJB.JN AND SB.CITY<>JB.CITY
(15).取出上海供應商不提供任何零件的工程的代號;
SELECT DISTINCT JN
FROM SPJB
WHERE JN NOT IN
(SELECT DISTINCT SPJB.JN
FROM SB,SPJB
WHERE SB.SN=SPJB.SN AND SB.CITY=’上海’)
(16).取出這樣一些供應商代號,它們能夠提供至少一種由紅色零件的供應商提供的零件;
SELECT DISTINCT SPJB.SN
FROM PB,SPJB
WHERE SPJB.PN IN
(SELECT SPJB.PN
FROM SPJB,SB,PB
WHERE SB.SN=SPJB.SN AND PB.PN=SPJB.PN AND PB.COLOR=’紅’)
(17).取出由供應商S1提供零件的工程的代號;
SELECT DISTINCT SPJB.JN
FROM SB,PB,SPJB
WHERE SB.SN=SPJB.SN AND PB.PN=SPJB.PN AND SB.SN=’S1’
8. 參考答案:
(1).檢索在北京的供應商的名稱。
SELECT SNAME
FROM SUPPLIER
WHERE ADDR=“北京”;
(2).檢索發給供應商S6的訂購單號。
SELECT ONO
FROM ORDER
WHERE SNO=“S6”;
(3).檢索出職工E6發給供應商S6的訂購單號。
SELECT ONO
FROM ORDER
WHERE SNO=“S6” AND ENO=“E6”;
(4).檢索出向供應商S3發過訂購單的職工的職工號和倉庫號。
SELECT ENO,WHNO
FROM EMPLOYEE
WHERE ENO IN
(SELECT ENO
FROM ORDER
WHERE SNO=“S3”);
或:SELECT ENO,WHNO
FROM EMPLOYEE,ORDER
WHERE EMPLOYEE.ENO=ORDER.ENO AND ORDER.SNO=“S3”;
(5).檢索出目前與S3供應商沒有聯系的職工信息。
SELECT ENO,WHNO
FROM EMPLOYEE
WHERE ENO NOT IN
(SELECT ENO
FROM ORDER WHERE SNO=“S3”);
(6).檢索出目前沒有任何訂購單的供應商信息。
SELECT *
FROM SUPPLIER
WHERE SNO NOT IN
(SELECT SNO FROM ORDER);
(7).檢索出和職工E1、E3都有聯系的北京的供應商信息。
SELECT *
FROM SUPPLIER
WHERE ADDR=“北京” AND
(EXISTS (SELECT * FROM ORDER WHERE SNO=SUPPIER.SNO AND ENO=“E3”))
AND
(EXISTS (SELECT * FROM ORDER WHERE SNO=SUPPIER.SNO AND ENO=“E6”));
(8).檢索出目前和華通電子公司有業務聯系的每個職工的工資。
SELECT ENO,SALARY
FROM EMPLOYEE
WHERE ENO IN
(SELECT ENO FROM ORDER WHERE SNO IN
(SELECT SNO FROM SUPPLIER WHERE ADDR=“華通電子公司”));
或:SELECT ENO,SALARY
FROM EMPLOYEE,ORDER,SUPPLIER
WHERE EMPLOYEE.ENO=ORDER.ENO AND ORDER.SNO=SUPPLIER.SNO
AND SUPPLIER.ADDR=“華通電子公司”;
(9).檢索出與工資在1220元以下的職工沒有聯系的供應商的名稱。
SELECT SNAME
FROM SUPPLIER
WHERE SNO NOT IN
(SELECT SNO FROM ORDER WHERE ENO IN
(SELECT ENO FROM EMPLOYEE WHERE SALARY<1220));
(10).檢索出向S4供應商發出訂購單的倉庫所在的城市。
SELECT CITY
FROM WAREHOUSE
WHERE WHNO IN (SELECT WHNO FROM EMPLOYEE
WHERE ENO IN (SELECT ENO FROM ORDER WHERE SNO=“S4”));
或:SELECT CITY
FROM WAREHOUSE,EMPLOYEE,ORDER
WHERE WAREHOUSE.WHNO=EMPLOYEE.WHNO
AND EMPLOYEE.ENO=ORDER.ENO AND ORDER.SNO=“S4”;
(11).檢索出在上海工作並且向S6供應商發出了訂購單的職工號。
SELECT ENO
FROM EMPLOYEE
WHERE WHNO IN
(SELECT WHNO FROM WAREHOUSE WHERE CITY=“上海”)
AND (ENO IN SELECT ENO FROM ORDER WHERE SNO=“S6”);
或:SELECT ENO
FROM EMPLOYEE,WAREHOUSE,ORDER
WHERE EMPLOYEE.WHNO=WREHOUSE.WHNO
AND WREHOUSE.CITY=“上海”
AND EMPLOYEE.ENO=ORDER.ENO AND ORDER.SNO=“S6”;
(12).檢索出在廣州工作並且只向S6供應商發出了訂購單的職工號。
SELECT ENO
FROM EMPLOYEE
WHERE (WHNO IN SELECT WHNO FROM WAREHOUSE WHERE CITY=“廣州”)
AND (ENO IN SELECT ENO FROM ORDER WHERE SNO=“S6”)
AND (NOT EXISTS (SELECT * FROM ORDER
WHERE SNO<>“S6” AND ENO=EMPLOYEE.ENO));
(13).檢索出由工資多於1230元的職工向北京的供應商發出的訂購單號。
SELECT ONO
FROM ORDER
WHERE (ENO IN SELECT ENO FROM EMPLOYEE WHERE SALARY>1230)
AND (SNO IN SELECT SNO FROM SUPPLIER WHERE ADDR=“北京” );
或:SELECT ONO
FROM ORDER,EMPLOYEE,SUPPLIER
WHERE ORDER.ENO= EMPLOYEE.ENO AND EMPLOYEE.SALARY>1230
AND ORDER.SNO= SUPPLIER.SNO AND SUPPLIER. ADDR=“北京”;
(14).檢索出倉庫的個數。
SELECT COUNT(*) FROM WAREHOUSE;
(15).檢索出有最大面積的倉庫信息。
SELECT *
FROM WAREHOUSE OUTER
WHERE OUTER.SIZE=(SELECT MAX(SIZE) FROM WAREHOUSE INNER);
(16).檢索出所有倉庫的平均面積。
SELECT AVG(SIZE) FROM WAREHOUSE;
(17).檢索出向S4供應商發出訂購單的那些倉庫的平均面積。
SELECT AVG(SIZE)
FROM WAREHOUSE
WHERE WHNO IN (SELECT WHNO FROM EMPLOYEE
WHERE ENO IN (SELECT ENO FROM ORDER WHERE SNO=“S4”));
(18).檢索出每個城市的供應商個數。
SELECT CITY,COUNT(SNO)
FROM SUPPLIER
GROUP BY CITY;
(19).檢索出每個倉庫中工資多於1220元的職工個數。
SELECT WHNO,COUNT(ENO)
FROM EMPLOYEE
WHERE SALARY>1220
GROUP BY WHNO;
或:SELECT WHNO,COUNT(ENO)
FROM EMPLOYEE
GROUP BY WHNO
HAVING SALARY>1220;
(20).檢索出和面積最小的倉庫有聯系的供應商的個數。
SELECT COUNT(DISTINCT SNO)
FROM ORDER
WHERE ENO IN
SELECT ENO FROM EMPLOYEE
WHERE WHNO IN
SELECT WHNO FROM WAREHOUSE OUTER
WHERE OUTER.SIZE=SELECT MIN(SIZE)
FROM WAREHOUSE INNER;
(21).檢索出工資低於本倉庫平均工資的職工信息。
SELECT * FROM EMPLOYEE OUTER
WHERE OUTER.SALARY<(SELECT AVG(SALARY) FROM EMPLOYEE INNER
WHERE INNER.WHNO=OUTER.WHNO GROUP BY WHNO);
9. 參考答案:
(1).插入一個新的供應商元組(S9,智通公司,沈陽)。
INSERT INTO SUPPLIER VALUES(S9,智通公司,沈陽);
(2).刪除目前沒有任何訂購單的供應商。
DELETE FROM SUPPLIER
WHERE NOT EXISTS (SELECT * FROM ORDER WHERE ORDER.SNO=SUPPLIER.SNO);
或:DELETE FROM SUPPLIER
WHERE SNO NOT IN (SELECT SNO FROM ORDER);
(3).刪除由在上海倉庫工作的職工發出的所有訂購單。
DELETE FROM ORDER
WHERE ENO IN (SELECT ENO FROM EMPLOYEE
WHERE WHNO IN {SELECT WHNO FROM WAREHOUSE WHERE CITY=“上海”}};
(4).北京的所有倉庫增加100m2的面積。
UPDATE WAREHOUSE
SET SIZE=SIZE+100 WHERE CITY=“北京”;
(5).給低於所有職工平均工資的職工提高5%的工資。
UPDATE EMPLOYEE OUTER
SET OUTER.SALARY=OUTER.SALARY*1.05
WHERE OUTER.SALARY<SELECT AVG(SALARY) FROM EMPLOYEE INNER
10. 參考答案:
(1). 檢索所有選修了課程號為“C112”的課程的學生的學號和分數;
SQL語句:
SELECT 學號,分數 FROM 學習 WHERE 課程號=’C112’
(SELECT 學號,分數 FROM 學習1分,WHERE 課程號=’C112’1分)
關系代數:
π學號,分數(課程號=’C112’(學習))
(π學號,分數1分,課程號=’C112’(學習)1分。
(2). 檢索“英語”專業學生所學課程的信息,包括學號、姓名、課程名和分數;
SQL語句:
SELECT 學生.學號,姓名,課程名,分數
FROM 學生,學習,課程
WHERE 學習.學號=學生.學號 AND 學習.課程號=課程.課程號 AND 專業=’英語’
關系代數:
π學號,姓名,課程名,分數(π學號,姓名(專業=’英語’(學生))學習π課程號,課程名(課程))
(3). 檢索“數據庫原理”課程成績高於90分的所有學生的學號、姓名、專業和分數;
SQL語句:
SELECT 學生.學號,姓名,專業,分數
FROM 學生,學習,課程
WHERE 學生.學號=學習.學號 AND 學習.課程號=課程.課程號 AND分數>90 AND 課程名=‘數據庫原理’
關系代數:
π學號,姓名,專業,分數(π學號,姓名,專業(學生)(分數>90(學習))π課程號,課程名( 課程名=’數據庫原理’(課程)))
(4). 檢索沒學課程號為“C135”課程的學生信息,包括學號,姓名和專業;
SQL語句:
SELECT 學號,姓名,專業
FROM 學生
WHERE 學號 NOT IN
(SELECT 學號 FROM 學習 WHERE 課程號=‘C135’)
關系代數:
(π學號(學生)-π學號(課程號=‘C135’ (學習)))(π學號,姓名,專業(學生)
(5). 檢索至少學過課程號為“C135”和“C219”的課程的學生的信息,包括學號、姓名和專業。
SQL語句:
SELECT 學號,姓名,專業 FROM 學生 WHERE 學號 IN
(SELECT X1.學號 FROM 學習 X1,學習 X2 WHERE X1.學號=X2.學號 AND X1.課程號=‘C135’AND X2.課程號=‘C219’)
關系代數:
(π學號,課程號(學習)÷π課程號(課程號=‘C135’∨課程號=‘C219’ (課程)))π學號,姓名,專業(學生)
11. 參考答案:
(1)ЛCN (ЛCNO,SNO(SC)÷ЛSNO(S) ЛCNO,CN(C))
SELECT CN
FROM C
WHERE NOT EXISTS (SELECT * FROM S WHERE NOT EXISTS
(SELECT * FROM SC
WHERE SNO=S.SNO AND CNO=C.CNO));(3分)
(2)ЛSN(SσG>90(SC) σCN=’DB’(C) )
SELECT SN
FROM S, SC, C
WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO AND CN=’DB’AND G>90;
(3)CTEATE VIEW SDB
AS
SELECT SNO, SN
FROM S, SC, C
WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO AND C.CN=’DB’;
(4)UPDATE SC
SET G=1.1*G
WHERE CNO IN
(SELECT CNO
FROM C
WHERE CN=’英語’);
12. 參考答案:
① 用SQL語句建立數據表SC,以(Sno, Cno)作為主鍵
CREATE TABLE SC (
Sno CHAR(5),
Cno CHAR(1),
Grade INT,
PRIMARY KEY (Sno,Cno)
);
② 向Student表插入一條記錄(95011, 張三, 女, 19,CS)
INSERT INTO Student VALUES('95011', '張三', '女', 19, 'CS');
③ 檢索計算機系(CS)所有女同學的姓名和年齡;
SELECT Sname, Sage FROM Student
WHERE Sdept='CS' AND Ssex='女';
④ 檢索選修了2號課程學生的學號、姓名、成績,並按成績降序排序;
SELECT Student.Sno, Sname, Grade
FROM Student INNER JOIN SC ON Student.Sno=SC.Sno
WHERE SC.Cno='2'
ORDER BY Grade DESC
⑤ 建立一個信息系(IS)所有不及格(Grade<60)學生的視圖vwStudent。
CREATE VIEW vwStudent AS (
SELECT Student.*
FROM Student INNER JOIN SC ON Student.Sno=SC.Sno
WHERE Sdept='IS' AND Grade < 60
)
