3.4 SQL--多表查询分组排序


1.查询至少参加两个项目的职工编号及参与项目数的SQL语句:select 职工编号,count(项目编号) from 职工项目 group by 职工编号( );
A. having sum(项目编号)>=2
B. having sum(项目编号)<=2
C. having count(项目编号)>=2
D. having count(项目编号)<=2

正确选项:C
解析:使用having子句对分组统计的结果进行筛选,至少参加两个项目是项目数>=2


2.实现“查询学生1001所选课程的课程号和成绩,按成绩降序排列”的SELECT语句为( )。
A. SELECT Cno, Grade FROM SC ORDER BY Grade WHERE Sno='1001'
B. SELECT Cno, Grade FROM SC ORDER BY Grade WHERE Sno='1001'
C. SELECT Cno, Grade FROM SC WHERE Sno='1001' ORDER BY Grade DESC
D. SELECT Cno, Grade FROM SC WHERE Sno='1001' ORDER BY Grade

正确选项:C
解析:select ..from..where ...order by,这是一个SELECT语句中正确的顺序,order by不会在where子句前面,如果需要分组,group by应该在order by 前面。降序关键字是desc


3.实现“查询先行课为6的课程总数”的SELECT语句为( )。
A. SELECT COUNT(*) FROM Course WHERE Cpno='6'
B. SELECT AVG(*) FROM Course WHERE Cpno='6'
C. SELECT MIN(*) FROM Course WHERE Cpno='6'
D. SELECT SUM(*) FROM Course WHERE Cpno='6'

正确选项:A
解析:课程总数是计数,一行是一门课程数据,用count(*)统计多少行就是多少门课程。只有count()函数可以用号做参数,其他聚合函数只能用列名做参数


4,实现“查询已有学生选修的课程的课程总数”的SELECT语句为( )。
A. SELECT SUM(Cno) FROM SC
B. SELECT SUM(DISTINCT Cno) FROM SC
C. SELECT COUNT(Cno) FROM SC
D. SELECT COUNT(DISTINCT Cno) FROM SC

正确选项:D
解析:计数应该用count()函数,一门课程被多名学生选应该只计一个,所以需要用distinct去除重复


5.实现“查询每个学生选课总数”的SELECT语句为( )。
A. SELECT Sno, SUM(Cno) FROM SC ORDER BY Sno
B. SELECT Sno, COUNT(Cno) FROM SC ORDER BY Sno
C. SELECT Sno, SUM(Cno) FROM SC GROUP BY Sno
D. SELECT Sno, COUNT(Cno) FROM SC GROUP BY Sno

正确选项:D
解析:“每个学生选课总数”应该分组计数,按学号分组,group by 是分组,order by 是排序


6.实现“查询选课总数超过两门的学生的学号及选课总数”的SELECT语句为( )。
A. SELECT Sno, SUM(Cno) FROM SC ORDER BY Sno HAVING COUNT(Cno)>2
B. SELECT Sno, COUNT(Cno) FROM SC ORDER BY Sno HAVING COUNT(Cno)>2
C. SELECT Sno, COUNT(Cno) FROM SC GROUP BY Sno HAVING COUNT(Cno)>2
D. SELECT Sno, SUM(Cno) FROM SC GROUP BY Sno HAVING COUNT(Cno)>2

正确选项:C
解析:对聚合函数计算结果进行筛选需要用having子句,having子句一定配合group by子句使用,在group by子句后面。


7.有关系模式stu(学号,姓名,性别,类别,身份证号) tea(教师号,姓名,性别,身份证号,工资),查询在读研究生教师的平均工资、最高与最低工资之间差值的SQL语句是:
select( ) from stu, tea where stu.身份证号=tea.身份证号 And 类别=‘研究生’
A. AVG(工资) AS 平均工资 ,MAX(工资) - MIN(工资) AS 差值
B. 平均工资 AS AVG(工资) ,差值 AS MAX(工资) - MIN(工资)
C. AVG(工资) ANY 平均工资 ,MAX(工资) - MIN(工资) ANY 差值
D. 平均工资 ANY AVG(工资) ,差值 ANY MAX(工资) - MIN(工资)

正确选项:A
解析:给列重新定义别名有三种方法:别名=列名; 列名 AS 别名;列名 别名 ,没有加ANY字样的


8.设A、B两个表的记录数分别为3和5,对两个表执行交叉连接查询,查询结果中最多可获得( )条记录。
A. 3
B. 4
C. 12
D. 15

正确选项:D
解析:交叉连接就是笛卡尔乘积,结果是两个记录数的乘积


9.假定学生关系是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

正确选项:D
解析:课程名在课程关系C中,性别在学生关系S中,哪名学生选修了哪门课程的信息是记录在选课关系SC中,所以涉及三张表。


10.有学生表S(S#,SN,SEX,AGE,DEPT)和选课表SC(S#,C#,GRADE),其中:S#为学号,SN为姓名,SEX为性别,AGE为年龄,DEPT为系别,C#为课程号,GRADE为成绩。检索学生姓名及其所选修课程的课程号和成绩,正确的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

正确选项:C
解析:学生姓名在S表中,课程号和成绩在SC表中,两个表都要放在from后面做内连接,然后在where子句中写明两个表的连接条件


11.实现“查询学生及其选课情况(基于左外连接)”的SELECT语句为()。
A. SELECT S.*,SC.* FROM Student S JOIN SC ON S.Sno=SC.Sno
B. SELECT S.*,SC.* FROM Student S, SC WHERE S.Sno=SC.Sno
C. SELECT S.*,SC.* FROM Student S LEFT JOIN SC ON S.Sno=SC.Sno
D. SELECT S.*,SC.* FROM Student S OUTER JOIN SC ON S.Sno=SC.Sno

正确选项:C
解析:LEFT (outer) JOIN是左外连接的关键字。用逗号分隔两个表是内连接,连接条件写在WHERE子句中,用join连接两个表也是内连接,但需要用on子句表示两个表的连接条件。


12.实现“查询所有女生的选课情况, 显示姓名、课程号(基于连接查询)”的SELECT语句为()。
A. SELECT Sname, Cno FROM Student S,SC WHERE S.Sno=SC.Sno OR Ssex='女'
B. SELECT Sname, Cno FROM Student S,SC WHERE Ssex='女'
C. SELECT Sname, Cno FROM Student S JOIN SC ON Ssex='女'
D. SELECT Sname, Cno FROM Student S JOIN SC ON S.Sno=SC.Sno WHERE Ssex='女'

正确选项:D
解析:A选项错在where子句用了or而不是and,不是同时满足两个条件;B选项错在没有写两个表的连接条件,出现笛卡尔积效果;C选项ON后面应该是两个表的连接条件,其他条件写在where子句中。


13.实现“查询学生表和课程表的笛卡尔积”的SELECT语句为()。
A. SELECT * FROM Student S,SC WHERE S.Sno=SC.Sno
B. SELECT * FROM Student CLASS JOIN SC
C. SELECT * FROM Student CROSS JOIN IN SC
D. SELECT * FROM Student,SC

正确选项:D
解析:两个或多个表的连接查询,却没有写表之间的关联条件,就会出现笛卡尔积的效果。选项A是正确的连接查询语句。


14.现有书目表book,包含字段:price (float); 现在查询一条书价最高的书目的详细信息,以下语句正确的是( )。
A. select top 1 * from book order by price asc
B. select top 1 * from book order by price desc(降序)
C. select * from book where price= max(price)
D. select top 1 * from book where price= max(price)

正确选项:B
解析:按价格降序排列的第一个就是价格最高的,降序关键字是desc。函数max()必须用在select 子句中。


15.有学生表S(S#,SN,SEX,AGE,DEPT),其中:S#为学号,SN为姓名,SEX为性别,AGE为年龄,DEPT为系别。检索所有比“王华”年龄大的学生姓名、年龄和性别。正确的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

正确选项:A
解析:主查询中嵌套一个子查询,两个查询都是完整的select…from…where形式。B选项查询的是“王华”的信息,C选项子查询缺少from子句,D选项“王华.AGE”错误,只有“表名.列名”的写法,不能写“某个值.列名”,A选项写法正确。


16.在SQL语言中,子查询是()。
A. 选取单表中字段子集的查询语句
B. 返回单表中数据子集的查询语句
C. 嵌入到另一个查询语句之中的查询语句
D. 返回多表中字段子集的查询语句

正确选项:C
解析:子查询是嵌入到另一个查询语句之中的查询语句


17.实现“查询与刘晨同系的学生信息(基于带EXISTS的查询)”的语句为:SELECT * FROM Student s WHERE ()。
A. EXISTS (SELECT * FROM Student t WHERE t.Sname='刘晨' AND t.Sdept=s.Sdept)
B. NOT EXISTS (SELECT * FROM Student t WHERE t.Sname='刘晨' OR t.Sdept=s.Sdept)
C. EXISTS (SELECT * FROM Student t WHERE t.Sname='刘晨' OR t.Sdept=s.Sdept)
D. NOT EXISTS (SELECT * FROM Student t WHERE t.Sname='刘晨' AND t.Sdept=s.Sdept)

正确选项:A
解析:主查询与子查询都用到student表,分别起别名s和t。这是相关子查询,子查询要受主查询所在系制约。查询过程:主查询取出一行记录,将所在系传入子查询,子查询查找“所在系=主查询传入的系 同时 姓名=’刘晨’”,如果能找到,EXISTS 子句结果为真,显示主查询查询到的记录,如果找不到,EXISTS 子句结果为假,则不显示主查询查询到的记录。主查询再取下一行,重复此过程,直至student表数据全部取出。


18.实现“查询年龄比刘晨小的学生的信息(基于嵌套)”的语句为:
SELECT * FROM Student WHERE ()
A. Sage>刘晨.Sage
B. Sage<刘晨.Sage
C. Sage>(SELECT Sage FROM Student WHERE Sname = '刘晨')
D. Sage<(SELECT Sage FROM Student WHERE Sname = '刘晨')

正确选项:D
解析:主查询中嵌套一个子查询,两个查询都是完整的select...from...where形式。只有“表名.列名”的写法,不能写“某个值.列名”,“刘晨.Sage”写法错误。


19.实现“查询每个学生比刘晨大多少岁(基于嵌套)”的语句为:
SELECT Sname,( ) FROM Student
A. Sage-(SELECT Sage FROM Student WHERE Sname = '刘晨')
B. Sage-刘晨.Sage
C. Sage+(SELECT Sage FROM Student WHERE Sname = '刘晨')
D. Sage+刘晨.Sage

正确选项:A
解析:嵌套查询不仅可以将子查询嵌入where子句,也可以嵌入select 子句。“刘晨.Sage”写法错误,只有“表名.列名”的写法,不能写“某个值.列名”


20.实现“查询与刘晨同系的学生信息(基于嵌套)”的语句为SELECT * FROM Student ()。
A. WHERE Sname IN (SELECT Sdept FROM Student WHERE Sname='刘晨')
B. WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname='刘晨')
C. WHERE Sdept > (SELECT Sdept FROM Student WHERE Sname='刘晨')
D. WHERE Sdept IN (SELECT Sname FROM Student WHERE Sname='刘晨')

正确选项:B
解析:“同系”就应该用表示系的列名sdept做条件,嵌套的子查询select 子句中也必须是sdept,要相匹配。


21.实现“查询年龄比IS系所有学生都大的学生信息(基于嵌套)”的语句为:SELECT * FROM Student WHERE ()
A. Sage>ALL(SELECT Sage FROM Student WHERE Sdept = 'IS')
B. Sage>ANY IS.Sage
C. Sage>ANY(SELECT Sage FROM Student WHERE Sdept = 'IS')
D. Sage>ALL IS.Sage

正确选项:A
解析:大于所有语句是“>ALL(查询语句)”,ALL是用在子查询前面,后面不能直接加列名,大于所有也可以写为大于最大值。


22.(多选题)实现“查询所有学生都选的课程”的思路包括()。
A. 给定学生s, 如果s选修s的课程数等于课程总数,则s选修了全部课程
B. 给定课程s, 寻找没有选修s的学生,如果不存在这样的学生,则所有学生都选了s
C. 给定学生s, 寻找s没有选修的课程,如果不存在这样的课程,则s选修了全部课程
D. 给定课程s, 如果选修s的学生人数等于学生总数,则所有学生都选了s

正确选项:BD
解析:最终是选出课程,所以应该给定课程,找满足条件的课程。


23.(多选题)在下列查询中,()属于含“全部”的查询。
A. 查询所有学生都选修的课程
B. 查询选修了2号课程的所有学生
C. 查询选修了所有课程的学生
D. 查询95001选修的全部课程

正确选项:AC
解析:A和C选项是“除”运算的思想,B和D选项是简单查询


24.(多选题)在SQL语言中,可以嵌入子查询的子句包括()。
A. HAVING子句
B. FROM子句
C. WHERE子句
D. SELECT子句

正确选项:ABCD
解析:嵌入子查询中可以有这个四个子句,当然也可以有group by 子句,having 子句是在group by 子句后面的。子查询语句格式是:select ... from ... where ...group by...having,其中select和from子句是必须的,其他是可选。


25.实现“查询IS系年龄不大于19岁的学生(基于集合查询)”的语句为:
SELECT * FROM Student WHERE Sdept='IS' ( ) SELECT * FROM Student WHERE Sage!>19
A. EXCEPT
B. INTERSECT
C. ALL
D. UNION

正确选项:B
解析:EXCEPT是做差操作;UNION是并操作,合并后的结果自动去除重复行;INTERSECT是求交集的操作,取两个查询结果的交集。本题目要求两个条件同时满足,应该做“交”运算


26.实现“查询选修了1号课程但没有选修2号课程的学生学号(基于集合查询)”的语句为:
SELECT Sno FROM SC WHERE Cno='1' ( ) SELECT Sno FROM SC WHERE Cno='2'
A. EXCEPT
B. ALL
C. INTERSECT
D. UNION

正确选项:A
解析:EXCEPT是做差操作;UNION是并操作,合并后的结果自动去除重复行;INTERSECT是求交集的操作。本题目应该是“差”运算


27.实现“查询CS系的学生学号或选修了1号课程的学生学号(基于集合查询)”的语句为:
SELECT Sno FROM Student WHERE Sdept='CS' ( ) SELECT Sno FROM SC WHERE Cno='1'
A. EXCEPT
B. UNION
C. INTERSECT
D. ALL

正确选项:B
解析:EXCEPT是做差操作;UNION是并操作,合并后的结果自动去除重复行;INTERSECT是求交集的操作。本题目是“并”运算,集合运算要求两个select查询结果列数相同,对应列类型相同(同质)。


28.在SQL语言中,UNION操作后的ALL关键字的作用为()。
A. 将两个子查询的目标列合并在一起
B. 不消除结果表中的重复行
C. 将两个子查询的所有相关信息混合显示
D. 将两个子查询的所有行混合显示

正确选项:B
解析:并操作UNION自动去掉重复行,UNION ALL则显示所有结果,不去除重复行


29.参与集合操作的两个子查询须满足:1)目标列总数相同,并按顺序一一对应;2)对应列的数据类型和长度相同。( )
A. 对
B. 错

正确选项:A
解析:无


30.集合查询指用集合操作将多个子查询的结果集合并为一个。( )
A. 对
B. 错

正确选项:A
解析:无


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值