为了在面试官面前轻松完成手写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的面试题,平时多积累技巧

学生表

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

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

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

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

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

思路总结:

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

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

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

思路总结:

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

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

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

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

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

第一步 普通左连接

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

第二部 加分组 统计函数等

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

比较简单思路

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

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

思路分析:

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

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

需要引入课程表 course

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

结果

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

思想分析:

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

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

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

思路分析

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

总结

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


分享到:


相關文章: