发现一个SQL教程非常不错,共45道,决定跟着把45道SQL刷完。此题目网上有很多,都是用的一个框架和题干信息,网上搜一下,自己建个本地的数据库,跟着敲即可。我本人使用的是 数据分析—MYSQL经典45题(超经典SQL练习题,做完这些你的SQL就过关了) 去B站搜索相应关键词 即可,公众号能拿到建立本地SQL的脚本。
1-1、查询01课程比02课程成绩高的学生信息及课程分数;
SELECT * FROM student AS a INNER JOIN sc AS b ON a.Sid = b.Sid INNER JOIN sc AS c ON a.sid = c.sid AND b.cid = 01 AND c.cid =02 WHERE b.score >c.score;
1-2、 查询同时存在01课程和02课程的情况
提示:左边是01课程的记录右边是02课程的记录
sid能关联上就是说明01,02课程都有记录,用子查询+inner join
SELECT * FROM (select * from sc where Cid=01) as a INNER JOIN (SELECT * FROM sc WHERE cid=02) AS b ON a.Sid = b.Sid
1-3、查询存在01 课程但是可能不存在02课程的情况(不存在时为null)
# LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。
####法一 SELECT * FROM (select * from sc where Cid=01) as a LEFT JOIN sc AS b ON a.Sid = b.Sid AND b.cid = 02; ####法二 SELECT * FROM sc as a LEFT JOIN sc AS b ON a.Sid = b.Sid WHERE a.Cid = 01;
1-4、查询不存在 01课程 但是存在02课程的情况
提示:找不到01课程后再进行关联找存在02课程,用子 查询找筛选出不存在01课的记录再用关联找存在02课程,
可以用子查询+inner join
FROM (SELECT * FROM sc WHERE SId NOT IN (SELECT SId from sc WHERE sc.CId = 01)) as a
SELECT * FROM (SELECT * FROM sc WHERE SId NOT IN (SELECT SId from sc WHERE sc.CId = 01)) as a INNER JOIN sc as b ON a.SId = b.SId WHERE b.CId = 02;
2-1、查询平均成绩大于等于60分的同学的学生编号和学生姓名的平均成绩
提示:要求查询平均成绩大于等于60分的同学信息,首先确定是在成绩表里面找,找到了这样的同学后,是不是用sid去学生信息表里面关联就可以得到学生的姓名信息,在这里的关键就是找sid
SELECT a.sid,a.Sname,b.avg_score FROM student as a INNER JOIN (SELECT sid,AVG(score) as avg_score FROM SC GROUP BY SId HAVING avg_score>=60) as b on a.sid = b.sid;
3-1、查询在sc表存在成绩的学生信息
提示:成绩表肯定都是有学生的,所以用左关联就可以得到学生的信息。
SELECT b.* FROM ( SELECT SId FROM sc GROUP BY SId) as a LEFT JOIN student as b ON a.SId = b.SId
4-1:查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为null)
解法一:子查询
SELECT a.SId,a.sname,b.counts,b.sums FROM student as a LEFT JOIN (SELECT SId,COUNT(CId) as counts,SUM(score) as sums FROM sc GROUP BY SId) as b ON a.SId