数据库笔试面试(第一版)——根据题目完成以下50道SQL语句
已知有如下4張表:
學生表:STUDENT(S#,SNAME,SAGE,SSEX)
課程表:COURSE(C#,CNAME,T#)
成績表:SC(S#,C#,SCORE)
教師表:TEACHER(T#,TNAME)
其中,S#代表學號,SNAME代表學生姓名,SAGE代表學生年齡,SSEX代表學生性別,C#代表課程編號,CNAME代表課程名字,T#代表教師編號,TNAME代表教師名字,SCORE代表成績。
根據以上信息按照下面要求寫出對應的SQL語句。
1、查詢課程編號為“001”的課程比“002”的課程成績高的所有學生的學號
2、查詢平均成績大于60分的學生的學號和平均成績
3、查詢所有學生的學號、姓名、選課數、總成績
4、查詢姓“李”的老師的個數
5、查詢沒學過“李美玲”老師課的學生的學號、姓名
6、查詢學過編號為“001”的課程并且也學過編號為“002”的課程的學生的學號、姓名
7、查詢學過“李多多”老師所教的所有課的學生的學號、姓名
8、查詢課程編號為“002”的總成績
9、查詢所有課程成績小于60分的學生的學號、姓名
10、查詢沒有學全所有課的學生的學號、姓名
11、查詢至少有一門課與學號為“1001”的學生所學課程相同的學生的學號和姓名
12、查詢所學課程和學號為“001”的學生所有課程一樣的其他學生的學號和姓名
13、把“SC”表中“李多多”老師教的課的成績都更改為此課程的平均成績
14、查詢沒有學習過“1002”號課程的的學生的學號和姓名
15、刪除學習“李多多”老師課的SC表記錄
16、向SC表中插入一些記錄這些記錄要求符合以下條件:沒有上過編號為“003”課程的學生的學號、編號為002的課程的平均成績
17、按平均成績從高到低顯示所有學生的“數據庫”、“企業管理”、“英語”三門的課程成績,其中數據庫的c#為004,企業管理的c#為001,英語的c#為006,按如下形式顯示:
學生ID數據庫企業管理英語有效課程數有效平均成績
18、查詢各科成績最高和最低的分,以如下形式顯示課程ID最高分最低分
19、按各科平均成績從低到高和及格率的百分數從高到低排列,以如下形式顯示:
課程號課程名平均成績及格百分數
20、查詢如下課程平均成績和及格率的百分數(用1行顯示),其中企業管理為001,馬克思為002,UML為003,數據庫為004
21、查詢不同老師所教不同課程平均分從高到低顯示
22、查詢如下課程成績第3名到第6名的學生成績單,其中企業管理為001,馬克思為002,UML為003,數據庫為004,以如下形式顯示:
學生ID學生姓名企業管理馬克思UML數據庫平均成績
23、使用分段[100-85],[85-70],[70-60],[<60]來統計各科成績,分別統計各分數段人數:課程ID和課程名稱
24、查詢學生平均成績及其名次
25、查詢各科成績前三名的記錄(不考慮成績并列情況)
26、查詢每門課程被選修的學生數
27、查詢出只選修了一門課程的全部學生的學號和姓名
28、查詢男生、女生人數
29、查詢姓“張”的學生名單
30、查詢同名同性學生名單并統計同名人數
31、1981年出生的學生名單(注:STUDENT表中SAGE列的類型是DATE)
32、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時按課程號降序排列
33、查詢平均成績大于85的所有學生的學號、姓名和平均成績
34、查詢課程名稱為“數據庫”且分數低于60的學生姓名和分數
35、查詢所有學生的選課情況
36、查詢任何一門課程成績在70分以上的姓名、課程名稱和分數
37、查詢不及格的課程并按課程號從大到小排列
38、查詢課程編號為003且課程成績在80分以上的學生的學號和姓名
39、查詢選了課程的學生人數
40、查詢選修“李多多”老師所授課程的學生中成績最高的學生姓名及其成績
41、查詢各個課程及相應的選修人數
42、查詢有2門不同課程成績相同的學生的學號、課程號、學生成績
43、查詢每門課程成績最好的前兩名
44、查詢每門課程的學生選修人數,超過10人的課程才統計。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同按課程號升序排列
45、查詢至少選修兩門課程的學生學號
46、查詢全部學生都選修的課程的課程號和課程名
47、查詢沒學過“李多多”老師講授的任一門課程的學生姓名
48、查詢兩門以上不及格課程的同學的學號及其平均成績
49、檢索課程編號為“004”且分數小于60的學生學號,結果按按分數降序排列
50、刪除學生編號為“002”的課程編號為“001”的課程的成績
本題考察SQL的編寫能力,對于這類型的題目,只要把4張表之間的關聯關系搞清楚了,編寫對應的SQL語句就比較容易了,本題給出的四張表之間的關系如下圖所示:
1、答案:首先查詢課程編號分別為001和002的所有學生的學號及其分數作為內嵌視圖A和B,然后將A和B通過學號關聯,過濾條件就是A的分數大于B的分數,最終SQL如下:
SELECTA.S#
FROM(SELECTS#,SCOREFROMSCWHEREC#='001')A,
(SELECTS#,SCOREFROMSCWHEREC#='002')B
WHEREA.SCORE>B.SCORE
ANDA.S#=B.S#;
2、答案:該內容通過SC表即可獲取,按照SC表的S#分組后即可求出平均成績,最后通過HAVING子句來過濾平均分大于60的學生,最終SQL如下:
SELECTS#,AVG(SCORE)
FROMSC
GROUPBYS#
HAVINGAVG(SCORE)>60;
3、答案:學生姓名通過STUDENT表獲取,成績通過SC表獲取,考察的是COUNT和GROUPBY函數,最終SQL如下:
SELECTSTUDENT.S#,STUDENT.SNAME,COUNT(SC.C#),SUM(SCORE)
FROMSTUDENT
LEFTOUTERJOINSC
ONSTUDENT.S#=SC.S#
GROUPBYSTUDENT.S#,SNAME;
4、答案:老師通過TEACHER表即可查詢,考察模糊查詢,最終SQL如下:
SELECTCOUNT(DISTINCT(TNAME))
FROMTEACHER
WHERETNAMELIKE'李%';
5、答案:首先查詢學習過“李美玲”老師課的學生的學號作為子查詢,而“李美玲”老師涉及到TEACHER表,TEACHER表要和學生有關聯必須通過課程和成績表,最終SQL如下:
SELECTSTUDENT.S#,STUDENT.SNAME
WHERES#NOTIN(SELECTDISTINCT(SC.S#)
FROMSC,COURSE,TEACHER
WHERESC.C#=COURSE.C#
ANDTEACHER.T#=COURSE.T#
ANDTEACHER.TNAME='李美玲');
6、答案:這道題需要注意的是“且”這個關鍵詞,說明查詢出來的學生即學習過001也學習過002的課程,最終SQL如下:
FROMSTUDENT,SC
WHERESTUDENT.S#=SC.S#
ANDSC.C#='001'
ANDEXISTS(SELECT*
FROMSCASSC_2
WHERESC_2.S#=SC.S#
ANDSC_2.C#='002');
錯誤答案:
ANDSC.C#IN('001','002');
7、答案:這道題和第6題比較相似,需要理解題意,題目說的是查詢學過“李多多”老師所教的所有課的同學的學號、姓名,舉個例子,比如“李多多”老師教過語文和數學,那么就得找出哪些同學同時學習了語文和數學這2門課程,最終SQL如下:
SELECTS#,SNAME
WHERES#IN(SELECTS#
ANDTEACHER.TNAME='李多多'
HAVINGCOUNT(SC.C#)=(SELECTCOUNT(C#)
FROMCOURSE,TEACHER
WHERETEACHER.T#=COURSE.T#
ANDTNAME='李多多'));
WHERES#IN(SELECTS#FROMSC,COURSE,TEACHER
WHERESC.C#=COURSE.C#
ANDTEACHER.TNAME='李多多');
8、答案:本題考查SUM函數,最終SQL如下所示:
SELECTSUM(SCORE)FROMSCSC_2WHERESC_2.C#='002';
9、答案:涉及到學生表和成績表,比較簡單,最終SQL如下:
WHERES#NOTIN(SELECTSTUDENT.S#
WHERESCORE>=60);
10、答案:沒有學全所有課,翻譯一下就是學生學習的課程數小于總的課程數,最終SQL如下:
GROUPBYSTUDENT.S#,STUDENT.SNAME
HAVINGCOUNT(C#)<(SELECTCOUNT(C#)FROMCOURSE);
11、答案:首先找出學號為1001的學生學習過的課程,然后根據這些課程號就可以找到有哪些學生學習過部分1001學生學習過的課程,最終SQL如下:
ANDC#IN(SELECTC#FROMSCWHERES#='1001');
SELECTSC.S#,SNAME;
12、答案:首先找出學號為1001的學生學習過的課程,然后根據這些課程號和所學課程總數就可以找到有哪些同學學習過和他一樣的課程,最終SQL如下:
ANDC#IN(SELECTC#FROMSCWHERES#='001')
HAVINGCOUNT(C#)=(SELECTCOUNT(C#)FROMSCWHERES#='001');
13、答案:首先找到李多多老師教過哪些課程及其課程的平均成績,然后根據課程號關聯成績表進行更新,最終SQL如下:
UPDATESC
SETSCORE=
(SELECTAVG(SC_2.SCORE)
FROMCOURSE,TEACHER,SCSC_2
WHERECOURSE.T#=TEACHER.T#
ANDCOURSE.C#=SC_2.C#
ANDSC_2.C#=SC.C#
GROUPBYCOURSE.C#)
WHEREEXISTS(SELEC1FROMCOURSE,
TEACHER,
SCSC_2WHERECOURSE.T#=TEACHER.T#
GROUPBYCOURSE.C#
);
14、答案:本題比較簡答,最終SQL如下:
ANDC#NOTIN(SELECTC#FROMSCWHERES#='1002');
15、答案:本題比較簡答,最終SQL如下:
DELETEFROMSC
WHERESC.C#IN
(SELECTCOURSE.C#FROMCOURSEC,TEACHERTWHEREC.T#=T.T#ANDT.TNAME='李多多');
16、答案:2個點,002課程的平均成績和沒有學習過003課程的學生,最終SQL如下:
INSERTINTOSC(S#,C#,SCORE)
SELECTS#,'002',(SELECTAVG(SCORE)FROMSCWHEREC#='002')
WHERES#NOTIN(SELECTS#FROMSCWHEREC#='003');
17、答案:查看標量子查詢,最終SQL如下:
SELECTS#AS學生ID,
(SELECTSCOREFROMSCWHERESC.S#=T.S#ANDC#='004')AS數據庫,
(SELECTSCOREFROMSCWHERESC.S#=T.S#ANDC#='001')AS企業管理,
(SELECTSCOREFROMSCWHERESC.S#=T.S#ANDC#='006')AS英語,
COUNT(*)AS有效課程數,
AVG(T.SCORE)AS平均成績
FROMSCAST
ORDERBYAVG(T.SCORE)DESC;
18、答案:最終SQL如下:
SELECTC#AS課程ID,MAX(SCORE)AS最高分,MIN(SCORE)AS最低分
GROUPBYC#;
19、答案:最終SQL如下:
SELECTT.C#AS課程號,
MAX(COURSE.CNAME)AS課程名,
NVL(AVG(SCORE),0)AS平均成績,
((100*SUM(CASE
WHENNVL(SCORE,0)>=60THEN
1
ELSE
0
END))/COUNT(*))AS及格百分數
FROMSCT,COURSEC
WHERET.C#=C.C#
GROUPBYT.C#
ORDERBY平均成績,
END))/COUNT(*));
20、答案:最終SQL如下:
SELECTSUM(CASEWHENC#='001'THENSCOREELSE0END)/SUM(CASEC#WHEN'001'THEN1ELSE0END)AS企業管理平均分,
100*SUM(CASEWHENC#='001'ANDSCORE>=60THEN1ELSE0END)/SUM(CASEWHENC#='001'THEN1ELSE0END)AS企業管理及格百分數,
SUM(CASEWHENC#='002'THENSCOREELSE0END)/SUM(CASEC#WHEN'002'THEN1ELSE0END)AS馬克思平均分,
100*SUM(CASEWHENC#='002'ANDSCORE>=60THEN1ELSE0END)/SUM(CASEWHENC#='002'THEN1ELSE0END)AS馬克思及格百分數,
SUM(CASEWHENC#='003'THENSCOREELSE0END)/SUM(CASEC#WHEN'003'THEN1ELSE0END)ASUML平均分,
100*SUM(CASEWHENC#='003'ANDSCORE>=60THEN1ELSE0END)/SUM(CASEWHENC#='003'THEN1ELSE0END)ASUML及格百分數,
SUM(CASEWHENC#='004'THENSCOREELSE0END)/SUM(CASEC#WHEN'004'THEN1ELSE0END)AS數據庫平均分,
100*SUM(CASEWHENC#='004'ANDSCORE>=60THEN1ELSE0END)/SUM(CASEWHENC#='004'THEN1ELSE0END)AS數據庫及格百分數
FROMSC;
21、答案:最終SQL如下:
SELECTZ.T#AS教師ID,
Z.TNAMEAS教師姓名,
C.C#AS課程,
C.CNAMEAS課程名稱,
AVG(SCORE)AS平均成績
FROMSCAST,COURSEASC,TEACHERASZ
ANDC.T#=Z.T#
GROUPBYC.C#,Z.T#,Z.TNAME,C.CNAME
ORDERBYAVG(SCORE)DESC;
22、答案:最終SQL如下:
SELECTSC.S#AS學生學號,
STUDENT.SNAMEAS學生姓名,
T1.SCOREAS企業管理,
T2.SCOREAS馬克思,
T3.SCOREASUML,
T4.SCOREAS數據庫,
NVL(T1.SCORE,0)+NVL(T2.SCORE,0)+NVL(T3.SCORE,0)+
NVL(T4.SCORE,0)AS總分
LEFTJOIN(SELECT*
FROM(SELECTNB.S#,
NB.SCORE,
(RANK()OVER(PARTITIONBYNB.S#ORDERBYNB.SCORE))RK
FROMSCNB
WHERENB.C#='001')
WHERERK<=6
ANDRK>=3)AST1
ONSC.S#=T1.S#
WHERENB.C#='002')
ANDRK>=3)AST2
ONSC.S#=T2.S#
(RANK()OVER(PARTITIONBYNB.S#ORDERBYNB.SCORE))RK
WHERENB.C#='003')
ANDRK>=3)AST3
ONSC.S#=T3.S#
WHERENB.C#='004')
ANDRK>=3)AST4
ONSC.S#=T4.S#
WHERESTUDENT.S#=SC.S#;
23、答案:最終SQL如下:
SELECTSC.C#AS課程ID,
CNAMEAS課程名稱,
SUM(CASEWHENSCOREBETWEEN85AND100THEN1ELSE0END)AS"[100-85]",
SUM(CASEWHENSCOREBETWEEN70AND85THEN1ELSE0END)AS"[85-70]",
SUM(CASEWHENSCOREBETWEEN60AND70THEN1ELSE0END)AS"[70-60]",
SUM(CASEWHENSCORE<60THEN1ELSE0END)AS"[60-]"
FROMSC,COURSE
WHERESC.C#=COURSE.C#
GROUPBYSC.C#,CNAME;
24、答案:最終SQL如下:
SELECTS#AS學生學號,RKAS名次,平均成績
FROM(SELECTS#,
AVG(SCORE)平均成績,
SUM(SCORE)總成績,
(RANK()OVER(PARTITIONBYS#ORDERBYSUM(SCORE)DESC))RK
GROUPBYS#)AST2
ORDERBY名次DESC;
25、答案:最終SQL如下:
SELECTT1.S#AS學生ID,T1.C#AS課程ID,SCOREAS分數
FROMSCT1
WHERESCOREIN
(SELECTTOP3SCOREFROMSCWHERET1.C#=C#ORDERBYSCOREDESC)
ORDERBYT1.C#;
26、答案:最終SQL如下:
SELECTC#,COUNT(S#)FROMSCGROUPBYC#;
27、答案:最終SQL如下:
SELECTSC.S#,STUDENT.SNAME
FROMSC,STUDENT
WHERESC.S#=STUDENT.S#
GROUPBYSC.S#,STUDENT.SNAME
HAVINGCOUNT(C#)=1;
28、答案:最終SQL如下:
SELECTSUM(CASEWHENSSEX='男'THEN1ELSE0)AS男生人數,
SUM(CASEWHENSSEX='女'THEN1ELSE0)AS女生人數
GROUPBYSSEX;
29、答案:最終SQL如下:
SELECTSNAMEFROMSTUDENTWHERESNAMELIKE'張%';
30、答案:最終SQL如下:
SELECTSNAME,COUNT(*)FROMSTUDENTGROUPBYSNAMEHAVINGCOUNT(*)>1;
31、答案:最終SQL如下:
SELECTSNAME
WHERETO_CHAR(STUDENT.SAGE,'YYYY')='1981';
32、答案:最終SQL如下:
SELECTC#,AVG(SCORE)FROMSCGROUPBYC#ORDERBYAVG(SCORE),C#DESC;
33、答案:最終SQL如下:
SELECTSNAME,SC.S#,AVG(SCORE)
GROUPBYSC.S#,SNAME
HAVINGAVG(SCORE)>85;
34、答案:最終SQL如下:
SELECTSNAME,NVL(SCORE,0)
FROMSTUDENT,SC,COURSE
ANDSC.C#=COURSE.C#
ANDCOURSE.CNAME='數據庫'
ANDSCORE<60;
35、答案:最終SQL如下:
SELECTSC.S#,SC.C#,SNAME,CNAME
FROMSC,STUDENT,COURSE
ANDSC.C#=COURSE.C#;
36、答案:最終SQL如下:
SELECTDISTINCTSTUDENT.S#,STUDENT.SNAME,SC.C#,SC.SCORE
WHERESC.SCORE>=70
ANDSC.S#=STUDENT.S#;
37、答案:最終SQL如下:
SELECTC#FROMSCWHERESCORE<60ORDERBYC#;
38、答案:最終SQL如下:
ANDSCORE>80
ANDC#='003';
39、答案:最終SQL如下:
SELECTCOUNT(DISTINCTS#)FROMSCGROUPBYS#;
40、答案:最終SQL如下:
SELECTSTUDENT.SNAME,SCORE
FROMSTUDENT,SC,COURSEC,TEACHER
ANDSC.C#=C.C#
ANDC.T#=TEACHER.T#
ANDSC.SCORE=(SELECTMAX(SCORE)FROMSCWHEREC#=C.C#);
41、答案:最終SQL如下:
SELECTC#,COUNT(*)FROMSCGROUPBYC#;
42、答案:最終SQL如下:
SELECTDISTINCTA.S#,A.C#,B.SCORE
FROMSCA,SCB
WHEREA.SCORE=B.SCORE
ANDA.S#=B.S#
ANDA.C#<>B.C#;
43、答案:最終SQL如下:
FROM(SELECTS#,C#,(RANK()OVER(PARTITIONBYC#ORDERBYSCOREDESC))RK
FROMSC)T1
WHERERK<=2;
44、答案:最終SQL如下:
SELECTC#AS課程號,COUNT(*)AS人數
GROUPBYC#
HAVINGCOUNT(*)>10
ORDERBYCOUNT(*)DESC,C#;
45、答案:最終SQL如下:
SELECTS#FROMSCGROUPBYS#HAVINGCOUNT(*)>=2;
46、答案:最終SQL如下:
SELECTC#,CNAME
FROMCOURSE
WHEREC#IN(SELECTC#
FROM(SELECTC#,COUNT(DISTINCTS#)CS#FROMSCGROUPBYC#)
WHERECS#=(SELECTCOUNT(*)FROMSTUDENT));
47、答案:最終SQL如下:
WHERES#NOTIN(SELECTS#
FROMCOURSE,TEACHER,SC
ANDTNAME='李多多');
48、答案:最終SQL如下:
SELECTS#,AVG(NVL(SCORE,0))
WHERES#IN
(SELECTS#FROMSCWHERESCORE<60GROUPBYS#HAVINGCOUNT(*)>2)
GROUPBYS#;
49、答案:最終SQL如下:
SELECTS#
WHEREC#='004'
ANDSCORE<60
ORDERBYSCOREDESC;
50、答案:最終SQL如下:
WHERES#='002'
ANDC#='001';
總結
以上是生活随笔為你收集整理的数据库笔试面试(第一版)——根据题目完成以下50道SQL语句的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OC10_类的扩展
- 下一篇: 小程序获取手机号验证码