你好,我正在学习SQL,通过写文章的方式整理和输出所学,这是第三篇,主题是汇总分析。
文章分为四个部分:汇总函数、分组、用SQL解决简单问题、对查询结果的处理

汇总函数
汇总函数主要有五个:

我演示一下count(),count()函数经常与关键字distinct一起使用,以去除重复值。

分组
用于分组的语句是group by 和 having,前者是对经过 where 语句筛选出来的行进行分组,后者是对分组结果进行筛选。
先来看group by,它的语法规则是这样的:

它以列名作为分组依据,比如以性别作为分组依据来统计男性学生和女性学生的人数:

也可以用两个或以上的列名来分组

这样讲还是很抽象,我从别处借来了两张图,它们很清楚地展示了各个语句执行的过程:


再看 having
它的语法规则是这样的:

这里所说的条件是指对分组结果进行筛选的条件。比如,接着上一个例子,条件可以是选课数量大于2:

有一个点有必要展开说一下,就是上面这个例子中各个语句的运行顺序:

蓝框中的语句其实都是在筛选行或整理行,之后 select 语句就会对筛选出来的行进行处理,得到想要的结果。
用SQL解决简单问题
这个过程分为三步。第一步,明确问题,拆解问题;第二步,将问题的各个元素放到查询语句中;第三步,写出查询语句。
我用一个例子来说明。问题:查询选课超过两门的学生的学号、姓名以及选课数量。
第一步,明确问题,拆解问题。我按照“想要的结果”和“限制条件”两个纬度来拆解,具体到这个例子就是:

第二步,将问题的各个元素放到查询语句中。

第三步,写出查询语句。

这样做看起来挺繁琐的,对吧?我也觉得,不过它有个很大的好处:我掌握了一个套路,这样无论遇到复杂的问题就通过这种套路来处理,而不需要靠灵感或者苦思冥想,这样可以保证我有稳定的产出。相比这个好处,这点麻烦实在不算什么。
对查询结果进行处理
运行 select 语句得到查询结果之后,还可以对查询结果做进一步处理,比如排序和选取指定数量的行。前者使用 order by 语句,后者使用 limit 语句。
order by 语句的语法规则是这样的:

比如,我对上个例子中的选课数量按升序进行排列:

选课数量相同的学生有不少,还可以对选课数量相同的行进行降序排序

limit 的语法规则是这样的:


最后,借用一张图进行总结:

感谢阅读。