数据准备:
学生表 Student:
科目表 Course
教师表 Teacher
成绩表 SC
45题预览:
题目
1.查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数
1.1 查询同时存在" 01 "课程和" 02 "课程的情况
1.2 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null ) 1.3 查询不存在" 01 "课程但存在" 02 "课程的情况
2.查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
3.查询在 SC 表存在成绩的学生信息
4.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )
4.1 查有成绩的学生信息
5.查询「李」姓老师的数量
6.查询学过「张三」老师授课的同学的信息
7.查询没有学全所有课程的同学的信息
8.查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息
9.查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息
10.查询没学过"张三"老师讲授的任一门课程的学生姓名
11.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
12.检索" 01 "课程分数小于 60,按分数降序排列的学生信息
13.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
14.查询各科成绩最高分、最低分和平均分: 以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
15.按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺 15.1 按各科成绩进行排序,并显示排名, Score 重复时合并名次
16.查询学生的总成绩,并进行排名,总分重复时保留名次空缺 16.1 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺
17.统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 及所占百分比
18.查询各科成绩前三名的记录
19.查询每门课程被选修的学生数
20.查询出只选修两门课程的学生学号和姓名
21.查询男生、女生人数
22.查询名字中含有「风」字的学生信息
23.查询同名同性学生名单,并统计同名人数
24.查询 1990 年出生的学生名单
25.查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列
26.查询平均成绩大于等于 85 的所有学生的学号、姓名和平均成绩
27.查询课程名称为「数学」,且分数低于 60 的学生姓名和分数
28.查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况)
29.查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数
30.查询不及格的课程
31.查询课程编号为 01 且课程成绩在 80 分以上的学生的学号和姓名
32.求每门课程的学生人数
33.假设成绩不重复,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
34.假设成绩有重复的情况下,查询选修「张三」老师所授课程的学生中,成绩最高的学生信息及其成绩
35.查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
36.查询每门功成绩最好的前两名
37.统计每门课程的学生选修人数(超过 5 人的课程才统计)。
38.检索至少选修两门课程的学生学号
39.查询选修了全部课程的学生信息
40.查询各学生的年龄,只按年份来算
41.按照出生日期来算,当前月日 <出生年月的月日则,年龄减一
42.查询本周过生日的学生
43.查询下周过生日的学生
44.查询本月过生日的学生
45.查询下月过生日的学生
详细
1.查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数
理清思路:
(1)学生信息和课程分数分布对应于student表和sc表
所以,我们需要把它们关联起来
(2)需要比较同一学生的不同成绩,所以需要再关联成绩表sc
(3)利用where进行筛选
1.1 查询同时存在" 01 "课程和" 02 "课程的情况
?什么叫做同时存在‘01‘和’02‘课程
?这里是指cid=’01‘ and cid ='02'?
理清思路:同一个学生既选了01课程,又选了02课程
1.2 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )
?如何让不存在某课程时显示为null
利用左关联(left join)
?case when--no
1.3 查询不存在" 01 "课程但存在" 02 "课程的情况
思路:找到不存在01课程的记录后,
然后再进行关联(Inner join)找存在02的课程
或者
2.查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
思路:
成绩在sc表,学生姓名在student表,二者可以通过学生编号sid进行关联。
首先,从sc表中查询平均成绩大于60的学生的信息
ERROR 1111 (HY000): Invalid use of group function
出现这个错就要往group by这里考虑,要记得:group by +having+聚合函数。
一些错误尝试:
成功查询:
接着:通过学生编号sid与student表进行关联
发现结果明显不对,
继续修改:
注意:多个表进行关联时要明确字段的归属表;查询聚合函数的结果时,比如avg(score),最好进行重命名。
存在疑问:
上面两种写法的差别就在于 子查询的avg(score)是否重命名,但是二者的结果明显有差异,想请问是为什么?是不是哪里没注意到?
解答:
mysql对于group by的特殊规定:
如果用了group by,select语句里除了group by后面跟着的列名以外,只能有聚合函数。
如果除了group by后面跟着的列名和聚合函数还有其他列名,sql就会只输出第一行,而且如果是'*',也会只输出第一行记录。
举例说明:
总结:
如果用了group by +聚合函数,那么在查询的时候最好是只查询聚合函数(+group by 后的列名)避免在查询其余字段时只显示一条记录的情况。
注意:聚合函数是一定要查询的。
3.查询在 SC 表存在成绩的学生信息
思路:
(1)首先确定表:sc表和student表
发现名字有重复,
(2)利用group by sid去除重复的学生信息查询,具体如下:
注意:更严谨的写法:
(1)先写查询分组字段的子查询
(2)将(1)中的字段进行嵌套查询
注意:group by是分开写的
4.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null
(1)确定涉及的表的范围:
student,sc
(2)
思路:
修改:
(2)
(3)
也可以考虑先连接在查询,但还是建议上述这种方式。
4.1 查有成绩的学生信息
(1)首先确定使用的表范围
sc和student
(2)首先获得成绩表上的学生id
(3)根据id去查学生信息
?这个和第三题是完全一样的吗
回答:思路基本一致。
参考答案:
思路是:看学生表上的id是否在sc表的id中(即,判断存在)in/exists
5.查询「李」姓老师的数量
6.查询学过「张三」老师授课的同学的信息
(1)四张表都要用到
(2)四个嵌套
有什么简便方法吗?
回答:参考答案也是逐步嵌套查询实现的。
7.查询没有学全所有课程的同学的信息
(1)关键词:‘所有课程’在course表,‘同学信息’在student表,但是二者需要sid进行关联,所以还需要用到sc表
(2)如何筛选'所有课程’??
利用课程数目来进行限定。
a.course表获取总课程数
b.按照sid分组,对sc表中的课程数进行计数
c.接着从sc中筛选出课程数=3的学生sid
d.查询(3)中对应学生sid的学生信息
8.查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息
(1)关键词:
‘至少有一门课’--课程in学号01同学的课程,‘学号01同学的课程’--course表,‘同学信息’--student表
(2)思路:
a. 01同学学习了什么课程
发现01同学三门课程都学了,所以其余学生只要学习的课程数大于0即可。
b. 学号01之外的学生id有哪些
c. 如何查询其余学生的课程信息,比如cid?
利用其余学生的id进行分组再计数,筛选
出次数大于0的学生id,再根据该id进行学生信息的查询。
9.查询和" 01 "号的同学学习的课程 完全相同的其他同学的信息
(1)确定相关表:
’01号同学学习的课程‘-sc表;
’其他同学的信息‘-student表;
(2)思路:
a. 01号同学学习了哪些课程
发现01同学学了三门课,
b.再查询总共有几门课?
所以,总共有3门课,01同学全部学习了,
c. 查询其余学生中学习课程数目为3的学生id
d. 再跟进相应id在student表中查询学生信息
10.查询没学过"张三"老师讲授的任一门课程的学生姓名
(1)确定相关表:
‘张三老师tid’--teacher;
‘张三老师授课cid’--course;
‘被授课的学生sid’--sc;
‘学生姓名sname’--student;
先找出学习过张三老师课程的学习,再not in即可。
(2)思路:
a.从teacher表中查询张三老师的tid
b.从course表中查询张三老师的授课cid
c. 从sc中查询学习cid=02的学生sid
d.利用not in 查询没学过张三老师课程的学生信息
11.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
(1)根据关键字确定相关表:
‘不及格课程数>2’ score<60--sc表,且count(1)>3
'姓名'--student 表
(2)思路:
a. 从sc表查询score小于60的sid,并根据sid分组计数
b.内连接得到不及格课程数目大于等于2的sid,sname以及avg_score
12.检索" 01 "课程分数小于 60,按分数降序排列的学生信息
(1)根据关键词确定相关表:
‘01课程分数小于60’ --sc表
‘学生信息’--student
(2)思路及实现:
a.先从sc表查询01课程分数小于60并按分数降序排列的学生信息
b.根据(1)中的sid从student中查询学生信息
13.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
(1)根据关键词确定相关表
‘平均成绩’--sc表
(2)思路及实现过程:
a. 先按照平均成绩从高到低显示学生sc
还要显示每个学生的每一科目的成绩吗?
回答:是的,给sc表增加一列avg_score。
14.查询各科成绩最高分、最低分和平均分: 以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90 要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
(1)根据关键词确定相关表:
‘成绩’ --sc;
‘课程name’--course;
(2)思路及实现:
a. 按照cid对sc表进行分组,并进行初步聚合函数的查询
b.继续完善
?如何计算各种率
回答:考察条件计数的技巧 case when
修改成题目要求格式:
15.按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺
(1)根据关键词确定相关表:
sc表
(2)思路:
借助赋值变量@i实现
a.原始数据增加一列@rank
b.
没有指定关联条件的inner join (笛卡尔积),每一行都会与之进行关联
注意:
一、不定项选择题(共40题,每小题2.5分,总分100分)1. 数据库管理系统的发展历经了如下那些模型阶段( ACDE )A. 层次模型 B. 结构模型 C. 关系模型D. 网状模型 E.对象模型2. 关系型数据库的核心单元是(B)A. 对象B. 表C. 行 D. 列3. 对于关系型数据库来说,表之间存在下面那些关系( ABC )A. 一对一关系 B. 一对多关系C. 多对多关系 D. 继承关系4. 在SQL中,下面对于数据定义语言(DDL)描述正确的是( D )。A. DDL关心的是数据库中的数据 B. 完成数据的增、删、改、查 *** 作C. 控制对数据库的访问D. 定义数据库的结构5. MySQL是一种(C)数据库管理系统。A. 层次型 B. 网络型C. 关系型 D. 对象型6. SQL中,下列 *** 作有语法错误的是( B )A. AGE IS NOT NULL B. NOT(AGE IS NULL)C. SNAME=‘王五’D. SNAME=‘王%’7. SQL中,下列关于创建、管理数据库的 *** 作语句不正确的是( CDE )A. CREATE DATABASE InstantB. USE Instant C. NEW DATABASE Instant D. Connection InstantE. Delete DATEBASE Instant8. 在MySQL中,不存在的数据类型是(F)。A. INT B. TEXT C. DECIMALD. VARCHAR E. DATETIME F. VARCHAR2 9. 在MySQL中,下列关于创建数据库表的描述正确的是( C )。A. 在创建表时必须设定列的约束B. 在删除表的时候通过外键约束连接在一起的表会被一同删除C. 在创建表时必须设置列类型 D. 通过CREATE TABLE new_t SELECT * FROM old_t复制表的同时,表的约束能够一起被复制到新表中10. 根据数据完整性实施的方法,可以将其分为( ACDF )A. 实体完整性 B. 表完整性 C.域完整性D. 引用完整性 E. 记录完整性F.用户自定义完整性11. 下面关于域完整性的方法,不正确的是( A )。A. 主键约束B. 外键约束C.检查约束D. 非空约束E. 默认值12. 下面关于创建和管理索引正确的描述是( C )。A. 创建索引是为了便于全表扫描B. 索引会加快DELETE、UPDATE和INSERT语句的执行速度C. 索引被用于快速找到想要的记录D. 大量使用索引可以提高数据库的整体性能13. SQL中,“AGE IN(20,22)”的语义是( D )。A. AGE<=22 AND AGE >=20 B. AGE <22 AND AGE >20C. AGE =20 AND AGE =22D. AGE =20 OR AGE =2214. 有一个关系:学生(学号,姓名,系别),规定学号的值域是8个数字组成的字符串,这一规则属于(C)A. 实体完整性约束B. 参照完整性约束C. 用户自定义完整性约束 D. 关键字完整性约束15. 下面SQL是来源于考试成绩表t_exam:学号stuId、科目编号subId、成绩score,考试日期:ex_date。有以下sql,它表示的意思是:( B )Select stu_id,subId,count(*) as xFrom t_examWhere ex_date=’2008-08-08’Group stu_id,subIdHaving count(*)>1 Order by x descA. 找出’2008-08-08’这天某科考试2次及以上的学生记录B. 找出’2008-08-08’这天,某科考试2次及以上的学生记录,考试次数多的放在前面C. 找出’2008-08-08’这天,某科考试2次及以上的学生记录,考试次数少的放在前面D. 根据学号和学科分组,找出每个人考试科数,最后考试次数多的放在前面16. EMP表如下所示,下面哪些SQL语句的返回值为3:( BD )EMP雇员号 雇员名 部门号 工资 001 张山 02 2000010 王宏达 01 1200056 马林生 02 1000101 赵敏04 A. select count(*) from empB. select count(distinct 部门号) from empC. select count(*) from emp group by 雇员号D. select count(工资) from emp17. 下面那一项不是SELECT语句对数据的 *** 作:(D)A. 投影B. 联接C. 并 D. 级联18. 下面关于SQL数据查询 *** 作描述正确的有:( ABD )A. 投影 *** 作是选择对表中的哪些列进行查询 *** 作B. 使用DISTINCT关键字可以过滤查询中重复的记录C. 在模糊查询中,通配符“%”表示匹配单个字符,而“_”表示匹配零个或多个字符D. 在MySQL中使用LIMIT关键字限制从数据库中返回记录的行数19. 在SQL语言中,条件“BETWEEN 20 AND 30”表示年龄在20到30之间,且( A )。A. 包括20岁和30岁B. 不包括20岁和30岁C. 包括20岁,不包括30岁 D. 不包括20岁,包括30岁20. SQL语言中,删除EMP表中全部数据的命令正确的是(C)。A. delete * from emp B. drop table empC. truncate table emp D. 没有正确答案21. 有关索引的说法错误的是( AD )A. 索引的目的是为增加数据 *** 作的速度B. 索引是数据库内部使用的对象C. 索引建立得太多,会降低数据增加删除修改速度D. 只能为一个字段建立索引22. 下列哪个关键字在Select语句中表示所有列( A )A. * B. ALL C. DESC D. DISTINCT23. 在表中设置外键实现的是哪一类数据完整性( B )A. 实体完整性 B. 引用完整性C. 用户定义的完整性 D. 实体完整性、引用完整性和用户定义的完整性24. 下面正确表示Employees表中有多少非NULL的Region列的SQL语句是( B )A. SELECT count(* ) from EmployeesB. SELECT count(ALL Region) from EmployeesC. SELECT count(Distinct Region) from EmployeesD. SELECT sum(ALL Region) from Employees25. 下面可以通过聚合函数的结果来过滤查询结果集的SQL子句是(C)A. WHERE子句 B. GROUP BY子句C. HAVING 子句 D. ORDER BY子句26. t_score(stu_id,sub_id,score),即成绩表(学号,科目编号,成绩)。学生如果某科没有考试,则该科成绩录入null。能够获取各位学生的平均成绩的选项是( A )A. select avg(nvl(socre,0)) from score group by stu_idB. select stu_id,avg(sorce) from scoreC. select stu_id,avg(score) from scoreD. select stu_id,sum(score)/count(score) from score27. 若要求查找S表中,姓名的第一个字为'王'的学生学号和姓名。下面列出的SQL语句中,哪个是正确的(B)A. SELECT Sno,SNAME FROM S WHERE SNAME=′王%′B. SELECT Sno,SNAME FROM S WHERE SNAME LIKE′王%′C. SELECT Sno,SNAME FROM S WHERE SNAME LIKE′王_′D. 全部28. 若要求“查询选修了3门以上课程的学生的学生号”,正确的SQL语句是( B )A. SELECT Sno FROM SC GROUP BY Sno WHERE COUNT(*)>3B. SELECT Sno FROM SC GROUP BY Sno HAVING( COUNT(*)>3)C. SELECT Sno FROM SC ORDER BY Sno WHERE COUNT(*)>3D. SELECT Sno FROM SC ORDER BY Sno HAVING COUNT(*)>= 329. 对下面的查询语句描述正确的是(D)Select StudentID,Name, (select count(*) from StudentExamwhere StudentExam.StudentID = Student.StudentID) as ExamsTakenfrom Studentorder by ExamsTaken descA. 从Student表中查找StudentID和Name,并按照升序排列B. 从Student表中查找StudentID和Name,并按照降序排列C. 从Student表中查找StudentID、Name和考试次数D. 从Student表中查找StudentID、Name,并从StudentExam表中查找与StudentID一致的学生考试次数,并按照降序排列30. 下面题基于学生-课程数据库中的三个基本表:学生信息表:s(sno, sname, sex, age, dept) 主键为sno课程信息表:c(cno, cname, teacher) 主键为cno学生选课信息表:sc(sno, cno, grade) 主键为(sno, cno)“从学生选课信息表中找出无成绩的学生信息”的SQL语句是( C d)A. SELECT * FROM sc WHERE grade=NULLB. SELECT * FROM sc WHERE grade IS ‘ ’C. SELECT * FROM sc WHERE grade IS NULLD. SELECT * FROM sc WHERE grade =‘ ’31. 当子查询返回多行时,可以采用的解决办法是( C )。A. 使用聚合函数 B. Where条件判断C. 使用IN运算符D. 使用Group by进行分组32. 下面关于在子查询中使用运算符描述不正确的是( D )。A. 使用IN运算符用于查找字段值属于某一组值的行B. 使用Exists运算符用于测试子查询是否返回行,如果返回其值就为真C. 使用ALL运算符用于测试子查询结果集的所有行是否满足指定的条件D. 使用Any运算符用于测试子查询结果集中的一行或多行不满足指定的条件33. 下面关于组合查询描述不正确的是(D )。A. 从一个表中获取的数据必须和其它表中的数据具有相同的列数B. 两个表中相对应的列必须具有相同的数据类型C. UNION的结果集列名与第一个SELECT语句的结果集中的列名相同D. UNION的结果集列名与第二个SELECT语句的结果集中的列名相同E. UNION ALL运算符返回每个数据集的所有成员34. 下面关于联接的描述正确的是(A)。A. 内联接使用比较运算符根据每个表共有的列值来匹配两个表中的行B. 左外联接结果集包含从右边的表返回的所有行C. 右外联接结果集包含从左边的表返回的所有行D. 全外联接返回左表和右表中的所有匹配的行35. 下面关于数据库设计过程正确的顺序描述是( C )。A. 需求收集和分析、逻辑设计、物理设计、概念设计B. 概念设计、需求收集和分析、逻辑设计、物理设计C. 需求收集和分析、概念设计、逻辑设计、物理设计D. 需求收集和分析、概念设计、物理设计、逻辑设计36. ER图属于下面哪一种数据库设计模型( B )。A. 物理数据模型B. 概念数据模型C. 逻辑数据模型D. 需求模型37. 非主键必须完全依赖于主键列,这属于下列范式的内容( BC )A. 1NFB. 2NF C. 3NFD. 都没有的38. 如果一个字段的数据必须来源另一个表的主键,那么要在这个字段上建立( B )。A. PK(主键) B. FK(外键) C. UK(唯一键) D. 复合主键39. 根据三个范式的定义,下面哪个选项的设计是正确的( C )职工编号姓名工种车间车间主任1001 李宁车工一车间 周杰1002 王海铣工一车间 周杰1003 赵亮钳工二车间 吴明1001 李宁钳工二车间 吴明A. 员工表、工种表、车间表B. 员工表、工种表、车间表、车间主任表C. 员工表、工种表、车间表、员工工种表、员工车间表D. 以上设计均不正确 40. 下列说法中,哪些是正确的( BD )A. RDBMS是数据库管理系统的简称B. 各行记录都不能重复,是第二范式要求的C. 在数据库设计中一定要满足第三范式D. 索引越多,查询越快,数据更新越慢欢迎分享,转载请注明来源:内存溢出
评论列表(0条)