扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
▲ count(*)
创新互联专注于乐都网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供乐都营销型网站建设,乐都网站制作、乐都网页设计、乐都网站官网定制、小程序开发服务,打造乐都网络公司原创品牌,更为您提供乐都网站排名全网营销落地服务。
统计查询结果集返回的行数.
▲ count(ve)
统计值表达式返回的非空值的个数.
▲ count(distinct ve)
统计值表达式返回的非空不同值的个数.
▲ sum(ve)
统计值表达式返回的非空值的和.
▲ sum(distinct ve)
统计值表达式返回的非空不同值的和.
▲ avg(ve)
统计值表达式返回的非空值的平均值.
▲ avg(distinct ve)
统计值表达式返回的非空不同值的平均值.
▲ max(ve)
统计值表达式返回的非空值的最大值.
▲ min(ve)
统计值表达式返回的非空值的最小值.
由group by子句来实现的.
语法:
(1)分组的引入
(2)分组定义
指定某列或某些列作为划分的依据,比较这些列值是否相同,具有相同列值的行放在同一组,这样就可以将最初的结果集划分为若干个子集,每个子集称为一个分组.
一般来说有多少个不同的列值就可以分为多少组.
语法:
指定某列或计算列作为统计的对象,将统计函数作用在该对象上,统计函数按照分组自动对每一分组的列值进行统计,每一分组返回一个统计后的结果.
(1)MYSQL对GROUP BY的非ANSI标准扩展
是由having子句来实现的.
语法:
(1)having子句中的子查询
/*语法:
select 分组函数 列(要求出现在group by的后面)
from 表
【where 筛选条件】
group by 分组的列表
[order by 子句]
注意:查询列表必须特殊,要求是分组函数和group by 后出现的字段
特点:
1.分组查询中筛选条件分为两类:
数据源 位置 关键字
分组前筛选 原始表 group by子句的前面 where
分组后筛选 分组后的结果集 group by子句的后面 having
1.分组函数做条件肯定是放在having子句中
2.能用分组前筛选的,优先考虑使用分组前筛选
2.group by 子句支持单个字段、多个字段分组(用逗号隔开没有顺序要求)表达式或函数(用的较少)
3.也可以添加排序(放在整个group by子句之后)
*/
count(1),其实就是计算一共有多少符合条件的行。
1并不是表示第一个字段,而是表示一个固定值。
其实就可以想成表中有这么一个字段,这个字段就是固定值1,count(1),就是计算一共有多少个1.
同理,count(2),也可以,得到的值完全一样,count('x'),count('y')都是可以的。一样的理解方式。在你这个语句理都可以使用,返回的值完全是一样的。就是计数。
count(*),执行时会把星号翻译成字段的具体名字,效果也是一样的,不过多了一个翻译的动作,比固定值的方式效率稍微低一些。
mysql
与
oracle
中分组、聚合函数的区别!
今天需要这样一句
sql
:先用
group by
进行分组,然后利用聚合函数
count
或者
sum
进行计算,并显示
其它的辅助信息。
在
mysql
环境中,我模拟如下环境:
CREATE TABLE `room` (
`rid` varchar(5) default NULL,
`rname` varchar(5) default NULL,
`pid` int(11) default NULL,
`seq` int(11) NOT NULL auto_increment,
PRIMARY KEY
(`seq`)
) ENGINE=InnoDB DEFAULT
CHARSET=utf8
房间表,
seq
房间入住序号
(主键)
,
rname
为房间名,这里不考虑第三范式
情景:人住房间,
统计某个房间某个人住的次数
用户表,客人的信息
查询每门科目的前3名。
对于查询的结果,一般有两种情况。
表所有数据为:
情况1:对于分数相同的人,其后面的人 紧跟着名次排,直到排够名次3,就不再往后取了。
情况2:对于分数相同的人,若当前相同名次的人数大于或等于 3, 则相同分数其后面的人不再参于top3了。
在情况2中 ,为什么”李四 - java“ 这行没有了呢?
可以这样理解,在情况2中相当于使用了 名次空缺 , 分数相同的人其后面那个人,的名次为 前面的人数+1 , 这里的 ”李四-java“这行,他的名次应当是 5 , 所有top3自然取不到 ”李四-java“这行。
情况2和情况 写法都是对应的, 需要注意的是 并列名次,后面的人 是否需要保持名次空缺。那么统计的时候就需要根据情况去重。
参考链接:
当用select*from 表名 group by ‘字段名1’ 将选出来的内容将按照字段1分组,其他列不尽相同,会以最前面的内容显示:
GROUP BY 后面可以跟多个列名,表示以多列作为分组依据:
mysql select `name`,`date`,count(*) from `employee_tbl` group by `name`,date;
+------+---------------------+----------+
| name | date | count(*) |
+------+---------------------+----------+
| 小丽 | 2016-04-19 15:26:02 | 1 |
| 小明 | 2016-04-04 15:26:54 | 1 |
| 小明 | 2016-04-11 15:26:40 | 1 |
| 小明 | 2016-04-22 15:25:33 | 1 |
| 小王 | 2016-04-07 15:26:14 | 1 |
| 小王 | 2016-04-20 15:25:47 | 1 |
+------+---------------------+----------+
6 rows in set (0.05 sec)
group by 后可以跟with rollup,表示在进行分组统计的基础上再次进行汇总统计(在每个分组下都会有统计汇总):
mysql select*from r;
+------+-----+------+
| name | cat | fish |
+------+-----+------+
| 小明 | x | 1 |
| 小明 | x | 2 |
| 小明 | x | 4 |
| 小明 | y | 2 |
| 小明 | y | 2 |
| 小明 | z | 1 |
| 小红 | x | 1 |
| 小红 | x | 3 |
| 小红 | y | 1 |
| 小红 | y | 2 |
| 小青 | y | 3 |
| 小青 | z | 2 |
| 小青 | z | 1 |
+------+-----+------+
13 rows in set (0.05 sec)
mysql select name,cat,fish,count(*) from r group by name with rollup;
+------+-----+------+----------+
| name | cat | fish | count(*) |
+------+-----+------+----------+
| 小红 | x | 1 | 4 |
| 小明 | x | 1 | 6 |
| 小青 | y | 3 | 3 |
| NULL | y | 3 | 13 |
+------+-----+------+----------+
4 rows in set (0.05 sec)
mysql select name,cat,fish,count(*) from r group by name,cat with rollup;
+------+------+------+----------+
| name | cat | fish | count(*) |
+------+------+------+----------+
| 小红 | x | 1 | 2 |
| 小红 | y | 1 | 2 |
| 小红 | NULL | 1 | 4 |
| 小明 | x | 1 | 3 |
| 小明 | y | 2 | 2 |
| 小明 | z | 1 | 1 |
| 小明 | NULL | 1 | 6 |
| 小青 | y | 3 | 1 |
| 小青 | z | 2 | 2 |
| 小青 | NULL | 2 | 3 |
| NULL | NULL | 2 | 13 |
+------+------+------+----------+
11 rows in set (0.06 sec)
mysql select name,cat,fish,count(*) from r group by name,cat,fish with rollup;
+------+------+------+----------+
| name | cat | fish | count(*) |
+------+------+------+----------+
| 小红 | x | 1 | 1 |
| 小红 | x | 3 | 1 |
| 小红 | x | NULL | 2 |
| 小红 | y | 1 | 1 |
| 小红 | y | 2 | 1 |
| 小红 | y | NULL | 2 |
| 小红 | NULL | NULL | 4 |
| 小明 | x | 1 | 1 |
| 小明 | x | 2 | 1 |
| 小明 | x | 4 | 1 |
| 小明 | x | NULL | 3 |
| 小明 | y | 2 | 2 |
| 小明 | y | NULL | 2 |
| 小明 | z | 1 | 1 |
| 小明 | z | NULL | 1 |
| 小明 | NULL | NULL | 6 |
| 小青 | y | 3 | 1 |
| 小青 | y | NULL | 1 |
| 小青 | z | 1 | 1 |
| 小青 | z | 2 | 1 |
| 小青 | z | NULL | 2 |
| 小青 | NULL | NULL | 3 |
| NULL | NULL | NULL | 13 |
+------+------+------+----------+
23 rows in set (0.07 sec)
mysql select name,cat,fish,sum(fish) from r group by name with rollup;
+------+-----+------+-----------+
| name | cat | fish | sum(fish) |
+------+-----+------+-----------+
| 小红 | x | 1 | 7 |
| 小明 | x | 1 | 12 |
| 小青 | y | 3 | 6 |
| NULL | y | 3 | 25 |
+------+-----+------+-----------+
4 rows in set (0.05 sec)
mysql select name,cat,fish,sum(fish) from r group by name,cat with rollup;
+------+------+------+-----------+
| name | cat | fish | sum(fish) |
+------+------+------+-----------+
| 小红 | x | 1 | 4 |
| 小红 | y | 1 | 3 |
| 小红 | NULL | 1 | 7 |
| 小明 | x | 1 | 7 |
| 小明 | y | 2 | 4 |
| 小明 | z | 1 | 1 |
| 小明 | NULL | 1 | 12 |
| 小青 | y | 3 | 3 |
| 小青 | z | 2 | 3 |
| 小青 | NULL | 2 | 6 |
| NULL | NULL | 2 | 25 |
+------+------+------+-----------+
11 rows in set (0.06 sec)
mysql select name,cat,fish,sum(fish) from r group by name,cat,fish with rollup;
+------+------+------+-----------+
| name | cat | fish | sum(fish) |
+------+------+------+-----------+
| 小红 | x | 1 | 1 |
| 小红 | x | 3 | 3 |
| 小红 | x | NULL | 4 |
| 小红 | y | 1 | 1 |
| 小红 | y | 2 | 2 |
| 小红 | y | NULL | 3 |
| 小红 | NULL | NULL | 7 |
| 小明 | x | 1 | 1 |
| 小明 | x | 2 | 2 |
| 小明 | x | 4 | 4 |
| 小明 | x | NULL | 7 |
| 小明 | y | 2 | 4 |
| 小明 | y | NULL | 4 |
| 小明 | z | 1 | 1 |
| 小明 | z | NULL | 1 |
| 小明 | NULL | NULL | 12 |
| 小青 | y | 3 | 3 |
| 小青 | y | NULL | 3 |
| 小青 | z | 1 | 1 |
| 小青 | z | 2 | 2 |
| 小青 | z | NULL | 3 |
| 小青 | NULL | NULL | 6 |
| NULL | NULL | NULL | 25 |
+------+------+------+-----------+
23 rows in set (0.07 sec)
————————————————
MySQL中使用 GROUP BY 对数据进行分组,GROUP BY从字面意义上理解就是根据'BY'指定的规则对数据进行分组, 所谓分组就是将一个'数据集'划分成若干个'子区域',然后针对若干个'小区域'进行数据处理 。基本语法形式为:
字段值为进行分组时所依据的列名称, “HAVING 条件表达式” 指定满足表达式限定条件的结果将被显示。
GROUP BY关键字通常和集合函数一起使用,例如:MAX()、MIN()、COUNT()、SUM()、AVG()。即把数据分为多个逻辑组,并对每个组进行集合计算。
WHERE 子句过滤行,在数据分组前过滤;HAVING 子句过滤分组,在数据分组后过滤。WHERE排除的行不包括在分组里,且HAVING支持所有WHERE操作符。
使用GROUP BY可以对多个字段进行分组,根据多字段的值来进行层次分组,分组从左到右。
注意事项:
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流