MySql统计函数COUNT的具体使用详解


Posted in MySQL onAugust 14, 2022

1. COUNT()函数概述

COUNT() 是一个聚合函数,返回指定匹配条件的行数。开发中常用来统计表中数据,全部数据,不为NULL数据,或者去重数据。

2. COUNT()参数说明

COUNT(1):统计不为NULL 的记录。
COUNT(*):统计所有的记录(包括NULL)。

COUNT(字段):统计该"字段"不为NULL 的记录。
1.如果这个字段是定义为not null的话,一行行地从记录里面读出这个字段,判断不能为null,按行累加。
2.如果这个字段定义允许为null的话,判断到有可能是null,还要把值取出来在判断一下,不是null才累加。

COUNT(DISTINCT 字段):统计该"字段"去重且不为NULL 的记录。

-- MySql统计函数count测试
-- 创建用户表,新增测试数据
CREATE TABLE `user` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID主键',
  `name` varchar(64) DEFAULT NULL COMMENT '姓名',
  `sex` varchar(8) DEFAULT NULL COMMENT '性别',
  `age` int(4) DEFAULT NULL COMMENT '年龄',
  `born` date DEFAULT NULL COMMENT '出生日期',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='用户表';

INSERT INTO `category`.`user`(`id`, `name`, `sex`, `age`, `born`) VALUES (1, '%张三%', '男', 22, '2022-04-22');
INSERT INTO `category`.`user`(`id`, `name`, `sex`, `age`, `born`) VALUES (2, '李四', '女', 12, '2022-04-01');
INSERT INTO `category`.`user`(`id`, `name`, `sex`, `age`, `born`) VALUES (3, '王小二', '女', 12, '2022-04-28');
INSERT INTO `category`.`user`(`id`, `name`, `sex`, `age`, `born`) VALUES (4, '赵四', '男', 23, '2022-04-28');
INSERT INTO `category`.`user`(`id`, `name`, `sex`, `age`, `born`) VALUES (5, '', '女', 23, '2022-04-28');
INSERT INTO `category`.`user`(`id`, `name`, `sex`, `age`, `born`) VALUES (6, NULL, '女', 60, '2022-04-28');
INSERT INTO `category`.`user`(`id`, `name`, `sex`, `age`, `born`) VALUES (7, NULL, '女', 61, '2022-04-28');

select * from user;

-- 统计数据:7条数据,统计所有的记录(包括NULL)。
select count(*) from user;

-- 统计数据:7条数据,统计不为NULL 的记录。
select count(1) from user;

-- 统计数据:5条数据,COUNT(字段):统计该"字段"不为NULL 的记录,注意是null不是空''字符串
select count(name) from user;

-- 统计数据:5条数据,COUNT(DISTINCT 字段):统计该"字段"去重且不为NULL 的记录。
select count(distinct name) from user;

3. COUNT()判断存在

SQL不再使用count,而是改用LIMIT 1,让数据库查询时遇到一条就返回,不要再继续查找还有多少条了,业务代码中直接判断是否非空即可。
select 1 from emp LIMIT 1;效率是最高的,尤其是需要limit限制行数,很容易忽略。

-- SQL查找是否"存在"
-- 员工表,存在则进行删除
drop table if EXISTS emp;
create table emp(
    id int unsigned primary key auto_increment,
    empno mediumint unsigned not null default 0,
    empname varchar(20) not null default "",
    job varchar(9) not null default "",
    mgr mediumint unsigned not null default 0,
    hiredate datetime not null,
    sal decimal(7,2) not null,
    comn decimal(7,2) not null,
    depno mediumint unsigned not null default 0
);

-- 新增cehsi数据
测试数据:https://blog.csdn.net/m0_37583655/article/details/124385347

-- cahxun 
select * from emp ;

-- 时间:1.082s,数据:5000000
explain select count(*) from emp;

id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
1	  SIMPLE																																						Select tables optimized away

-- 时间:1.129s,数据:5000000
explain select count(1) from emp;
id	select_type	table	partitions	type	possible_keys	key	key_len	ref	rows	filtered	Extra
1	  SIMPLE																																						Select tables optimized away

-- 时间:1.695s,数据:5000000
explain select 1 from emp;
id	select_type	table	partitions	type	possible_keys	key	          key_len	ref	rows	  filtered	Extra
1	  SIMPLE			emp																		idx_emp_depno		3					4981060		100.00	Using index

-- SQL不再使用count,而是改用LIMIT 1,让数据库查询时遇到一条就返回,不要再继续查找还有多少条了,业务代码中直接判断是否非空即可
-- 时间:0.001s,数据:5000000
explain select 1 from emp LIMIT 1;
id	select_type	table	partitions	type	possible_keys	key	          key_len	ref	rows	  filtered	Extra
1	  SIMPLE			emp																		idx_emp_depno		3					4981060		100.00	Using index

4. COUNT()阿里开发规范

1.【强制】不要使用 count(列名)或 count(常量)来替代 count(),count()是 SQL92 定义的标 准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关. 说明:count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行.

2.【强制】count(distinct col) 计算该列除 NULL 之外的不重复行数,注意 count(distinct col1, col2) 如果其中一列全为 NULL,那么即使另一列有不同的值,也返回为 0.

MySql统计函数COUNT的具体使用详解

 到此这篇关于MySql统计函数COUNT的具体使用详解的文章就介绍到这了,更多相关MySql统计函数COUNT内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL 8.0 Online DDL快速加列的相关总结
Jun 02 MySQL
mysql如何能有效防止删库跑路
Oct 05 MySQL
千万级用户系统SQL调优实战分享
Mar 03 MySQL
MySQL的索引你了解吗
Mar 13 MySQL
分享几个简单MySQL优化小妙招
Mar 31 MySQL
MySQL Server层四个日志的实现
Mar 31 MySQL
为什么MySQL不建议使用SELECT *
Apr 03 MySQL
MySql重置root密码 --skip-grant-tables
Apr 11 MySQL
为什么MySQL8新特性会修改自增主键属性
Apr 18 MySQL
MySQL安装失败的原因及解决步骤
Jun 14 MySQL
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
Jun 14 MySQL
MySQL约束(创建表时的各种条件说明)
Jun 21 MySQL
MySQL 原理与优化之Limit 查询优化
MySQL 原理优化之Group By的优化技巧
Aug 14 #MySQL
mysql函数之截取字符串的实现
Aug 14 #MySQL
MySQL 原理与优化之原数据锁的应用
MySql按时,天,周,月进行数据统计
Aug 14 #MySQL
MySQL中LAG()函数和LEAD()函数的使用
Aug 14 #MySQL
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
Aug 14 #MySQL
You might like
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
2016/05/04 PHP
Yii1.1中通过Sql查询进行的分页操作方法
2017/03/16 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
js加强的经典分页实例
2013/03/15 Javascript
cookie 最近浏览记录(中文escape转码)具体实现
2013/06/08 Javascript
Ajax同步与异步传输的示例代码
2013/11/21 Javascript
js实现俄罗斯方块小游戏分享
2014/01/31 Javascript
JavaScript字符串对象toLowerCase方法入门实例(用于把字母转换为小写)
2014/10/17 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
2015/08/05 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
2015/12/10 Javascript
js实现分割上传大文件
2016/03/09 Javascript
JS中定位 position 的使用实例代码
2017/08/06 Javascript
老生常谈JavaScript面向对象基础与this指向问题
2017/10/16 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
2018/08/24 Javascript
详解关于Vue2.0路由开启keep-alive时需要注意的地方
2018/09/18 Javascript
extract-text-webpack-plugin用法详解
2019/02/14 Javascript
微信小程序 scroll-view 水平滚动实现过程解析
2019/10/12 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
2020/05/23 Javascript
Vue 使用typescript如何优雅的调用swagger API
2020/09/01 Javascript
[49:31]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS BO3 第二场 1月29日
2021/03/11 DOTA
Python挑选文件夹里宽大于300图片的方法
2015/03/05 Python
Python处理JSON时的值报错及编码报错的两则解决实录
2016/06/26 Python
Python实现的文轩网爬虫完整示例
2019/05/16 Python
对Python中画图时候的线类型详解
2019/07/07 Python
Python3 tkinter 实现文件读取及保存功能
2019/09/12 Python
毕业生自荐信
2013/12/14 职场文书
结婚邀请函范文
2014/01/14 职场文书
《莫高窟》教学反思
2014/02/25 职场文书
家长写给老师的建议书
2014/03/13 职场文书
优秀小学生事迹材料
2014/12/26 职场文书
2015迎新晚会开场白
2015/07/17 职场文书
2019年XX公司的晨会制度及流程!
2019/07/23 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书
用python实现监控视频人数统计
2021/05/21 Python
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
2021/06/18 MySQL
HTML中的表单元素介绍
2022/02/28 HTML / CSS