mysql count是一个聚合函数,用于返回指定匹配条件的行数;count函数的使用语法如“select count(*) from user;”,表示统计所有的记录,包括NULL。
1. COUNT()函数概述 COUNT() 是一个聚合函数,返回指定匹配条件的行数。开发中常用来统计表中数据,全部数据,不为NULL数据,或者去重数据。 2. COUNT()参数说明 COUNT(1):统计不为NULL 的记录。 COUNT(*):统计所有的记录(包括NULL)。 COUNT(字段):统计该"字段"不为NULL 的记录。 如果这个字段是定义为not null的话,一行行地从记录里面读出这个字段,判断不能为null,按行累加。 如果这个字段定义允许为null的话,判断到有可能是null,还要把值取出来在判断一下,不是null才累加。 COUNT(DISTINCT 字段):统计该"字段"去重且不为NULL 的记录。
--MySql统计函数count测试 --创建用户表,新增测试数据 CREATETABLE`user`( `id`bigint(20)unsignedNOTNULLAUTO_INCREMENTCOMMENT'ID主键', `name`varchar(64)DEFAULTNULLCOMMENT'姓名', `sex`varchar(8)DEFAULTNULLCOMMENT'性别', `age`int(4)DEFAULTNULLCOMMENT'年龄', `born`dateDEFAULTNULLCOMMENT'出生日期', PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8mb4ROW_FORMAT=DYNAMICCOMMENT='用户表';
INSERTINTO`category`.`user`(`id`,`name`,`sex`,`age`,`born`)VALUES(1,'%张三%','男',22,'2022-04-22'); INSERTINTO`category`.`user`(`id`,`name`,`sex`,`age`,`born`)VALUES(2,'李四','女',12,'2022-04-01'); INSERTINTO`category`.`user`(`id`,`name`,`sex`,`age`,`born`)VALUES(3,'王小二','女',12,'2022-04-28'); INSERTINTO`category`.`user`(`id`,`name`,`sex`,`age`,`born`)VALUES(4,'赵四','男',23,'2022-04-28'); INSERTINTO`category`.`user`(`id`,`name`,`sex`,`age`,`born`)VALUES(5,'','女',23,'2022-04-28'); INSERTINTO`category`.`user`(`id`,`name`,`sex`,`age`,`born`)VALUES(6,NULL,'女',60,'2022-04-28'); INSERTINTO`category`.`user`(`id`,`name`,`sex`,`age`,`born`)VALUES(7,NULL,'女',61,'2022-04-28');
select*fromuser;
--统计数据:7条数据,统计所有的记录(包括NULL)。 selectcount(*)fromuser;
--统计数据:7条数据,统计不为NULL的记录。 selectcount(1)fromuser;
--统计数据:5条数据,COUNT(字段):统计该"字段"不为NULL的记录,注意是null不是空''字符串 selectcount(name)fromuser;
--统计数据:5条数据,COUNT(DISTINCT字段):统计该"字段"去重且不为NULL的记录。 selectcount(distinctname)fromuser;
3. COUNT()判断存在 SQL不再使用count,而是改用LIMIT 1,让数据库查询时遇到一条就返回,不要再继续查找还有多少条了,业务代码中直接判断是否非空即可。 select 1 from emp LIMIT 1;效率是最高的,尤其是需要limit限制行数,很容易忽略。 --SQL查找是否"存在" --员工表,存在则进行删除 droptableifEXISTSemp; createtableemp( idintunsignedprimarykeyauto_increment, empnomediumintunsignednotnulldefault0, empnamevarchar(20)notnulldefault"", jobvarchar(9)notnulldefault"", mgrmediumintunsignednotnulldefault0, hiredatedatetimenotnull, saldecimal(7,2)notnull, comndecimal(7,2)notnull, depnomediumintunsignednotnulldefault0 );
--新增cehsi数据 测试数据:https://blog.csdn.net/m0_37583655/article/details/124385347
--cahxun select*fromemp;
--时间:1.082s,数据:5000000 explainselectcount(*)fromemp;
idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra 1SIMPLESelecttablesoptimizedaway
--时间:1.129s,数据:5000000 explainselectcount(1)fromemp; idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra 1SIMPLESelecttablesoptimizedaway
--时间:1.695s,数据:5000000 explainselect1fromemp; idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra 1SIMPLEempidx_emp_depno34981060100.00Usingindex
--SQL不再使用count,而是改用LIMIT1,让数据库查询时遇到一条就返回,不要再继续查找还有多少条了,业务代码中直接判断是否非空即可 --时间:0.001s,数据:5000000 explainselect1fromempLIMIT1; idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra 1SIMPLEempidx_emp_depno34981060100.00Usingindex
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. |