文章目录
- 创建表格说明
- SQL语言实现查询
-
-
- 1. 查询有3门以上课程是90分以上的学生的学号及(90分以上的)课程数
- 2. 查询张三所选修的课程编号和成绩
- 3. 查询张三选修的课程名称及学分
- 4. 查询每个学生的学号、姓名、选修的课程名及成绩
- 5. 查询所有学生的选课情况,列出学号、姓名、课程号、课程名、成绩、学分。
- 6. 查询所有低于90分的学生成绩记录,并按学号降序排列,列出学号、姓名、课程号、课程名、成绩。
- 7. 查询选修“2”号课程且成绩在90分以上的所有学生的学号、姓名、成绩。
- 8. 查询“DB_DESIGN”的先行课名称。
- 9. 查询同时选修了课程号为“1”、“2”的学生学号。
- 10. 查询计算机系('CS')全体学生的“DB_DESIGN”成绩,列出学号、姓名、课程名、成绩,并按成绩降序排列。
- 11. 查询其他系中比信息系('IS')所有学生年龄都不小的学生姓名及年龄。
- 12. 查询没有选修“1”号课程的学生姓名。
- 13. 查询有3名以上学生选修的课程号。
- 14. 查询“DB_DESIGN”课程没有成绩的学生姓名。
- 15. 查询各门课程的成绩均不低于90分的学生姓名。
- 16. 查询“DB_DESIGN”成绩不低于该门课程平均分的学生姓名。
- 17. 查询各个系男女学生的平均年龄和人数。
- 18. 查询计算机系(CS)总平均成绩最高的学生学号和姓名。
- 19. 查询总平均成绩大于85的学生人数。
- 20. 查询“3”号课成绩比“95002”号同学该门课成绩高的所有学生的学号。
- 21. 查询“2”号课成绩比“3”号课成绩高的所有学生的学号及其“2”号课和“3”号课的成绩。
- 22. 查询有二门以上(含两门)及格课程的学生姓名及其平均成绩。
- 23. 查询各科成绩最高分和最低分,以如下字段形式显示:课程号,最高分,最低分
- 24. 查询最受欢迎的课程的课程号和选课人数
- 25. 查询和“95001”号同学学习的课程完全相同的其他同学的学号和姓名
-
创建表格说明
学生表 (学号,姓名,性别,年龄,所在系)
CREATE TABLE Student (Sno varCHAR(10) NOT NULL UNIQUE, Sname varCHAR(30), Ssex varCHAR(20) check (Ssex='男' or Ssex='女' ), Sage int, Sdept varCHAR(20) );
课程表 (课程号,课程名,先修课程,学分)
create Table Course( Cno varCHAR(10), Cname varCHAR(60), Cpno varCHAR(10), Ccredit int not null, Primary key(Cno), FOREIGN KEY (Cpno) REFERENCES Course(Cno) );
选课表 (学号,课程号,成绩)
CREATE TABLE SC( Sno varCHAR(10), Cno varCHAR(10), Grade int, Primary key (Sno, Cno), FOREIGN KEY (Sno) REFERENCES Student(Sno), FOREIGN KEY (Cno) REFERENCES Course(Cno) );
SQL语言实现查询
1. 查询有3门以上课程是90分以上的学生的学号及(90分以上的)课程数
sc表,限定90分以上并以学号分组,count统计
SELECT sno, count(*)
FROM sc
WHERE grade>90
GROUP BY sno
HAVING count(*) >3;
2. 查询张三所选修的课程编号和成绩
可以将学生表与课程表合并,限定条件查询,对于表内相同的列一定要标注,例如选课表的学号sc.sno,标注方式(表.列),一定记得标注每一个有歧义的,或者自定义命名
select cno, grade
from student, sc
where student.sno=sc.sno
and sname='张三' ;
3. 查询张三选修的课程名称及学分
合并三张表最容易,缺点就是费内存,对于嵌套查询会在下一次训练使用
select cname, ccredit
from student, course, sc
where student.sno=sc.sno
and sc.cno=course.cno
and sname= '张三' ;
4. 查询每个学生的学号、姓名、选修的课程名及成绩
想必很多也知道要合并表输出,但是这里得使用基于学生表的左连接left join(表)on(连接条件)
(或者右连接right join,此时学生表要放右边),基于学生表的左连接可以做到查找出没有选课的学生,仅仅是自然连接会统计不到未选课的,左连接效果更好。
select student.sno,sname,cname,grade
from (student left join sc on student.sno=sc.sno)
left join course on sc.cno=course.cno;
5. 查询所有学生的选课情况,列出学号、姓名、课程号、课程名、成绩、学分。
跟4很像,而这个所有学生,只能用左连接
select student.sno,sname,sc.cno,cname,grade,ccredit
from (student left join sc on student.sno=sc.sno)
left join course on sc.cno=course.cno;
6. 查询所有低于90分的学生成绩记录,并按学号降序排列,列出学号、姓名、课程号、课程名、成绩。
order by …desc降序排列
select student.sno,sname,sc.cno,cname,grade
from student,sc