八、分组

分组跟聚合函数

常用聚合函数

max()    #最大值
min()    #最小值
avg()    #平均值
sum()    #总和
count()  #个数
concat() #拼接
group_concat()  #列转行

使用concat拼接

mysql> select concat(user,"@",host) from mysql.user;
+-------------------------+
| concat(user,"@",host)   |
+-------------------------+
| tz@10.154.0.%           |
| mysql.session@localhost |
| mysql.sys@localhost     |
| root@localhost          |
+-------------------------+

group by
根据group by后面的条件进行分组统计,by后面可以跟一个列或多个列。
参考资料: group by报错

执行过程

  1. 对group by 后面的条件列进行整表排序。
  2. 去重之后假设有多行重复则只能显示第一行。
  3. 为避免只能显示第一行,需要使用聚合函数进行单列或者计算或者统计后再显示。

视频位于6. 第三章 SQL基础应用-3 day04 上节回顾

案例

#统计各个国家的总人口数,以国家分组
USE world
SELECT countrycode ,SUM(population)    FROM  city  GROUP BY countrycode;

#统计中国每个省的总人口数量,以省分组
SELECT district,SUM(Population) FROM city  WHERE countrycode='chn' GROUP BY district;

#统计各个国家的城市数量,以国家分组,使用count函数统计数量
SELECT countrycode,COUNT(id)  FROM city GROUP BY countrycode;

having
后面可以过滤条件
注意:having需要跟在group by后

案例

#统计中国每个省的总人口数,过滤出其中总人口数小于100的省份
SELECT district,SUM(Population)
FROM city
WHERE countrycode='chn'
GROUP BY district
HAVING SUM(Population) < 1000000 ;

limit
只显示前多少行

案例

#查询中国所有城市,并按人口数进行排序(从大到小)
SELECT * FROM city WHERE countrycode='CHN' ORDER BY population DESC;

#统计中国各个省的总人口数并从大到小排序
SELECT district AS 省 ,SUM(Population) AS allPopulation
FROM city
WHERE countrycode='chn'
GROUP BY district
ORDER BY allPopulation DESC ;

#统计中国每个省的人口并找出人口大于500w的省,并按照总人口从大到小排序,只显示前三名
SELECT  district, SUM(population)  FROM  city 
WHERE countrycode='CHN'
GROUP BY district 
HAVING SUM(population)>5000000
ORDER BY SUM(population) DESC
LIMIT 3 ;

#跳过N,显示一共M行
LIMIT N ,M
#跳过5行显示6行 
LIMIT 5,6

#显示前五行后的五行数据
SELECT  district, SUM(population)  FROM  city 
WHERE countrycode='CHN'
GROUP BY district 
HAVING SUM(population)>5000000
ORDER BY SUM(population) DESC
LIMIT 5,5;

#distinct去重
SELECT DISTINCT(countrycode) FROM city;

union all

#查询中国或美国城市的信息
SELECT * FROM city WHERE countrycode IN ('CHN' ,'USA');

#可以改写为
SELECT * FROM city WHERE countrycode='CHN'
UNION ALL
SELECT * FROM city WHERE countrycode='USA'

一般情况下,我们可以将 IN 或者 OR 语句 改写成 UNION ALL,以此来提高性能。
UNION 去重复
UNION ALL 不去重复

学习来自:郭老师博客,老男孩深标DBA课程 第三章

posted @ 2021-02-03 21:53  努力吧阿团  阅读(109)  评论(0编辑  收藏  举报