3.SQL基础教程(三)-聚合与排序

本文详细介绍了SQL中对表进行聚合查询的方法,包括COUNT、SUM、AVG、MAX、MIN等函数的使用,GROUPBY子句,以及如何使用DISTINCT、HAVING和ORDERBY子句对查询结果进行分组、筛选和排序。
摘要由CSDN通过智能技术生成

一、对表进行聚合查询

1 聚合函数

用于汇总的函数称为聚合函数:

  • COUNT:计算表中的记录数(行数)
  • SUM: 计算表中数值列中数据的合计值
  • AVG: 计算表中数值列中数据的平均值
  • MAX: 求出表中任意列中数据的最大值
  • MIN: 求出表中任意列中数据的最小值

(1)计算全部数据的行数:COUNT

SELECT COUNT(*)
FROM <表名>;
--输入值为全部列(*)或parameter

【注意】COUNT函数的结果根据参数的不同而不同。COUNT(*)会得到包含NULL的数据 行数,而COUNT()会得到NULL之外的数据行数。  

 (2)计算合计值:SUM

SELECT SUM(<列名>) 
FROM <表名>;

(3)计算平均值:AVG

SELECT AVG(<列名>)
FROM <表名>;

(4)计算最大值和最小值:MAXMIN

SELECT MAX(<列名>), MIN(<列名>)
FROM <表名>;

【注意】MAX/MIN函数几乎适用于所有数据类型的列。SUM/AVG函数只适用于数值类型的列。 

2 使用聚合函数删除重复值(关键字DISTINCT

在聚合函数的参数中使用DISTINCT,可以删除重复数据。 

  • 想要计算值的种类时,可以在COUNT函数的参数中使用DISTINCT
SELECT COUNT (DISTINCT <列名>)
FROM <表名>;

二、对表进行分组

1 GROUP BY子句 

SELECT <列名1>, <列名2>, <列名3>, ……
FROM <表名>
GROUP BY <列名1>, <列名2>, <列名3>, ……;

 【注意】使用GROUP BY子句有以下四个注意点:

  • 只能写在SELECT子句之中
  • GROUP BY子句中不能使用SELECT子句中列的别名
  • GROUP BY子句的聚合结果是无序的
  • WHERE子句中不能使用聚合函数

 2 聚合键中包含NULL的情况

聚合键中包含NULL时,在结果中会以“不确定”行(空行)的形式表现出来。

3 使用WHERE子句时GROUP BY的执行结果

(1)使用WHERE子句和GROUP BY子句进行汇总处理:

SELECT <列名1>, <列名2>, <列名3>, ……
FROM <表名>
WHERE 
GROUP BY <列名1>, <列名2>, <列名3>, ……;

(2)GROUP BY 和 WHERE 并用时 SELECT 语句的执行顺序:

  • FROM → WHERE → GROUP BY → SELECT

4 与聚合函数和GROUP BY子句有关的常见错误 

  • 错误1:把聚合键之外的列名书写在 SELECT 子句之中。
  • 错误2:在GROUP BY子句中写了列的别名。
  • 错误3:误以为GROUP BY子句的结果能排序。
  • 错误4:在WHERE子句中使用聚合函数。

 【注意】只有SELECT子句和HAVING子句(以及ORDER BY子句)中能够使用聚合函数。

三、为聚合结果指定条件

1 HAVING子句 

 WHERE 子句只能指定记录(行)的条件,而不能用来指定组的条件。对集合指定条件就需要使用其他的子句了,此时便可以用 HAVING 子句:

SELECT <列名1>, <列名2>, <列名3>, ……
FROM <表名>
GROUP BY <列名1>, <列名2>, <列名3>, ……
HAVING <分组结果对应的条件>;

使用 HAVING 子句时 SELECT 语句的顺序:

  • SELECT → FROM → WHERE → GROUP BY → HAVING 

【注意】HAVING子句要写在GROUP BY子句之后。

 2 HAVING子句的构成要素

HAVING 子句中 能够使用的 3 种要素如下所示:

  • 常数
  • 聚合函数
  • GROUP BY子句中指定的列名(即聚合键) 

3 相对于HAVING子句, 更适合写在WHERE子句中的条件 

聚合键所对应的条件不应该书写在HAVING子句当中,而应该书写在WHERE子句当中。

四、对查询结果进行排序

 1 ORDER BY子句

SELECT <列名1>, <列名2>, <列名3>, ……
FROM <表名>
ORDER BY <排序基准列1>, <排序基准列2>, ……

子句的书写顺序:

  • SELECT 子句 → FROM 子句 →WHERE 子句 → GROUP BY 子句 → HAVING 子句 → ORDER BY 子句

 2 指定升序或降序

未指定ORDER BY子句中排列顺序时会默认使用升序进行排列。想要降序排列时,可以在列名后面使用 DESC 关键字。 

SELECT <列名1>, <列名2>, <列名3>, ……
FROM <表名>
ORDER BY <排序基准列> DESC;

由于 ASC 和 DESC 这两个关键字是以列为单位指定的,因此可以 同时指定一个列为升序,指定其他列为降序。

3 指定多个排序键

如果想要对该顺序的商品进行更细致的排序的话,就需要再添加一个排序键,在 ORDER BY 子句中同时指定多个排序键。

4 NULL的顺序

使用含有 NULL 的列作为排序键时, NULL 会在结果的开头或末尾汇总显示。

5 在ORDER BY子句中可以使用SELECT子句中定义的别名

SELECT 子句的执行顺序在 GROUP BY 子句之后,ORDER BY 子句之前。

【附】使用 HAVING 子句时 SELECT 语句的顺序:

  • FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY

6 在ORDER BY子句中可以使用SELECT子句中未使用的列和聚合函数 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值