阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Mariadb学习总结(八):聚合函数及分组查询

7次阅读
没有评论

共计 3556 个字符,预计需要花费 9 分钟才能阅读完成。

聚合函数

当我们需要汇总表中的数据而不是使用表中某一行数据时,可以使用 Mysql 为我们提供的聚合函数,在 Mysql 中,常用的聚合函数有以下五个:

  1. AVG:取平均值
  2. COUNT:取统计值
  3. MAX:取最大值
  4. MIN:取最小值
  5. SUM:取和值
1. 获得表中人口的总和
MariaDB [world]> SELECT SUM(Population) FROM city;
+-----------------+
| SUM(Population) |
+-----------------+
|      1429559884 |
+-----------------+
1 row in set (0.01 sec)
2. 获得数据表中中国的总人口
MariaDB [world]> SELECT SUM(Population) FROM city WHERE CountryCOde='CHN';
+-----------------+
| SUM(Population) |
+-----------------+
|       175953614 |
+-----------------+
1 row in set (0.00 sec)
3. 查询中国有多少个城市
MariaDB [world]> SELECT COUNT(ID) FROM city WHERE CountryCode =  'CHN';
+-----------+
| COUNT(id) |
+-----------+
|       363 |
+-----------+
1 row in set (0.00 sec)

关于 COUNT,如果要统计有该表有多少行,千万别用 * 作为参数,因为~ 影响性能,选某一列就好了。

4. 查询中国人口最少的城市的人口是多少
MariaDB [world]> SELECT MIN(Population) FROM city WHERE CountryCode = 'CHN';
+-----------------+
| MIN(Population) |
+-----------------+
|           89288 |
+-----------------+
1 row in set (0.00 sec)
5. 查询中国人口最多的城市的人口
MariaDB [world]> SELECT MAX(Population) FROM city WHERE CountryCode = 'CHN';
+-----------------+
| MAX(Population) |
+-----------------+
|         9696300 |
+-----------------+
1 row in set (0.00 sec)
6. 查询河南各城市的平均人口
MariaDB [world]> SELECT AVG(Population) FROM city WHERE District ='Henan';
+-----------------+
| AVG(Population) |
+-----------------+
|     383278.3333 |
+-----------------+
1 row in set (0.00 sec)

所以,我们看到,聚合函数通常用于数值上的计算。

分组查询

以上,我们使用聚合函数时,是对所有 SELECT 的数据进行分组操作,假如我们想要查询所有国家的城市数,不得不多次使用 WHERE 对 CountryCode 进行筛选。

MariaDB [world]> SELECT DISTINCT CountryCode FROM city;
+-------------+
| CountryCode |
+-------------+
| ABW         |
| AFG         |
...............
| ZWE         |
+-------------+
232 rows in set (0.00 sec)

我们看到,在我们的数据表中,有 232 个国家,那么?是不是需要我们对这 232 个不同国家都使用一次 COUNT(ID)才能统计每个国家的城市数量呢?其实不然。

我们可以使用分组查询 GROUP BY,什么叫分组呢?分组查询就是使用指定的一列或多列,对数据进行逻辑分组(当分组依据相同时被划分为一组),假设有如下数据:

MariaDB [world]> SELECT * FROM city LIMIT 5;
+----+----------------+-------------+---------------+------------+
| ID | Name           | CountryCode | District      | Population |
+----+----------------+-------------+---------------+------------+
|  1 | Kabul          | AFG         | Kabol         |    1780000 |
|  2 | Qandahar       | AFG         | Qandahar      |     237500 |
|  3 | Herat          | AFG         | Herat         |     186800 |
|  4 | Mazar-e-Sharif | AFG         | Balkh         |     127800 |
|  5 | Amsterdam      | NLD         | Noord-Holland |     731200 |
+----+----------------+-------------+---------------+------------+
5 rows in set (0.00 sec)

我们使用 GROUP BY CountryCode 就是指定 CountryCode 作为分组依据,所以 1,2,3,4 行他们被分为同一组,而 5 在另一个组。

  1. 通常分组是配合聚合函数来使用的,聚合函数对每个单独的逻辑分组进行汇总计算。
  2. GROUP BY 子句中列出的每一列都必须是检索列或有效的表达式(但不能是聚合函数),如果在 SELECT 中使用表达式,则必须在 GROUP BY 子句中指定相同的表达式,且不能使用别名。
  3. 除聚合函数外,SELECT 语句中的每一列都必须在 GROUP BY 子句中给出。
  4. 如果分组中包含具有 NULL 值的行,则 NULL 将作为一个分组返回。
  5. GROUP BY 子句必须出现在 WHERE 子句之后,ORDER BY 子句之前。
1. 查询各个国家的城市数量
MariaDB [world]> SELECT CountryCode,COUNT(ID) FROM city GROUP BY CountryCode;
+-------------+-----------+
| CountryCode | COUNT(ID) |
+-------------+-----------+
| ABW         |         1 |
| AFG         |         4 |
...........................
| ZMB         |         7 |
| ZWE         |         6 |
+-------------+-----------+
232 rows in set (0.00 sec)

当 SELECT 语句中使用 WHERE 子句时,WHERE 子句总在分组前进行过滤。

2. 查询各个国家人口大于 1000000 的城市数量
MariaDB [world]> SELECT CountryCode,COUNT(ID) FROM city WHERE Population >= 1000000 GROUPP BY CountryCode;
+-------------+-----------+
| CountryCode | COUNT(ID) |
+-------------+-----------+
| AFG         |         1 |
| AGO         |         1 |
| ARG         |         3 |
| ARM         |         1 |
| AUS         |         4 |
...........................
| YUG         |         1 |
| ZAF         |         1 |
| ZMB         |         1 |
| ZWE         |         1 |
+-------------+-----------+
77 rows in set (0.01 sec)

所以在分组中未出现的国家,没有 1000000 人口的城市。

3. 查询总人口大于 1000000 的国家有哪些

HAVING 子句用于过滤 分组后所得到汇总值的数据,而 HAVING 支持的操作和 WHERE 子句是相同的。

例如:

MariaDB [world]> SELECT CountryCode,SUM(Population) AS Total_Population FROM city GROUP BY CountryCode HAVING Total_Population > 1000000;
+-------------+------------------+
| CountryCode | Total_Population |
+-------------+------------------+
| AFG         |          2332100 |
| AGO         |          2561600 |
| ARE         |          1728336 |
..................................
| ZAF         |         15196370 |
| ZMB         |          2473500 |
| ZWE         |          2730420 |
+-------------+------------------+
108 rows in set (0.00 sec)

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-12-30发表,共计3556字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中