SELECT详解——过滤、聚合、分组、排序、唯一值、分组过滤
DBA 在日常工作中,最常用的就是查询数据语句——SELECT 语句。
本文简单介绍 SELECT 语句的基本语法,包括过滤、聚合、分组、排序、唯一值、分组过滤等。
零、查询
通过 SELECT 语句,查询到了 TBH 表中所有记录的 ZL(坐落)和 SZCC(所在层次),SELECT 语句最简单的格式:
一、过滤
一般而言,在使用 SELECT 语句时,不需要查询所有记录,而是有选择的查询特定的记录,这时就需要用到过滤语句。例如,加入了 WHERE 条件,过滤出所在层次为 1 的记录:
二、聚合
需要查询记录的数量、某字段最大值、某字段最小值、某字段总和、某字段平均值就需要用到聚合函数。
- 所在层次为 1 的数量:
- 层号最大值:
- 层号最小值:
- 实测建筑面积总和:
- 实测建筑面积平均值:
三、分组
如果需要查询每一层的数量,笨一点的方法,可以用如下语句:
也可以用更简单的分组语句:
在这里,GROUP BY 将各个层号的记录进行了分组,可以通过 COUNT 来查询每一个层号的数量。
需要注意的是,用 GROUP BY 语句查询时,查询的内容只能是 GROUP BY 之后的字段以及其他字段的聚合函数(即 COUNT、MAX、MIN、SUM、AVG),否则语句无法执行。
四、排序
排序就比较容易理解了,是以 ORDER BY 后的字段进行排序的。
先用 GROUP BY 计算出各个层号的数量,然后根据数量排序(省略了顺序关键字 ASC):
也可以用倒序:
以上是 ORDER BY 的聚合函数排序,也支持普通字段排序,支持按多个字段排序,而且能为每个排序字段指定 DESC(倒序)或 ASC(顺序)。
五、多个条件的过滤、分组和排序
过滤、分组和排序是可以用多个条件的,示例如下。
多条件过滤,层号和所在单元均为 1:
多条件分组,根据单元和层号排列组合进行分组:
多条件排序,根据房屋编码、坐落进行排序,优先房屋编码,房屋编码相同的按坐落排序:
六、组合条件查询
过滤(WHERE)、分组(GROUP BY)和排序(ORDER BY)是可以组合进行查询的,两两组合或三个一起用都可以:
七、DISTINCT 唯一值
前文讲过了 SELECT 的分组语句 GROUP BY,如果我只想直到某个字段的唯一值,不需要用分组聚合,就可以用 DISTINCT:
八、HAVING 分组过滤
前文讲过了 SELECT 的分组语句 GROUP BY,如果通过分组得到的结果仍然很多,需要从分组的内容中过滤,怎么办?
例如,需要找到数量大于 1000 的 ch,可以用 HAVING 语句:
注意:HAVING 后只能是 GROUP BY 后的字段或其他字段的聚合函数。
至此,SELECT 的基础语法介绍完毕。最后总结一下:
过滤:WHERE
聚合:COUNT、MAX、MIN、SUM、AVG
分组:GROUP BY
分组过滤:HAVING
排序:ORDER BY [ASC/DESC]
九、执行顺序
需要注意的是,SELECT 语句执行过程中,是有先后顺序的。
按照如下顺序进行执行的:
过滤 → 聚合 → 分组 → 分组过滤 → 排序