MySql统计函数COUNT详解

  • 1. COUNT()函数概述
  • 2. COUNT()参数说明
  • 3. COUNT()判断存在
  • 4. COUNT()阿里开发规范

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详解相关推荐

  1. MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)

    MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测) 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过 ...

  2. Mysql存储引擎详解(MyISAM与InnoDB的区别)

    Mysql存储引擎详解(MyISAM与InnoDB的区别) 存储引擎     MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平 ...

  3. Mysql加锁过程详解(2)-关于mysql 幻读理解

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  4. 数据库mysql_row_MYSQL数据库mysql found_row()使用详解

    <MYSQL数据库mysql found_row()使用详解>要点: 本文介绍了MYSQL数据库mysql found_row()使用详解,希望对您有用.如果有疑问,可以联系我们. mys ...

  5. MYSQL performance schema详解

    MYSQL performance schema详解 0.performance_schema的介绍 ​ MySQL的performance schema 用于监控MySQL server在一个较低级 ...

  6. 如何查看mysql数据库的引擎/MySQL数据库引擎详解

    一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看: 看你的mysql现在已提供什么存储引擎: mysql> show engines; 看你的mysql当前默认的存储引擎: m ...

  7. MySQL 视图(详解) navicat如何创建视图

    文章目录 MySQL 视图(详解 一,视图概念 使用视图的原因 二,创建视图 (1)基本语法 (2)创建基于单表的视图 [实例 1] [实例 2] (3)创建基于多表的视图 [实例 3] (4)查询视 ...

  8. Mysql之explain详解(超级全面)

    Mysql之explain详解(超级全面) 概念 explain能干嘛? 如何使用 输出字段解释 id(表的读取顺序) id相同,执行顺序由上至下 id不同,如果是子查询,id的序号会递增,id值越大 ...

  9. Mysql加锁过程详解(3)-关于mysql 幻读理解

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  10. mysql status改变_mysql 配置详解mysql SHOW STATUS 详解

    1. back_log 指定MySQL可能的连接数量.当MySQL主线程在很短的时间内得到非常多的连接请求,该参数就起作用,之后主线程花些时间(尽管很短)检查连接并且启动一个新线程. back_log ...

最新文章

  1. AI解梦成为现实 未来还有无限可能
  2. mysql pricing amp; licensing_Global Pricing and Licensing
  3. Cannot connect to database because the database client
  4. 【opencv有趣应用】opencv + YOLOV3 + COCO数据集的简单应用
  5. 获得勾选框 html,是否可以在HTML中选中或未选中的勾选框中收集数据?
  6. STM32工作笔记0009---认识FSMC和TTL电路
  7. matlab数据分类与识别,Matlab图像识别/检索系列(3)—10行代码完成caltech图象集分类和识别...
  8. 支付宝怎么提交html表单提交,uniapp H5 支付表单提交问题解决烦方案
  9. 统计项目代码行数工具,如何统计代码行数。
  10. Typora下载安装详细步骤
  11. java ppt模板_java循环ppt模板
  12. 利用python实现键盘连点器
  13. 高德地图定位,搜索,导航功能
  14. 测试cs架构的软件,基于UI的CS架构软件自动化测试方法及系统
  15. ibmt60升级linux,【原创】老兵不死,T60最强升级记
  16. maven基础:mvn命令常用参数整理;如:-am构建指定模块,同时构建指定模块依赖的其他模块
  17. 2019 kyle年度总结
  18. mxnet dropout 层阅读和测试
  19. python量化 双均线策略(金叉死叉)
  20. 锐捷网络C++开发工程师校招一面面经

热门文章

  1. Oracle 11g数据库基础教程(第2版)-课后习题-第六章
  2. C语言数据结构知识点小结(全)
  3. 2014年二级c语言题库,全国计算机二级c语言题库试题
  4. 利用Bat命令批量修改文件名
  5. python运维之路
  6. 读书笔记:《浪潮之巅》
  7. JS版的bin2hex和hex2bin,支持汉字
  8. Intel Visual Fortan与gfortran使用rename函数的区别
  9. TI CC3200 launchpad 使用 CCS 下载
  10. 无线充qi协议c语言详解,无线充电Qi协议正向通信FSK的解调设计