SELECT详解——过滤、聚合、分组、排序、唯一值、分组过滤

DBA 在日常工作中,最常用的就是查询数据语句——SELECT 语句。

本文简单介绍 SELECT 语句的基本语法,包括过滤、聚合、分组、排序、唯一值、分组过滤等。

零、查询

通过 SELECT 语句,查询到了 TBH 表中所有记录的 ZL(坐落)和 SZCC(所在层次),SELECT 语句最简单的格式:

SELECT语句详解

一、过滤

一般而言,在使用 SELECT 语句时,不需要查询所有记录,而是有选择的查询特定的记录,这时就需要用到过滤语句。例如,加入了 WHERE 条件,过滤出所在层次为 1 的记录:

SELECT语句详解

二、聚合

需要查询记录的数量、某字段最大值、某字段最小值、某字段总和、某字段平均值就需要用到聚合函数。

  1. 所在层次为 1 的数量:

SELECT语句详解

  1. 层号最大值:

SELECT语句详解

  1. 层号最小值:

SELECT语句详解

  1. 实测建筑面积总和:

SELECT语句详解

  1. 实测建筑面积平均值:

SELECT语句详解

三、分组

如果需要查询每一层的数量,笨一点的方法,可以用如下语句:

SELECT语句详解

也可以用更简单的分组语句:

SELECT语句详解

在这里,GROUP BY 将各个层号的记录进行了分组,可以通过 COUNT 来查询每一个层号的数量。

需要注意的是,用 GROUP BY 语句查询时,查询的内容只能是 GROUP BY 之后的字段以及其他字段的聚合函数(即 COUNT、MAX、MIN、SUM、AVG),否则语句无法执行。

四、排序

排序就比较容易理解了,是以 ORDER BY 后的字段进行排序的。

先用 GROUP BY 计算出各个层号的数量,然后根据数量排序(省略了顺序关键字 ASC):

SELECT语句详解

也可以用倒序:

SELECT语句详解

以上是 ORDER BY 的聚合函数排序,也支持普通字段排序,支持按多个字段排序,而且能为每个排序字段指定 DESC(倒序)或 ASC(顺序)。

五、多个条件的过滤、分组和排序

过滤、分组和排序是可以用多个条件的,示例如下。

多条件过滤,层号和所在单元均为 1:

SELECT语句详解

多条件分组,根据单元和层号排列组合进行分组:

SELECT语句详解

多条件排序,根据房屋编码、坐落进行排序,优先房屋编码,房屋编码相同的按坐落排序:

SELECT语句详解

六、组合条件查询

过滤(WHERE)、分组(GROUP BY)和排序(ORDER BY)是可以组合进行查询的,两两组合或三个一起用都可以:

SELECT语句详解

七、DISTINCT 唯一值

前文讲过了 SELECT 的分组语句 GROUP BY,如果我只想直到某个字段的唯一值,不需要用分组聚合,就可以用 DISTINCT:

SELECT语句详解

八、HAVING 分组过滤

前文讲过了 SELECT 的分组语句 GROUP BY,如果通过分组得到的结果仍然很多,需要从分组的内容中过滤,怎么办?

例如,需要找到数量大于 1000 的 ch,可以用 HAVING 语句:

SELECT语句详解

注意:HAVING 后只能是 GROUP BY 后的字段或其他字段的聚合函数。

至此,SELECT 的基础语法介绍完毕。最后总结一下:

  • 过滤:WHERE

  • 聚合:COUNT、MAX、MIN、SUM、AVG

  • 分组:GROUP BY

  • 分组过滤:HAVING

  • 排序:ORDER BY [ASC/DESC]

九、执行顺序

需要注意的是,SELECT 语句执行过程中,是有先后顺序的。

按照如下顺序进行执行的:

过滤 → 聚合 → 分组 → 分组过滤 → 排序