返回顶部
首页 > 资讯 > 数据库 >MySQL Count函数如何使用
  • 193
分享到

MySQL Count函数如何使用

2023-07-04 18:07:28 193人浏览 泡泡鱼
摘要

本文小编为大家详细介绍“MySQL Count函数如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mysql Count函数如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。COU

本文小编为大家详细介绍“MySQL Count函数如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mysql Count函数如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

COUNT 是一个汇总函数(聚集函数),它接受一个表达式作为参数:

COUNT(expr)

COUNT函数用于统计在符合搜索条件的记录中,指定的表达式expr不为NULL的行数有多少。这里需要特别注意的是,expr不仅仅可以是列名,其他任意表达式都是可以的。

一、COUNT 的使用

select COUNT(key1) FROM t;

这个语句是用于统计在 t 表 key1 列 值不为 NULL 的行数是多少。

MySQL Count函数如何使用

看下面的这个:

select COUNT('abc') FROM t;

这个语句是用于统计在 t 表的所有记录中,‘abc’ 这个表达式不为 NULL的行数是多少。很显然,‘abc’ 这个表达式永远不为 NULL, 所以上述语句其实就是统计 t 表里有多少条记录。

再看这个:

select COUNT(*) from t;

这个语句就是直接统计 t 表中有多少条记录。

总结 + 注意:COUNT函数的参数可以是任意表达式, 该函数用于统计在符合搜索条件的记录中,指定的表达式不为NULL的行数有多少。

二、COUNT是怎么样运行的

mysql> select count(*) from single_table;+----------+| count(*) |+----------+|    12610 |+----------+1 row in set (0.00 sec)####### single_table 表结构 ########CREATE TABLE `single_table` (  `id` int NOT NULL AUTO_INCREMENT,  `key1` varchar(100) DEFAULT NULL,  `key2` int DEFAULT NULL,  `key3` varchar(100) DEFAULT NULL,  `key_part1` varchar(100) DEFAULT NULL,  `key_part2` varchar(100) DEFAULT NULL,  `key_part3` varchar(100) DEFAULT NULL,  `common_field` varchar(100) DEFAULT NULL,  PRIMARY KEY (`id`),  UNIQUE KEY `idx_key2` (`key2`),  KEY `idx_key1` (`key1`),  KEY `idx_key3` (`key3`),  KEY `idx_key_part` (`key_part1`,`key_part2`,`key_part3`)) ENGINE=InnoDB AUTO_INCREMENT=20000 DEFAULT CHARSET=utf8mb3 |

这个语句是要去查询表 single_table 中共包含多少条记录。由于聚簇索引和二级索引中的记录是一一对应的,而二级索引记录中包含的列是少于聚簇索引记录的,所以同样数量的二级索引记录可以比聚簇索引记录占用更少的存储空间。如果我们使用二级索引执行上述查询,即数一下idx_key2中共有多少条二级索引记录(存在多个二级索引,为什么选择idx_key2,下面会具体说明),是比直接数聚簇索引中共有多少聚簇索引记录可以节省很多I/O成本。所以优化器会决定使用idx_key2执行上述查询。

mysql> explain select count(*) from single_table;+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+| id | select_type | table        | partitions | type  | possible_keys | key      | key_len | ref  | rows  | filtered | Extra       |+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+|  1 | SIMPLE      | single_table | NULL       | index | NULL          | idx_key2 | 5       | NULL | 12590 |   100.00 | Using index |+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+1 row in set, 1 warning (0.00 sec)

在执行上述查询时,server层会维护一个名叫count的变量,然后:

(1)server层向InnoDB要第一条记录。

(2)InnoDB找到idx_key1的第一条二级索引记录,并返回给server层(注意:由于此时只是统计记录数量,所以并不需要回表)。

(3)由于COUNT函数的参数是*,MySQL会将*当作常数0处理。由于0并不是NULL,server层给count变量加1。

(4)server层向InnoDB要下一条记录。

(5)InnoDB通过二级索引记录的next_record属性找到下一条二级索引记录,并返回给server层。

(6)server层继续给count变量加1。

(7)... 重复上述过程,直到InnoDB向server层返回没记录可查的消息。

(8)server层将最终的count变量的值发送到客户端。

三、COUNT函数的索引使用情况

下面我们增对 count(*),count(1),count(常数),count(主键列),count(普通列(有索引)),count(普通列(无索引))

(1)count(*),count(1),count(常数)

mysql> show create table single_table;+--------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Table        | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |+--------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| single_table | CREATE TABLE `single_table` (  `id` int NOT NULL AUTO_INCREMENT,  `key1` varchar(100) DEFAULT NULL,  `key2` int DEFAULT NULL,  `key3` varchar(100) DEFAULT NULL,  `key_part1` varchar(100) DEFAULT NULL,  `key_part2` varchar(100) DEFAULT NULL,  `key_part3` varchar(100) DEFAULT NULL,  `common_field` varchar(100) DEFAULT NULL,  PRIMARY KEY (`id`),  UNIQUE KEY `idx_key2` (`key2`),  KEY `idx_key1` (`key1`),  KEY `idx_key3` (`key3`),  KEY `idx_key_part` (`key_part1`,`key_part2`,`key_part3`)) ENGINE=InnoDB AUTO_INCREMENT=20000 DEFAULT CHARSET=utf8mb3 |+--------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.00 sec)mysql> select count(*) from single_table;+----------+| count(*) |+----------+|    12610 |+----------+1 row in set (0.00 sec)## count(*) 采用了 idx_key2 索引mysql> explain select count(*) from single_table;+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+| id | select_type | table        | partitions | type  | possible_keys | key      | key_len | ref  | rows  | filtered | Extra       |+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+|  1 | SIMPLE      | single_table | NULL       | index | NULL          | idx_key2 | 5       | NULL | 12590 |   100.00 | Using index |+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+1 row in set, 1 warning (0.00 sec)## count(1) 采用了 idx_key2 索引mysql> explain select count(1) from single_table;+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+| id | select_type | table        | partitions | type  | possible_keys | key      | key_len | ref  | rows  | filtered | Extra       |+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+|  1 | SIMPLE      | single_table | NULL       | index | NULL          | idx_key2 | 5       | NULL | 12590 |   100.00 | Using index |+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+1 row in set, 1 warning (0.00 sec)## count('abc') 采用了 idx_key2 索引mysql> explain select count('abc') from single_table;+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+| id | select_type | table        | partitions | type  | possible_keys | key      | key_len | ref  | rows  | filtered | Extra       |+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+|  1 | SIMPLE      | single_table | NULL       | index | NULL          | idx_key2 | 5       | NULL | 12590 |   100.00 | Using index |+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+1 row in set, 1 warning (0.00 sec)

通过上述查询结果可以看出:

count(*)、count(1)、count('abc') 均采用了 idx_key2,而索引idx_key2 对应的索引列为 key2,字段类型为 int,占用空间为最小的索引列。

结论:

对于 COUNT(*)、COUNT(1) 或者任意的 COUNT(常数) 来说,读取哪个索引的记录其实并不重要,因为server层只关心存储引擎是否读到了记录,而并不需要从记录中提取指定的字段来判断是否为NULL。所以优化器会使用占用存储空间最小的那个索引来执行查询。

(2)count(主键列)

## count(id) 采用了 idx_key2 索引mysql> explain select count(id) from single_table;+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+| id | select_type | table        | partitions | type  | possible_keys | key      | key_len | ref  | rows  | filtered | Extra       |+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+|  1 | SIMPLE      | single_table | NULL       | index | NULL          | idx_key2 | 5       | NULL | 12590 |   100.00 | Using index |+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+1 row in set, 1 warning (0.00 sec)

通过上述查询结果可以看出:

count(id)采用了 idx_key2,而索引idx_key2 对应的索引列为 key2,字段类型为 int,占用空间为最小的索引列。

结论:

对于 COUNT(id) 来说,由于id是主键,不论是聚簇索引记录,还是任意一个二级索引记录中都会包含主键字段,所以其实读取任意一个索引中的记录都可以获取到id字段,此时优化器也会选择占用空间最小的那个索引来执行查询。

(3)count(普通列(有索引))

## count('key1') 采用了 idx_key1 索引mysql> explain select count(key1) from single_table;+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+| id | select_type | table        | partitions | type  | possible_keys | key      | key_len | ref  | rows  | filtered | Extra       |+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+|  1 | SIMPLE      | single_table | NULL       | index | NULL          | idx_key1 | 303     | NULL | 12590 |   100.00 | Using index |+----+-------------+--------------+------------+-------+---------------+----------+---------+------+-------+----------+-------------+1 row in set, 1 warning (0.00 sec)## count(common_field) 未采用任何索引mysql> explain select count(common_field) from single_table;+----+-------------+--------------+------------+------+---------------+------+---------+------+-------+----------+-------+| id | select_type | table        | partitions | type | possible_keys | key  | key_len | ref  | rows  | filtered | Extra |+----+-------------+--------------+------------+------+---------------+------+---------+------+-------+----------+-------+|  1 | SIMPLE      | single_table | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 12590 |   100.00 | NULL  |+----+-------------+--------------+------------+------+---------------+------+---------+------+-------+----------+-------+1 row in set, 1 warning (0.00 sec)

通过上述查询结果可以看出:

count(key1)采用了 idx_key1,索引idx_key1对应的索引列即为key1。count(common_field)未采用任何索引,common_field也不存在任何索引。

结论:

对于COUNT(非主键列)来说,我们指定的列可能并不会包含在每一个索引中。这样优化器只能选择包含我们指定的列的索引去执行查询,这就可能导致优化器选择的索引并不是最小的那个。

四、补充

对于count(非空普通列)来说,使用索引情况会怎么样?会不会直接采用最小占用空间索引呢?

mysql> show create table person_info;+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Table       | Create Table                                                                                                                                                                                                                                                                                                                                                     |+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| person_info | CREATE TABLE `person_info` (  `id` int NOT NULL AUTO_INCREMENT,  `name` varchar(100) NOT NULL,  `birthday` date NOT NULL,  `age` int DEFAULT NULL,  `phone_number` char(11) NOT NULL,  `country` varchar(100) NOT NULL,  PRIMARY KEY (`id`),  KEY `idx_name` (`name`),  KEY `idx_age` (`age`)) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb3 |+-------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.00 sec) mysql> explain select count(phone_number) from person_info;+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------+| id | select_type | table       | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------+|  1 | SIMPLE      | person_info | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    9 |   100.00 | NULL  |+----+-------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------+1 row in set, 1 warning (0.00 sec)

通过上述查询结果可以看出:

虽然 phone_number 字段为 not null,count(phone_number) 和 count(*) 结果一致,但是 phone_number 仍然并有选择走索引。

读到这里,这篇“MySQL Count函数如何使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL Count函数如何使用

本文链接: https://lsjlt.com/news/346935.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL Count函数如何使用
    本文小编为大家详细介绍“MySQL Count函数如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL Count函数如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。COU...
    99+
    2023-07-04
  • 如何在MySQL中使用count聚合函数
    如何在MySQL中使用count聚合函数?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、 基本使用count的基本作用是有两个:统计某个列的...
    99+
    2024-04-02
  • Excel中COUNT函数如何使用
    COUNT函数是一个Excel中的内置函数,用于计算一个区域中包含的数值的数量。COUNT函数的基本语法如下:COUNT(value...
    99+
    2023-09-07
    Excel COUNT
  • mysql的count()函数怎么使用
    这篇文章主要介绍“mysql的count()函数怎么使用”,在日常操作中,相信很多人在mysql的count()函数怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”my...
    99+
    2024-04-02
  • MySQL中Count函数怎么使用
    这篇文章主要介绍了MySQL中Count函数怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL中Count函数怎么使用文章都会有所收获,下面我们一起来看看吧。 ...
    99+
    2022-12-07
    mysql count
  • python如何用count函数
    在python中使用count函数的方法count:count()函数的作用是用于统计字符串里某个字符出现的次数。count()函数语法:str.count(sub, start= 0,end=len(string))参数:sub:需要搜索...
    99+
    2024-04-02
  • MySQL COUNT函数的使用与优化
    COUNT 函数做什么用? COUNT 是一个专用的函数,通常有两种不同的方式:计算值和数据行。值指的是非空(Non-NULL)表达式(NULL表示值缺失)。如果我们在 COUNT的参数中指定了列名或其他表达式,则...
    99+
    2022-05-11
    MySQL COUNT的使用 MySQL COUNT的优化
  • MySQL中COUNT如何使用
    这篇文章将为大家详细讲解有关MySQL中COUNT如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。  COUNT(expr)返回检索行中expr不为N...
    99+
    2024-04-02
  • mysql中count函数怎么用
    在mysql中使用count函数的方法:count函数是用于统计表或数组中的记录,语法:select count(price) from table_name;count函数作用:mysql中count函数的作用是用于统计表或数组...
    99+
    2024-04-02
  • MySql统计函数COUNT的具体使用详解
    目录1. COUNT()函数概述2. COUNT()参数说明3. COUNT()判断存在4. COUNT()阿里开发规范1. COUNT()函数概述 COUNT() 是一个聚合函数,返回指定匹配条件的行数。开发中常用来统...
    99+
    2022-08-14
    MySql统计函数COUNT MySqlCOUNT
  • mysql常用函数之group_concat()、groupby、count()、casewhenthen的使用
    目录场景:一、行转列函数 group_concat(arg)二、分组 group by、count()、sum() 函数的组合使用三、count() 配...
    99+
    2023-01-04
    mysql group_concat() group by count() case when then
  • php中count函数怎么使用
    在PHP中,`count()`函数用于计算数组的长度或者对象中的属性的个数。它的使用方式有以下几种:1. 计算数组长度:```php...
    99+
    2023-08-24
    php count
  • java中count函数怎么使用
    在Java中,`count`函数通常用于计算集合中满足指定条件的元素个数。可以使用`stream`流操作和`filter`方法结合使...
    99+
    2023-10-26
    java
  • python中count函数怎么使用
    在Python中,count()函数可以用于计算一个字符串或列表中某个元素出现的次数。count()函数的使用方式如下: 对于字符...
    99+
    2024-02-29
    python
  • mysql sum(if())和count(if())如何使用
    这篇“mysql sum(if())和count(if())如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“...
    99+
    2023-06-26
  • 详解 MySQL中count函数的正确使用方法
    1. 描述 在MySQL中,当我们需要获取某张表中的总行数时,一般会选择使用下面的语句 select count(*) from table; 其实count函数中除了*还可以放其他参数,比如常数、主...
    99+
    2022-05-17
    MySQL count MySQL count函数
  • MySQL统计函数count详解
    MySQL统计函数count详解 1. count()概述2. count(1)和count(*)和count(列名)的区别3. count(*)的实现方式 1. count()概述 count() 是一个聚合函数,返回指定匹配...
    99+
    2023-08-17
    mysql 数据库 统计函数count
  • PHP中使用count()函数的方法
    这篇文章主要介绍了PHP中使用count()函数的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。count()语法count  ( mixe...
    99+
    2023-06-14
  • mysql 中count函数的作用是什么
    mysql 中count函数的作用是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。SELECT COUNT(salary...
    99+
    2024-04-02
  • MySQL如何使用JSON函数
    这篇文章主要为大家展示了“MySQL如何使用JSON函数”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL如何使用JSON函数”这篇文章吧。JSON函数(...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作