为了在面试官面前轻松完成手写SQL的面试题,平时多积累技巧

适用人群

SQL很熟练的就不用看了,我这里是偏基础的

平时SQL写的少总结也少的程序员,今天我们一起总结复习下

关键是思路,很多SQL写不出来是因为平时对思路不明确

把常见SQL函数语法套路搞熟悉了,一般需求都不会有问题的

本文章是MYSQL

SQL相关历史文章

【这是我总结的SQL基础】

学生表:Student(SID,Sname,Sage,Ssex)SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别成绩表:score(SID,CID,score) --SID 学生编号,CID 课程编号,score 分数

成绩表

学生表

继续出几个题目大家一起学习下SQL玩法

纵向比较、横向比较、分组、统计、join

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

思路总结:

这是精确查询需求 一般都用内连接 inner join这里比较2个课程的分数,关联一张成绩表不好比较,2张成绩表就容易比较了,原因是关联两张成绩表会让列名增加,在一行数据中去比较成绩分数SQL也容易写了,横向比较思路把两成绩表分别通过条件过滤掉,然后比较分数

2 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩

思路总结:

查所有学生的什么的信息,第一要想到学生表的左连接查询 left join选课总数、所有课程总成绩,要想到统计函数count 、sum统计函数知道后,还要知道group by 分组函数怎么配合统计函数去工作

有了上面的思路基本SQL已经问题不大。

细节注意group by后面一定要跟能分组的列名才行,上面例子能分组的肯定是学生ID,

一个学生ID会对应多个成绩数据,题目也是说要统计学生的什么什么数据情况。

3 查询所有课程都及格60学生情况

第一步 普通左连接

第二部 加分组 统计函数等

比较简单思路

不用HAVING函数一样是可以查处理就SQL难看点,需要嵌套子查询

思路分析:

题目是查所有学生的什么,马上向到学生左连接 left join所有课程都及格,需要统计,统计的维度是学生,因此group by 学生ID,分组学生ID时,请看分数和课程ID都可以统计函数去处理了要所有课程都及格,这里所有课程就3门先写死了 HAVING count(b.CID)=3

4.查询各科成绩最高分、最低分和平均分

需要引入课程表 course

结果

思想分析:

最高、最低、平均,马上想到统计函数们max min avg查询所有成绩,马上想到 成绩表左连接 left join统计函数有了,当然要想到分组维度是课程ID

5 统计各科成绩各分数段人数:课程编号,课程名称, 100-85 , 85-70 , 70-60 , 0-60

思路分析

统计什么,马上统计函数想到 sum查询各科分数段的情况,需要找出范围后统计数量,这里就需要 case when then else end 帮助了,想不到它基本就没好解决思路了利用case把相应范围内分数的数量过滤出来,配合SUM统计总数据统计肯定要分组group by 配合,很明显分组维度是课程

总结

SQL结果不重要,总要的是写SQL过程中想到的思路思路清晰,题目在怎么变化也离开不了SQL的基本知识SQL函数有很多,平时大家多积累吧