分组选择数据

对查询结果进行排序

对查询结果排序

我们知道在 OpenGauss 中从数据表中读取数据都是使用 SELECT 语句。 如果我们需要对读取的语句进行排序,我们就可以使用 Order By 子句来设定你想要按照的字段进行排序并返回结果。

语法:

SELECT 字段名 FROM 表名 ORDER BY 字段名 [ASC[DESC]];

你还可以根据自己的需求添加 WHERELIKE 子句来设置条件,再对结果过进行排序显示。

现有 user 表数据如下:

idnameage
1Tom32
2Nancy18
3Allen24
4Jason23

我们需要查询表中信息,要求按照年龄的升序进行排序:

img

指定排序方向

从上面的查询语句中我们并未看到有任何表示排序方向的关键字,在默认情况下,它是按升序排列的。

  • ASC 升序关键字
  • DESC 降序关键字

img

分组查询

但是在实际开发中一般不会用到,本章节只作为对分组查询的了解。往后继续学习,我们会介绍分组查询与其他查询一起结合使用。

分组查询的单独使用

分组查询的关键字是 Group By,查询的是每个分组中 首次出现的一条记录

语法:

SELECT 字段名 FROM 表名 GROUP BY 字段名;

例如: 现有 user 表数据:

idnamesex
1Tom
2Nancy
3AllenNull
4Jason

我们对表中数据的性别进行分组查询:

img

可以看出,返回了 3 条记录,分别是 sex 字段值为 Null、女、男的记录,查询结果按照 sex 字段中不同的值进行了分类只显示每个分组中的一条记录,意义不大,一般情况下,GROUP BY 都和聚合函数一起使用。

GROUP BY 与 聚合函数

在之前的实训中我们简单的提到过 GROUP BY 关键字,本实训让我们进一步了解 GROUP BY 与聚合函数的使用。

为了完成本关任务,你需要掌握:

  1. GROUP BY与聚合函数的结合使用;
  2. GROUP BYSELECT指定的字段限制。

GROUP BY 与聚合函数的使用

基本格式:

select [聚合函数] 字段名 from 表名
[where 查询条件]
[group by 字段名]

先提供表 Info 结构如下:

categorycountdigest
a5a2002
a2a2001
a11a2001
b10b2003
b6b2002
b3b2001
c9c2005
c9c2004
c8c2003
c7c2002
c4c2001

示例:将表中数据分类并汇总

img

GROUP BYSELECT 指定的字段限制

示例:

select category,sum(count),disgest from info
group by category;

执行后会提示下错误。这就是需要注意的一点,在 select 指定的字段要么就要包含在 Group By 语句的后面,作为分组的依据;要么就要被包含在聚合函数中

使用 HAVING 与 ORDER BY

使用having子句进行分组筛选

简单来说,having 子句用来对分组后的数据进行筛选,即 having 针对查询结果中的列发挥筛选数据作用。因此 having 通常与 Group by 连用。

基本格式:

select [聚合函数] 字段名 from 表名 [where 查询条件] [group by 字段名] [having 字段名 筛选条件]

Info 的数据信息仍如下:

categorycountdigest
a5a2002
a2a2001
a11a2001
b20b2003
b15b2002
b3b2001
c9c2005
c9c2004
c8c2003
c7c2002
c4c2001

示例:查询将表中数据分类后数量大于20的类别信息

img

select 语句中,wheregroup byhaving 子句和聚合函数的执行次序如下:

1.where 子句从数据源中去除不符合条件的数据;

2.然后 group by 子句搜集数据行到各个组中;

3.接着统计函数为各个组计算统计值;

4.最后 having 子句去掉不符合其组搜索条件的各组数据行。

HavingWhere 的区别

where 子句都可以用 having 代替,区别在于 where 过滤行,having 过滤分组;

  • where 子句的作用是在对查询结果进行分组前,将不符合 where 条件的去掉,即在分组之前过滤数据,where 条件中不能包含聚组函数,使用 where 条件过滤出特定的行;
  • having 子句的作用是筛选满足条件的,即在分组之后过滤数据,条件中经常包含聚组函数,使用 having 条件过滤出特定的组,也可以使用多个分组标准进行分组。

having 结合 where 示例:

img

Group ByOrder By

基本格式

select [聚合函数] 字段名 from 表名 [where 查询条件] [group by 字段名] [order by 字段名 排序方向]

示例:(以降序方式输出数据分类的汇总)

img

若分组字段和排序字段一样时,可不需要 order by 关键字,则只需告知排序方向,即可简写成:

img