目录:
目录
基本表:
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表
sc表
course表
teacher表
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;
SELECT * FROM sc a INNER JOIN sc b
ON a.sid=b.sid
WHERE a.cid='01' AND b.cid='02';
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;
SELECT a.* FROM student a INNER JOIN sc b
ON a.sid=b.sid
GROUP BY a.sid;
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里不能写*
SELECT COUNT(*) FROM teacher WHERE Tname LIKE '李%';
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='张三';
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);
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的学生编号
与student表连接查询学生的信息。
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
第三步:两张表关联,得到和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表关联
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
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;
SELECT a.* FROM student a INNER JOIN sc b
ON a.sid=b.sid
WHERE cid='01' AND score<60
ORDER BY score DESC;
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
第二部:查询每个学生所有课程的平均成绩
SELECT c.sid,AVG(score) avg_score FROM student c LEFT JOIN sc d ON c.sid=d.sid GROUP BY c.sid
第三步:两表关联并按平均分排序
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;