最全的SQL练习题(做完你就是高手)
補充作業一
設有三個關系:
S(SNO, SNAME, AGE, SEX,Sdept)SC(SNO, CNO, GRADE)C(CNO, CNAME, TEACHER)試用關系代數表達式表示下列查詢:
-- 1、查詢學號為S3學生所學課程的課程名與任課教師名。 SELECT c.`name`, c.teacher FROM student_class sc LEFT JOIN `class` c ON sc.cno = c.NO WHERE sc.sno = 's3';-- 2、查詢至少選修LIU老師所教課程中一門課的女生姓名。 select s.sname from student as s where s.sno in (select DISTINCT sc.sno from student_class as sc left join class as c on sc.cno=c.cno where c.teacher='LIU') and s.sex=2;-- 3、查詢WANG同學不學的課程的課程號。 select c.cno from class as c where c.cno not in (select DISTINCT sc.cno from student as s inner join student_class as sc on s.sno=sc.sno where s.sname='WANG');-- 4、查詢至少選修兩門課程的學生學號。 select sno, count(*) as cou from student_class group by sno having cou>=2;-- 5、查詢選修課程中包含LIU老師所教全部課程的學生學號。 select sc.sno from student_class as sc INNER JOIN class as c on sc.cno=c.cno where c.teacher='LIU';補充作業二
三個關系同上,試用SQL語言表示下列查詢:
1、 查詢門門課程都及格的學生的學號
方法1:
提示:根據學號分組,就得到每個學生所有的課程成績,在某個學生這一組成績里,如果他所有的課程成績都大于60分則輸出該組學生的學號
Select sno frome sc group by sno having min(grade)>=60;2、查詢既有課程大于90分又有課程不及格的學生的學號
自身連接:
Select sno from sc where grade >90 and sno in (select sno from sc where grade<60)3、查詢平均分不及格的課程號和平均成績
Select cno , avg(GRADE) from sc group by cno having avg(grade)<60查詢平均分及格的課程號和課程名
Select C.cno , Cname from SC,C where C.cno=SC.cno group by C.cno having avg(grade)>=604、找出至少選修了2號學生選修過的全部課程的學生
提示:不存在這樣的課程y,學生2選修了y,而學生x沒有選。
SELECT DISTINCT SnoFROM SC as SCXWHERE NOT EXISTS(SELECT *FROM SC as SCYWHERE SCY.Sno =‘2’AND NOT EXISTS(SELECT *FROM SC SCZWHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno))5、求各門課程去掉一個最高分和最低分后的平均分
第一步,求所有成績的平均分(去掉一個最高分和最低分)
select avg(GRADE) from SC where GRADE not in (select top 1 GRADE from SC order by GRADE) and GRADE not in (select top 1 GRADE from SC order by GRADE desc)第二步,將所有成績按各門課程的課程號CNO分組
SELECT CNO avg(GRADE) from SC where GRADE not in (select top 1 GRADE from SC order by GRADE) and GRADE not in (select top 1 GRADE from SC order by GRADE desc) group by CNO1、查詢7號課程沒有考試成績的學生學號。
Select sno fromsc where cno='7' and grade is null2、查詢7號課程成績在90分以上或60分以下的學生學號。
Select sno from sc where cno='7' and grade not between 60and 93、查詢課程名以“數據”兩個字開頭的所有課程的課程號和課程名。
Select cno,cname from c where cname like '數據%'4、查詢每個學生所有課程的平均成績,輸出學生學號和平均成績。
Select sno,avg(grade)from sc group by sno5、查詢每門課程的選修人數,輸出課程號和選修人數。
Selectcno,count(*) from sc group by cno6、查詢選修7號課程的學生的學號、姓名、性別。
Selects.sno,sname,ssex from s,sc where s.sno=sc.sno and cno='7'或:
Select sno,sname,ssex from s where sno in( Select sno from sc where cno='7' )7、查詢選修7號課程的學生的平均年齡。
Selectavg(sage) from s,sc where s.sno=sc.sno and cno='7'或:
Select avg(sage) from s where sno in(Select sno from sc where cno='7' )8、查詢有30名以上學生選修的課程號。
Select cno fromsc group by cno having count(*)>309、查詢至今沒有考試不及格的學生學號。
Select distinctsno from sc where sno not in( Select sno from sc where grade<60 )或:
Select sno from sc group by sno havingmin(grade)>=60補充三
1、找出選修課程號為C2的學生學號與成績。
Select sno,grade from sc where cno='C2'2、找出選修課程號為C4的學生學號與姓名。
Selects.sno,sname from s,sc where s.sno=sc.sno and cno='C4'注意本題也可以用嵌套做
思考本題改為“找出選修課程號為C4的學生學號、姓名與成績”后還能用嵌套做嗎?
3、找出選修課程名為 Maths 的學生學號與姓名。
Selects.sno,sname from s,sc,cwhere s.sno=sc.sno and c.cno=sc.cno andcname='Maths'注意本題也可以用嵌套做
4、找出選修課程號為C2或C4的學生學號。
Select distinctsno from sc where cno in ('C2','C4')或:
Select distinct sno from sc where cno='C2' or cno='C4'5、找出選修課程號為C2和C4的學生學號。
Select sno fromsc where cno='C2' and sno in( Select sno from sc where cno='C4' )注意本題也可以用連接做
思考:
Select distinct sno from sc where cno=‘C2’ andcno='C4’正確嗎?
6、找出不學C2課程的學生姓名和年齡。
Selectsname,sage from s where sno not in( Selectsno from sc where cno='C2'或:
Select sname,sage from s where not exists(Select * from sc where sno=s.sno and cno='C2' )7、找出選修了數據庫課程的所有學生姓名。(同3)
Select snamefrom s,sc,cwhere s.sno=sc.snoand c.cno=sc.cno and cname='數據庫'8、找出數據庫課程不及格的女生姓名。
連接:Select sname from s,sc,cwhere s.sno=sc.sno andc.cno=sc.cno and cname='數據庫'and grade<60 and ssex='女'嵌套:Select sname from s where ssex='女' and sno in(Select sno from sc where grade<60 and cno in( Select cno from c where cname='數據庫' ))9、找出各門課程的平均成績,輸出課程名和平均成績。
Selectcname,avg(grade) from sc,cwherec.cno=sc.cno group by c.cno,cname思考本題也可以用嵌套做嗎?
10、找出各個學生的平均成績,輸出學生姓名和平均成績。
Selectsname,avg(grade) from s,scwheres.sno=sc.sno group by s.sno,sname思考本題也可以用嵌套做嗎?
11、找出至少有30個學生選修的課程名。
Select cnamefrom c where cno in( Selectcno from sc group by cno having count(*)>=30 )注意本題也可以用連接做
12、找出選修了不少于3門課程的學生姓名。
Select snamefrom s where sno in( Selectsno from sc group by sno having count(*)>=3 )注意本題也可以用連接做
13、找出各門課程的成績均不低于90分的學生姓名。
Select snamefrom s,sc where s.sno=sc.snogroup bys.sno,sname having min(grade)>=90方法二:
Select sname from s where sno not in( Selectsno from sc where grade<90 )只要有一門不小于90分就會輸出該學生學號
14、找出數據庫課程成績不低于該門課程平均分的學生姓名。
Select snamefrom s,sc,cwhere s.sno=sc.sno and sc.cno=c.cno and cname='數據庫' and grade>( Selectavg(grade) from sc,cwhere sc.cno=c.cnoand cname='數據庫')15、找出各個系科男女學生的平均年齡和人數。
Selectsdept,ssex,avg(sage),count(*) from s group by sdept,ssex16、找出計算機系(JSJ)課程平均分最高的學生學號和姓名。
Selects.sno,sname from s,sc where s.sno=sc.sno and sdept='JSJ'group bys.sno,snamehavingavg(grade) >=ALL( Selectavg(grade) from s,scwheres.sno=sc.sno and sdept='JSJ'group bys.sno)17、(補充)查詢每門課程的及格率。
本題可以分三步做:
第1步:得到每門課的選修人數
createview v_all(cno,cnt)as selectcno, count(*) from sc group by cno第2步:得到每門課及格人數
createview v_pass(cno,cnt_pass)as selectcno, count(*) from sc where grade>=60 group by cno第3步:每門課的及格人數/每門課選修人數
selectv_all.cno, cnt_pass*100/cnt from v_all, v_passwhere v_all.cno = v_pass.cno18、查詢平均分不及格的學生的學號,姓名,平均分。
Selectsc.sno,sname,avg(grade) from student,scwherestudent.sno=sc.snogroup bysc.sno,snamehavingavg(grade)<60思考本題也可以用嵌套做嗎?
19、查詢平均分不及格的學生人數。
Select count(*)from studentwhere sno in( selectsno from sc group by sno having avg(grade)<60 )下面是一個典型的錯誤
Select count(*) from sc group by sno havingavg(grade)<60這是每個學生有幾門不及格的數目
補充四
1、查詢工資在1000到3000元之間的男性業務員的姓名和辦公室編號。
SelectYname,Ono from YWYwhere Salarybetween 1000 and 3000 and Ysex='男'2、查詢各個辦公室的業務員人數,輸出辦公室編號和對應的人數。
SelectOno,count(*) from YWY group by Ono3、查詢每個客戶在2002年5月購買的總金額,輸出客戶號和相應的總金額。
SelectKno,sum(Fmoney) from FPwhere Fdatebetween '2002.5.1' and '2002.5.31'group by Kno4、查詢2002年5月購買次數超過5次的所有客戶號,且按客戶號升序排序。
Select Kno fromFPwhere Fdatebetween '2002.5.1' and '2002.5.31'group by Knohavingcount(*)>5order by KnoASC5、查詢各辦公室男性和女性業務員的平均工資。
SelectOno,Ysex,avg(Salary) from YWY group by Ono,Ysex6、查詢2002年5月曾經在王海亮業務員手中購買過商品的客戶號、 客戶姓名和聯系電話。
SelectKno,Kname,Phone from KH where Kno in( SelectKno from FPwhereFdate between '2002.5.1' and '2002.5.31' and Yno in( Select Yno from YWY where Yname='王海亮' ))注意本題也可以用連接做
7、查詢所有工資比1538號業務員高的業務員的編號、姓名和工資。
SelectYno,Yname,Salary from YWY where Salary >( SelectSalary from YWY where Yno='1538' )8、查詢所有與1538號業務員在同一個辦公室的其他業務員的編號和姓名。
SelectYno,Yname from YWY where Yno!='1538' and Ono in( SelectOno from YWY where Yno='1538' )9、查詢銷售總金額最高的業務員的編號。
Select Yno fromFP group by Yno having sum(Fmoney) >=ALL( Selectsum(Fmoney) from FP group by Yno )10、查詢所有業務員的編號、姓名、工資以及工資比他高的其他業務員的平均工資。
利用自連接
SelectY1.Yno,Y1.Yname,Y1.Salary,avg(Y2.Salary)from YWY Y1, YWY Y2where Y1.Salary < Y2.Salarygroup by Y1.Yno補充五
1、找出每個班級的班級代碼、學生人數、平均成績。
SelectBJDM,count(*),avg(CJ) from SC group by BJDM2、找出每個學生的班級代碼、學生姓名、考試科目數、總成績。
SelectBJDM,XSXM,count(*),sum(CJ) from SCgroup byBJDM,BNXH,XSXM3、輸出一張表格,每位學生對應一條記錄,包括字段:班級代碼、學生姓名、語文成績、數學成績、外語成績。
SelectSC1.BJDM,SC1.XSXM,SC1.CJ,SC2.CJ,SC3.CJfrom SC SC1, SC SC2, SC SC3whereSC1.BJDM=SC2.BJDM and SC1.BNXH=SC2.BNXH andSC2.BJDM=SC3.BJDM and SC2.BNXH=SC3.BNXH andSC1.KM='語文' and SC2.KM='數學' and SC3.KM='外語'4、輸出一張表格,有成績低于60分的每位學生對應一條記錄,包括字段:班級代碼、學生姓名、最低成績。
SelectBJDM,XSXM,min(CJ) from SCwhere CJ<60 group by BJDM,BNXH,XSXM或: SelectBJDM,XSXM,min(CJ) from SCgroup byBJDM,BNXH,XSXMhavingmin(CJ)<605、輸出一張表格,有成績低于60分的每位學生對應一條記錄,包括字段: 班級代碼、學生姓名、最高成績、平均成績。
SelectBJDM,XSXM,max(CJ) from SCgroup byBJDM,BNXH,XSXMhavingmin(CJ)<60請思考下列做法是否正確:
SelectBJDM,XSXM,max(CJ),avg(CJ) from SCwhere CJ<60 group byBJDM,BNXH,XSXM6、輸出一張表格,所有成績都不低于60分的每位學生對應一條記錄,包括字段:班級代碼、學生姓名、平均成績。
SelectBJDM,XSXM,avg(CJ) from SCgroup by BJDM,BNXH,XSXMhavingmin(CJ)>=607、輸出一張表格,每一位學生對應一條記錄,包括字段:班級代碼、學生姓名、去掉一個最低分后的平均成績。
SelectBJDM,XSXM,(sum(CJ)-min(CJ))/(count(*)-1) from SCgroup byBJDM,BNXH,XSXM8、輸出一張表格,每門科目對應一條記錄,包括字段: 科目、去掉一個最低分后的平均成績。
Select KM,(sum(CJ)-min(CJ))/(count(*)-1)from SCgroup by KM補充六
1、查詢年齡在19至21歲之間的女生的學號,姓名,年齡,按年齡從大到小排列。
Selectsno,sname,sage from studentwhere sagebetween 19 and 21 and ssex='女'order by sagedesc2、查詢姓名中有“明”字的學生人數。
Select count(*)from studentwhere snamelike "%明%"3、查詢1001課程沒有成績的學生的學號。
Select sno fromsc where cno='1001' and grade is null4、查詢JSJ、SX、WL系的學生學號,姓名,結果按系及學號排列。
Selectsno,sname,sdept from studentwhere sdept in( 'JSJ', 'SX', 'WL' )order bysdept,sno5、計算每一門課的總分、平均分,最高分、最低分。
Selectcno,sum(grade),avg(grade),max(grade),min(grade)from scgroup by cno6、查詢平均分大于90分的男學生學號及平均分。
連接:
selectsc.sno,avg(grade) from student,scwherestudent.sno=sc.sno and ssex=’男’group by sc.snohavingavg(grade)>90嵌套:
selectsno,avg(grade) from scwhere sno in (select sno from student where ssex='男')group by snohavingavg(grade)>907、查詢選修課程超過2門的學生姓名。
select snamefrom student,scwhere student.sno=sc.snogroup bysc.sno,snamehavingcount(*)>2本題也可以用嵌套做
8、查詢 JSJ 系的學生選修的課程號。
Select distinctcno from student,scwhere student.sno=sc.sno and sdept='JSJ'本題也可以用嵌套做
9、查詢選修1002課程的學生的學生姓名(用連接和嵌套2種方法)
連接:Select sname from student,scwherestudent.sno=sc.sno and cno='1002'嵌套:Select sname from student where sno in(select sno from sc where cno='1002' )10、查詢學生姓名以及他選修課程的課程號及成績。
Selectsname,cno,grade from student,scwherestudent.sno=sc.sno思考本題也可以用嵌套做嗎?
11、查詢選修“數據庫原理”課且成績 80 以上的學生姓名(用連接和嵌套2種方法)
連接:Select sname from student,sc,coursewherestudent.sno=sc.sno and sc.cno=course.cno andcname='數據庫原理' and grade>80嵌套:Select sname from student where sno in (select sno from sc where grade>80 and cno in ( select cno from course where cname='數據庫原理' ))14、查詢沒有選修1002課程的學生的學生姓名。
Select snamefrom studentwhere sno notin ( select sno from sc where cno='1002')或: select sname from studentwhere notexists(select * from sc where cno='1002' and sno=student.sno)思考本題也可以用一般的連接做嗎?
15、查詢平均分最高的學生學號及平均分。
Selectsno,avg(grade)from scgroup by snohavingavg(grade) >=ALL ( Select avg(grade)from scgroup by sno)16、查詢每門課程成績都高于該門課程平均分的學生學號。
可以先計算每門課程平均分
create viewc_avg(cno,avg_grade)as selectcno,avg(grade) from sc group by cno再查詢Select distinctsno from scwhere sno notin ( Select sno from sc,c_avgwhere sc.cno=c_avg.cno and grade<avg_grade)===========================================SELECT DISTINCT SnoFROM SC SC1WHERE SC1.SnoNOT IN( SELECT SC2.SnoFROM SC SC2WHERE SC2.Grade <=( SELECT AVG(SC3.Grade)FROM SC SC3WHERE SC3.Cno=SC2.Cno))或:
SELECT DISTINCTSnoFROM SC SC1WHERE NOTEXISTS(SELECT *FROM SC SC2WHERE SC2.Sno=SC1.Sno AND SC2.Grade <=(SELECT AVG(SC3.Grade)FROM SC SC3WHERE SC3.Cno=SC2.Cno))(3)檢索至少選修LIU老師所授課程中一門課程的女學生姓名。
SELECT SNAMEFROM SWHERE SEX=‘F’ AND S# IN(SELECT S#FROM SCWHERE C# IN(SELECT C#FROM CWHERE TEACHER=‘LIU’)NOTICE:有多種寫法,比如聯接查詢寫法:
SELECT SNAMEFROM S,SC,CWHERE SEX=‘F’ AND SC.S#=S.S#AND SC.C#=C.C#AND TEACHER='LIU'但上一種寫法更好一些。
(4)檢索WANG同學不學的課程的課程號。
SELECT C#FROM CWHERE C# NOT IN(SELECT C#FROM SCWHERE S# IN(SELECT S#FROM SWHERE SNAME='WANG'))(5)檢索至少選修兩門課程的學生學號。
SELECT DISTINCT X.SNOFROM SC X,SC YWHERE X.SNO=Y.SNO AND X.CNO<>Y.CNONotice:對表SC進行自連接,X,Y是SC的兩個別名。
(6)檢索全部學生都選修的課程的課程號與課程名。
SELECT C#,CNAMEFROM CWHERE NOT EXISTS(SELECT *FROM SWHERE S# NOT IN(SELECT *FROM SCWHERE SC.C#=C.C#))要從語義上分解:(1)選擇課程的課程號與課程名,不存在不選這門課的同學。
其中,“不選這門課的同學”可以表示為:
SELECT *FROM SWHERE S# NOT IN(SELECT *FROM SC WHERE SC.C#=C.C#)或者
SELECT *FROM SWHERE NOT EXISTS(SELECT *FROM SC WHERE S.S#=C.S# AND SC.C#=C.C# )(7)檢索選修課程包含LIU老師所授課的學生學號。
SELECT DISTINCT S#FROM SCWHERE C# IN(SELECT C#FROM CWHERE TEACHER='LIU'))3.3 設有兩個基本表R(A,B,C)和S(D,E,F),試用SQL查詢語句表達下列關系代數表達式:
(1)πA?(2)σB='17’?(3)R×S(4))πA,F(σC=D(R×S))
(1)SELECT A FROM R
(2)SELECT * FROM R WHERE B=‘17’
(3)SELECT A,B,C,D,E,F FROM R,S
(4)SELECT A,F FROM R,S WHERE R.C=S.D
3.43.4 設有兩個基本表R(A,B,C)和S(A,B,C)試用SQL查詢語句表達下列關系代數表達式:
(1)R∪S (2)R∩S (3)R-S (4)πA,B?πB,C(S)
(1)
SELECT A,B,CFROM RUNIONSELECT A,B,CFROM S(2)
SELECT A,B,CFROM RINTERSECTSELECT A,B,CFROM S(3)
SELECT A,B,CFROM RWHERE NOT EXISTS(SELECT A,B,CFROM SWHERE R.A=S.A AND R.B=S.B AND R.C=S.C)(4)
SELECT R.A,R.B,S.CFROM R,SWHERE R.B=S.B3.5 試敘述SQL語言的關系代數特點和元組演算特點。
3.6 試用SQL查詢語句表達下列對教學數據庫中三個基本表S、SC、C的查詢:
(1)統計有學生選修的課程門數。
SELECT COUNT(DISTINCT C#) FROM SC(2)求選修C4課程的學生的平均年齡。
SELECT AVG(AGE)FROM SWHERE S# IN(SELECT S#FROM SCWHERE C#='C4')或者
SELECT AVG(AGE)FROM S,SCWHERE S.S#=SC.S# AND C#='004'(3)求LIU老師所授課程的每門課程的學生平均成績。
SELECT CNAME,AVG(GRADE)FROM SC ,CWHERE SC.C#=C.C# ANDTEACHER='LIU'GROUP BY C#(4)統計每門課程的學生選修人數(超過10人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列。
SELECT DISTINCT C#,COUNT(S#)FROM SCGROUP BY C#HAVING COUNT(S#)>10ORDER BY 2 DESC, C# ASC(5)檢索學號比WANG同學大,而年齡比他小的學生姓名。
SELECT X.SNAMEFROM S AS X, S AS YWHERE Y.SNAME='WANG' AND X.S#>Y.S# AND X.AGE<Y.AGE(6)檢索姓名以WANG打頭的所有學生的姓名和年齡。
SELECT SNAME,AGEFROM SWHERE SNAME LIKE 'WANG%'(7)在SC中檢索成績為空值的學生學號和課程號。
SELECT S#,C#FROM SCWHERE GRADE IS NULL(8)求年齡大于女同學平均年齡的男學生姓名和年齡。
SELECT SNAME,AGEFROM S AS XWHERE X.SEX='男' AND X.AGE>(SELECT AVG(AGE)FROM S AS Y WHERE Y.SEX='女')(9)求年齡大于所有女同學年齡的男學生姓名和年齡。
SELECT SNAME,AGEFROM S AS XWHERE X.SEX='男' AND X.AGE>ALL (SELECT AGE FROM S AS Y WHERE Y.SEX='女')除法運算
3.7 試用SQL更新語句表達對教學數據庫中三個基本表S、SC、C的各個更新操作:
(1)往基本表S中插入一個學生元組(‘S9’,‘WU’,18)。
INSERT INTO S(S#,SNAME,AGE) VALUES('59','WU',18)(2)在基本表S中檢索每一門課程成績都大于等于80分的學生學號、姓名和性別,并把檢索到的值送往另一個已存在的基本表STUDENT(S#,SANME,SEX)。
INSERT INTO STUDENT(S#,SNAME,SEX)SELECT S#,SNAME,SEXFROM S WHERE NOT EXISTS(SELECT * FROM SC WHEREGRADE<80 AND S.S#=SC.S#)(3)在基本表SC中刪除尚無成績的選課元組。
DELETE FROM SCWHERE GRADE IS NULL(4)把WANG同學的學習選課和成績全部刪去。
DELETE FROM SCWHERE S# IN(SELECT S#FROM SWHERE SNAME='WANG')(5)把選修MATHS課不及格的成績全改為空值。
UPDATE SCSET GRADE=NULLWHERE GRADE<60 AND C# IN(SELECT C#FROM CWHERE CNAME='MATHS')(6)把低于總平均成績的女同學成績提高5%。
UPDATE SCSET GRADE=GRADE*1.05WHERE GRADE<(SELECT AVG(GRADE) FROM SC) AND S# IN (SELECT S# FROM SWHERE SEX='F')(7)在基本表SC中修改C4課程的成績,若成績小于等于75分時提高5%,若成績大于75分時提高4%(用兩個UPDATE語句實現)。
UPDATE SCSET GRADE=GRADE*1.05WHERE C#='C4' AND GRADE<=75UPDATE SCSET GRADE=GRADE*1.04WHERE C#='C4' AND GRADE>753.8 “倉庫管理”關系模型有五個關系模式:
零件 PART(P#,PNAME,COLOR,WEIGHT)
項目 PROJECT(J#,JNAME,DATE)
供應商 SUPPLIER(S#,SNAME,SADDR)
供應 P_P(J#,P#,TOTOAL)
采購 P_S(P#,S#,QUANTITY)
(1)試用SQLDDL語句定義上述五個基本表,并說明主鍵和外鍵。
CREATE TABLE PART(P# CHAR(4) NOT NULL,PNAME CHAR(12) NOT NULL,COLOR CHAR(10),WEIGHT REAL,PRIMARY KEY(P#))CREATE TABLE PROJECT(J# CHAR(4) NOT NULL,JNAME CHAR(12) NOT NULL,DATE DATE,PRIMARY KEY(J#))CREATE TABLE SUPLIER(S# CHAR(4) NOT NULL,SNAME CHAR(12),SADDR VARCHAR(20),PRIMARY KEY(S#))CREATE TABLE P_P(J# CHAR(4),P# CHAR(4),TOTAL INTEGER,PRIMARY KEY(J#,P#),FOREIGN KEY(J#) REFERENCE PROJECT(J#),FOREIGN KEY(P#) REFERENCE PART(P#))CREATE TABLE P_S(P# CHAR(4),S# CHAR(4),QUANTITY INTEGER,PRIMARY KEY(P#,S#),FOREIGN KEY(P#) REFERENCE PART(P#),FOREIGN KEY(S#) REFERENCE SUPLIER(S#))(2)試將PROGECT、P_P、PART三個基本表的自然聯接定義為一個視圖VIEW1,PART、P_S、SUPPLIER 三個基本表的自然聯接定義為一個視圖VIEW2。
CREATE VIEW VIEW1(J#,JNAME,DATE,P#,PNAME,COLOR,WEIGHT,TOTAL)AS SELECT PROJECT.J#,JNAME,DATE,PART.P#,PNAME,COLOR,WEIGHT,TOTALFROM PROJECT,PART,P_PWHERE PART.P#=P_P.P# AND P_P.J#=PROJECT.J# CREATE VIEW VIEW2(P#,PNAME,COLOR,WEIGHT,S#,SNAME,SADDR,QUANTITY)AS SELECT PART.P#,PNAME,COLOR,WEIGHT,SUPPLIER.S#,SNAME,SADDR,QUANTITYFROM PART,P_S,SUPPLIERWHERE PART.P#=P_S.P# AND P_S.S#=SUPPLIER.S#(3)試在上述兩個視圖的基礎上進行數據查詢:
1)檢索上海的供應商所供應的零件的編號和名字。
SELECT P#,PNAME FROM VIEW2 WHERE SADDR='SHANGHAI'2)檢索項目J4所用零件的供應商編號和名字。
SELECT S#,SNAME FROM VIEW2 WHERE P# IN(SELECT P# FROM VIEW1 WHERE J#='J4')3.9 對于教學數據庫中基本表SC,已建立下列視圖:
CREATEVIEWS_GRADE(S#,C_NUM,AVG_GRADE) ASSELECTS#,COUNT(C#),AVG(GRADE) FROMSC GROUPBYS#試判斷下列查詢和更新是否允許執行。若允許,寫出轉換到基本表SC上的相應操作。
(1)
SELECT* FROMS_GRADE允許SELECT S#,COUNT(C#),AVG(GRADE)FROM SC GROUP BY S#(2)
SELECTS#,C_NUM FROMS_GRADE WHEREAVG_GRADE>80允許SELECT S#,COUNT(C#) FROM SC WHEREAVG(GRADE)>80(3)
SELECTS#,AVG_GRADE FROMS_GRADE WHEREC_NUM>(SELECTC_NUM FROMS_GRADE WHERES#=‘S4’)允許SELECT S#,AVG(GRADE)FROM SC AS XWHERE COUNT(X.C#)>(SELECTCOUNT(Y.C#) FROM SC AS Y WHERE Y.S#='S4')GROUP BY S#(4)
UPDATES_GRADE SETC_NUM=C_NUM+1 WHERES#=‘S4’不允許(5)
DELETEFROMS_GRADE WHEREC_NUM>4不允許3.10 預處理方式對于嵌入式SQL的實現有什么重要意義?
預處理方式是先用預處理程序對源程序進行掃描,識別出SQL語句,并處理成宿主語言的函數調用形式; 然后再用宿主語言的編譯程序把源程序編譯成目標程序。這樣,不用擴充宿主語言的編譯程序, 就能處理SQL語句。
3.11 在宿主語言的程序中使用SQL語句有哪些規定?
在宿主語言的程序中使用SLQ語句有以下規定:
(1)在程序中要區分SQL語句與宿主語言語句
(2)允許嵌入的SQL語句引用宿主語言的程序變量(稱為共享變量),但有兩條規定:
1)引用時,這些變量前必須加“:”作為前綴標識,以示與數據庫中變量有區別。
2)這些變量由宿主語言的程序定義,并用SQL的DECLARE語句說明。
(3)SQL的集合處理方式與宿主語言單記錄處理方式之間要協調。 需要采用游標機制,把集合操作轉換成單記錄處理方式。
3.12SQL的集合處理方式與宿主語言單記錄處理方式之間如何協調?
由于SQL語句處理的是記錄集合,而宿主語言語句一次只能處理一個記錄, 因此需要用游標(cousor)機制,把集合操作轉換成單記錄處理方式。
2.13 嵌入式SQL語句何時不必涉及到游標?何時必須涉及到游標?
(1)INSERT、DELETE、UPDATE語句,查詢結果肯定是單元組時的SELECT語句, 都可直接嵌入在主程序中使用,不必涉及到游標。
(2)當SELECT語句查詢結果是多個元組時,此時宿主語言程序無法使用, 一定要用游標機制把多個元組一次一個地傳送給宿主語言處理。
(電商)數據庫原理及應用_模擬考核試題及參考答案
一、單選 (每空1分,共10分)
1.在Access數據庫中,數據保存在( )對象中。
A.窗體 B.查詢 C.報表 D.表
2.如果某一字段數據型為文本型,字段大小為8,該字段中最多可輸入( )個漢字。
A.8 B.4 C.16 D.32
3.文本型字段最多可以存放( )個字符。
A.250 B.252 C.254 D.255
4.Access用戶操作界面由( )部分組成。
A.4 B.5 C.3 D.6
5.下列( )圖標是Access中表對象的標志。
A. B. C. D.
6.在設計Access數據表時,“索引”屬性有( )取值。
A.1 B.2 C.3 D.4
7.Access中包含有( )種數據類型。
A.9 B.10 C.7 D.8
8.在一個宏中要打開一個報表,應該使用的操作是( )。
A.OpenForm B.OpenReport C.OpenTable D.OpenQuery
9.可以通過Internet進行數據發布的對象是( )。
A.窗體 B.報表 C.查詢 D.數據訪問頁
10.模塊窗口由( )個部分組成。
A.2 B.3 C.4 D.5
二、填空 (每空1分,共20分)
1.在人工管理和文件管理階段,程序設計__依賴于 ___數據表示。
2.在文件系統中,存取數據的基本單位為___記錄____,在數據庫系統中,存取數據的基本單位為___數據項_____。
3.若實體A和B是多對多的聯系,實體B和C是1對1的聯系,則實體A和C是___多_____對___多_____的聯系。
4.在一個關系中不允許出現重復的____元組____,也不允許出現具有相同名字的___屬性_____。
5.數據庫系統中的四類用戶分別為____數據庫管理員、數據庫設計員、應用程序員、終端用戶_____。
6.在存取數據庫的數據的過程中,使用了兩個數據緩沖區,分別為___系統_____緩沖區和____用戶 ____緩沖區。
7.學生關系中的班級號屬性與班級關系中的班級號主碼屬性相對應,則____班級號____為學生關系中的___外碼___。
8.設一個關系A具有a1個屬性和a2個元組,關系B具有b1個屬性和b2個元組,則關系A′B具有___a1+b1____個屬性和____ a2′b2 ____個元組。
9.設一個學生關系為S(學生號,姓名),課程關系為C(課程號,課程名),選課關系為X(學生號,課程號,成績),求出所有選課的學生信息的運算表達式為_____?學生號(X)______與____S ____的自然連接。
10.在一個關系R中,若存在X→Y和X→Z,則存在_____ X→(Y,Z)_______,稱此為函數依賴的合并性規則。
三、填空 (每空1分,共20分)
1.若一個關系的任何非主屬性都不部分依賴依賴于任何候選碼,則稱該關系達到____第二____范式。
2.在SQL中,列級完整性約束分為__6__種情況,表級完整性約束分為__4__種情況。
\3. 在SQL中,每個視圖中的列可以來自不同的___表___,它是在原有表的基礎上____建立____的邏輯意義上的新關系。
\4. 在SQL的查詢語句中,group by選項實現____分組統計______功能,order by選項實現對結果表的____排序_____功能。
5.對于較復雜的系統,概念設計階段的主要任務是:首先根據系統的各個局部應用畫出各自對應的____局部ER圖______,然后再進行綜合和整體設計,畫出_____整體ER圖_____。
6.機器實現階段的目標是在計算機系統中得到一個滿足______設計要求、功能完善、操作方便___的數據庫應用系統。
7.Access的用戶操作界面由 標題欄、菜單欄、工作區 、工具欄、狀態欄等五個部分組成。
8.Access“表”結構設計窗口中上半部分的“表設計器”是由 字段名稱、數據類型、說明 等三列組成。
9.Access中的窗體由 頁眉、主體 和頁腳等三個部分組成。
四、填空 (每空1分,共20分)
\1. 設一個關系為R(A,B,C,D,E),它的最小函數依賴集為FD={A→B,A→C,(C,D)→E},則該關系的候選碼為_____(A,D)___,候選碼函數決定E是___偽傳遞___性。
2.設一個關系為R(A,B,C,D,E),它的最小函數依賴集為FD={A→B,A→C,(A,D)→E},該關系只滿足___第一_____范式,若要規范化為高一級的范式,則將得到____2____個關系。
3.在實際的數據庫管理系統中,對數據庫的操作方式有_____命令交互、程序執行、窗口界面______等三種。
4.在SQL中,主碼約束的關鍵字為____ primary key________,外碼約束的關鍵字為______foreignkey ______。
5.基本表屬于全局模式中的表,它是____實表____,而視圖則屬于局部模式中的表,它是____虛表 ____。
\6. 在SQL新版的查詢語句中,select選項實現投影運算,from選項實現____連接____運算,where選項實現____選擇___運算。
7.數據字典是對系統工作流程中____數據____和____處理____的描述。
8.關系數據庫系統中的全局模式由若干個基本表所組成,表與表之間的聯系是通過定義的____主碼____和____外碼____實現的。
9.在旅店管理中,涉及到的基本表有四個,它們分別為客房表、住宿表、_****旅客登記表、消費卡表****。
10.在設置或撤消數據庫密碼的過程中,密碼對于字母 大小寫 是敏感的。
五、填空 (每空1分,共10分)
1.Access的用戶操作界面由 標題欄、菜單欄、工作區 、工具欄、狀態欄等五個部分組成。
2.Access“表”結構設計窗口中上半部分的“表設計器”是由 字段名稱、數據類型 和說明等三列組成。
3.Access中的窗體由 頁眉、主體、頁腳 等三個部分組成。
4.在Access中模塊分為 類模塊 和 標準模塊 兩種類型。
六、根據主教材第四章所給的商品庫和教學庫,或者按照下列所給的每條SQL查詢語句寫出相應的功能,或者按照下列所給的每種功能寫出相應的SQL查詢語句。(每小題4分,共20分)
在名稱為商品庫的數據庫中包含有商品表1和商品表2,它們的定義分別為:
商品表1(商品代號 char(8),分類名 char(8),單價 float,數量 int)
商品表2(商品代號 char(8),產地 char(6),品牌 char(6),)
在名稱為教學庫的數據庫中包含有學生、課程和選課三個表,它們的定義分別為:
學生(學生號 char(7),姓名 char(6),性別 char(2),出生日期 datetime,
專業 char(10),年級 int)
課程(課程號 char(4),課程名 char(10),課程學分 int
選課(學生號 char(7),課程號 char(4),成績 int)
1.select distinct 產地from 商品表2功能:從商品庫中查詢出所有商品的不同產地。2.select *from 學生where 學生號 in (select 學生號from 選課group by 學生號 having count(*)=1)功能:從教學庫中查詢出只選修了一門課程的全部學生。3.select *from 學生where 學生號 in (select 學生號from 選課group by 學生號 having count(*)<=2 ) or not exists (select *from 選課where 學生.學生號=選課.學生號)功能: 從教學庫中查詢出最多選修了2門課程(含未選任何課程)的全部學生。4.從商品庫中查詢出每類(即分類名相同)商品的最高單價。
select 分類名,max(單價) as 最高單價from 商品表1group by 分類名5.從教學庫中查詢出至少選修了姓名為@m1學生所選課程中一門課的全部學生。
copyselect distinct 學生.*from 學生,選課where 學生.學生號=選課.學生號 and 課程號=any(select 課程號from 學生,選課where 學生.學生號=選課.學生號 and 姓名=@m1)總結
以上是生活随笔為你收集整理的最全的SQL练习题(做完你就是高手)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电子信息工程跨考计算机武大,我考研的一些
- 下一篇: SDK全局热更新方案(全网唯一)