MySQL45道经典题(持续更新)

目录:

目录

基本表:

1.查询01课程比02课程成绩高的学生的信息及课程分数

1.1查询同时存在01课程和02课程的情况

2.查询平均成绩大于等于60分的同学的编号和学生的姓名及平均成绩

3.查询在SC表存在成绩的学生信息

4.查询所有同学的学生编号、学生姓名、选课总数、所有课程总成绩(没有成绩显示null)

5.查询姓李老师的数量

6.查询学过张三老师授课的同学的信息

7.查询没有学全所有课程的同学信息

8.查询至少有一门课与学号为01的同学所学相同的同学的信息

9.查询和01号同学学习的课程完全相同的其他同学的信息

10.查询没学过张三老师讲授的任一门课程的学生姓名

11.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

12.检索01课程分数小于60,按分数降序排序的学生信息

13.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

14.查询各科成绩最高分、最低分和平均分,以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 ,及格为>=60,中等为70-80,优良为80-90,优秀为>=90;要求输出课程号和选修人数,查询结果按人数降序排序,若人数相同,按课程号升序排序。


基本表:

                                                                                    student表

MySQL45道经典题(持续更新)_第1张图片

                                                                                         sc表

MySQL45道经典题(持续更新)_第2张图片

                                                                                      course表

                                                                                     teacher表

1.查询01课程比02课程成绩高的学生的信息及课程分数

SELECT * FROM student a LEFT JOIN sc b
	ON a.sid=b.sid
INNER JOIN sc c
	ON b.sid=c.sid AND b.cid!=c.cid
WHERE b.cid='01' AND c.cid='02' AND b.score>c.score;

1.1查询同时存在01课程和02课程的情况

SELECT * FROM sc a INNER JOIN sc b
	ON a.sid=b.sid
WHERE a.cid='01' AND b.cid='02';

2.查询平均成绩大于等于60分的同学的编号和学生的姓名及平均成绩

SELECT a.sid,sname,AVG(score) 
FROM student a INNER JOIN sc b 
	ON a.sid=b.sid
WHERE b.score>=60
GROUP BY sid;
或者
SELECT a.sid,sname,AVG(score) 
FROM student a INNER JOIN sc b 
	ON a.sid=b.sid
GROUP BY sid HAVING AVG(score)>=60;

3.查询在SC表存在成绩的学生信息

SELECT a.* FROM student a INNER JOIN sc b
	ON a.sid=b.sid
GROUP BY a.sid;

4.查询所有同学的学生编号、学生姓名、选课总数、所有课程总成绩(没有成绩显示null)

SELECT a.sid,a.sname,COUNT(cid),SUM(score)
FROM student a LEFT JOIN sc b
	ON a.sid=b.sid
GROUP BY sid;

注意:这里的count里不能写*

5.查询姓李老师的数量

SELECT COUNT(*) FROM teacher WHERE Tname LIKE '李%';

6.查询学过张三老师授课的同学的信息

SELECT a.* FROM student a INNER JOIN sc b
	ON a.sid=b.sid
WHERE b.cid=
(SELECT cid FROM course c INNER JOIN teacher t
	ON c.tid=t.tid
WHERE t.tname='张三');
或者
SELECT a.* FROM student a,sc b,course c,teacher d
WHERE a.sid=b.sid AND b.cid=c.cid AND c.tid=d.tid
AND d.tname='张三';

7.查询没有学全所有课程的同学信息

SELECT * FROM student a LEFT JOIN sc b
	ON a.sid=b.sid
GROUP BY a.sid HAVING COUNT(b.cid)<
(SELECT COUNT(cid) FROM course);

8.查询至少有一门课与学号为01的同学所学相同的同学的信息

SELECT * FROM student a INNER JOIN 
(SELECT * FROM sc WHERE cid IN 
(SELECT cid FROM sc WHERE sid='01') 
GROUP BY sid) b
ON a.sid=b.sid;

SELECT cid FROM sc WHERE sid='01';

查询出来01学过的课程为(01,02,03)

SELECT * FROM sc WHERE cid IN (SELECT cid FROM sc WHERE sid='01');

列子查询查找满足01或02或03的学生编号

MySQL45道经典题(持续更新)_第3张图片

与student表连接查询学生的信息。

9.查询和01号同学学习的课程完全相同的其他同学的信息

SELECT c.* FROM student c INNER JOIN
(SELECT a.* FROM
(SELECT sid,GROUP_CONCAT(cid ORDER BY cid) courses FROM sc
GROUP BY sid) a
INNER JOIN
(SELECT sid,GROUP_CONCAT(cid ORDER BY cid) courses FROM sc 
GROUP BY sid HAVING sid='01') b
ON a.courses=b.courses AND a.sid!='01') d
ON c.sid=d.sid;

第一步:查询01号学生所学的全部课程,在一行显示

SELECT sid,GROUP_CONCAT(cid ORDER BY cid) courses FROM sc GROUP BY sid HAVING sid='01'

第二部:查询所有学生所学的全部课程,也在一行显示

SELECT sid,GROUP_CONCAT(cid ORDER BY cid) courses FROM sc GROUP BY sid

MySQL45道经典题(持续更新)_第4张图片

第三步:两张表关联,得到和01号所有课程相同的学生的学号

SELECT a.* FROM

(SELECT sid,GROUP_CONCAT(cid ORDER BY cid) courses FROM sc GROUP BY sid) a

INNER JOIN

(SELECT sid,GROUP_CONCAT(cid ORDER BY cid) courses FROM sc GROUP BY sid HAVING sid='01') b

ON a.courses=b.courses AND a.sid!='01'

第四步:与student表关联

10.查询没学过张三老师讲授的任一门课程的学生姓名

SELECT * FROM student WHERE sid NOT IN
(SELECT sid FROM sc 
WHERE cid IN 
(SELECT cid FROM course a INNER JOIN teacher b
ON a.tid=b.tid 
WHERE tname='张三'));

SELECT sid FROM sc WHERE cid IN 

(SELECT cid FROM course a INNER JOIN teacher b ON a.tid=b.tid WHERE tname='张三')

查询学过张三老师的课程的同学的学号

没学过就是NOT IN 

MySQL45道经典题(持续更新)_第5张图片

11.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

SELECT a.sid,sname,AVG(score) 
FROM student a INNER JOIN sc b
ON a.sid=b.sid WHERE score<60 
GROUP BY sid HAVING COUNT(cid)>=2;

12.检索01课程分数小于60,按分数降序排序的学生信息

SELECT a.* FROM student a INNER JOIN sc b
ON a.sid=b.sid 
WHERE cid='01' AND score<60
ORDER BY score DESC;

13.按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

SELECT * FROM
(SELECT a.sid,a.sname,b.cid,b.score FROM student a LEFT JOIN sc b
ON a.sid=b.sid) e
INNER JOIN
(SELECT c.sid,AVG(score) avg_score FROM student c LEFT JOIN sc d
ON c.sid=d.sid GROUP BY c.sid) f
ON e.sid=f.sid
ORDER BY avg_score DESC;

第一步:查询每个学生所有课程的成绩

SELECT a.sid,a.sname,b.cid,b.score FROM student a LEFT JOIN sc b ON a.sid=b.sid

MySQL45道经典题(持续更新)_第6张图片

第二部:查询每个学生所有课程的平均成绩

SELECT c.sid,AVG(score) avg_score FROM student c LEFT JOIN sc d ON c.sid=d.sid GROUP BY c.sid

MySQL45道经典题(持续更新)_第7张图片

第三步:两表关联并按平均分排序

MySQL45道经典题(持续更新)_第8张图片

14.查询各科成绩最高分、最低分和平均分,以如下形式显示:
课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率 ,
及格为>=60,中等为70-80,优良为80-90,优秀为>=90;
要求输出课程号和选修人数,查询结果按人数降序排序,若人数相同,按课程号升序排序。

SELECT 
cid 课程编号,
COUNT(sid) 选课人数,
MAX(score) 最高分,
MIN(score) 最低分,
AVG(score) 平均分,
SUM(CASE WHEN score>=60 THEN 1 ELSE 0 END)/COUNT(*) 及格率,
SUM(CASE WHEN score>=70 AND score<80 THEN 1 ELSE 0 END)/COUNT(*) 中等率,
SUM(CASE WHEN score>=80 AND score<90 THEN 1 ELSE 0 END)/COUNT(*) 优良率,
SUM(CASE WHEN score>=90 THEN 1 ELSE 0 END)/COUNT(*) 优秀率
FROM sc 
GROUP BY cid 
ORDER BY COUNT(sid) DESC,cid;

 

 

 

 

你可能感兴趣的:(学习笔记)