数据库查询题
一、 第一题
有三张表:
学生表(student:studentId,studentName);
课程表(course:courseId,courseName);
选课表(studentcourse:studentId,courseId);
问题:统计出所有学生的选课数量
student:
course:
studentcourse:
SQL(MySQL):
SELECT s.*, IFNULL(cour.count,0) AS COUNT
FROM student s
LEFT JOIN (
SELECT studentId, COUNT(courseId) AS COUNT
FROM studentcourse ss
GROUP BY studentId) cour ON s.studentId = cour.studentId;
查询结果:
运用到的知识点(关键字):count, group by,left join on, ifnull
二、 第二题
1. 有四张表
- 学生表Student
- sid 学号,sname 学生姓名,sage 学生年龄,ssex 学生性别
- 课程表Course
- cid 课程编号,cname 课程名称,tid 教师编号
- 成绩表SC
- sid 学号,cid 课程编号,score 成绩
- 教师表Teacher
- tid 教师编号 tname 教师名字
1. 查询平均成绩大于60分的同学的学号和平均分
思路:
- 先根据学生分组查询平均成绩
- 然后筛选出大于60分的数据
SELECT sid, AVG(score)
FROM sc
GROUP BY sid
HAVING AVG(score) > 60;
使用到的知识点:分组group by,统计函数avg,分组统计函数having
2. 查询所有同学的学号、姓名、选课数、总成绩
思路:
- 对成绩表的课程数量和成绩通过sid进行计数和求和统计
- 学生表左关联上面结果表
SELECT s.sid, s.sname, b.count, b.score
FROM student s
LEFT JOIN (
SELECT sc.sid, COUNT(cid) 'count', SUM(score) 'score'
FROM sc
GROUP BY sid) b ON s.sid = b.sid;
使用到的知识点:聚合函数count、sum,左关联left join on,分组group by
3. 查询姓“李”的老师的个数
SELECT COUNT(tid)
FROM teacher
WHERE tname LIKE '李%';
使用到的知识点:count,like,%
4. 查询没有学过“叶平”老师课程的同学的学号、姓名
思路:
- 查找叶平老师的课程id
- 查询没有选择叶平老师课程的学号 course表
- 根据学号查询学生学号和姓名
SELECT
stu.sid
FROM
student stu
WHERE
stu.sid NOT IN (
SELECT
sc.sid
FROM
teacher t,
course c,
sc sc
WHERE
t.tid = c.tid AND c.cid = sc.cid AND t.tname = '叶平'
);
欢迎有更好方法的程序猿们评论指教