分组跟聚合函数
常用聚合函数
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报错
执行过程
- 对group by 后面的条件列进行整表排序。
- 去重之后假设有多行重复则只能显示第一行。
- 为避免只能显示第一行,需要使用聚合函数进行单列或者计算或者统计后再显示。
视频位于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课程 第三章