count(列名)、count(1)和 count(*)有什么区别?

在MySQL中,这几个都是统计操作,很多人在使用的时候,都使用的是count(1),这有没有问题?使用正确?达到了统计效果?

我们从效果和效率两方面来分析下

执行效果

count(*) 包括了所有的列,在统计时不会忽略列值为null的数据
count(1) 用1表示代码行,在统计时不会忽略列值为null的数据
count(列名)在统计时,会忽略列值为空的数据,就是说某个字段的值为null时不统计

简单来说,count(*) 和count(1) 都统计null列,count(列名)不统计null列

执行效率

1、InnoDB引擎

count(字段) < count(1) = count(*)

InnoDB通过遍历最小的可用二级索引来处理select count(*) 语句,除非索引或优化器提示指示优化器使用不同的索引
如果二级索引不存在,则通过扫描聚簇索引来处理

2、MyISAM引擎

count(字段) < count(1) <= count(*)

  • MyISAM存储了数据的准确行数,使用 count(*)会直接读取该行数
  • 当第一列定义为NOT NULL时,count(1)和count(*)一样
  • count(列名) 会遍历整个表,但不同的是,它会先获取列,然后判断是否为空,然后累加,因此count(列名)性能不如前两者

总结

  • 优先使用count(*),这是SQL92 定义的标准统计行数的语法,跟数据库无关,与NULL也无关
  • 在InnoDB中,count(1) 等同于count(*),统计NULL的话,使用谁都OK
  • count(列名) 是统计列值数量,不计NULL,相同列值算一个
 

原文链接:https://www.cnblogs.com/huozhonghun/p/17375372.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:count(列名)、count(1)和 count(*)有什么区别? - Python技术站

(0)
上一篇 2023年5月6日
下一篇 2023年5月6日

相关文章

  • mysql 事务隔离级别之可能出现的问题:同一事务中无法查询已插入但未提交的数据

    若要实现查询事务中已插入但是未提交的数据则需要设置MySQL事务隔离级别为 read-uncommitted 下面了解一下MySQL的事务隔离级别: 一、事务的基本要素(ACID)   1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一…

    MySQL 2023年4月13日
    00
  • mysql数据库外连接,内连接,自然连接

    create table join_teacher(id int primary key auto_increment,t_name varchar(10) not null,gender enum(‘male’,’female’,’secret’) not null)engine innodb character set utf8;insert into …

    MySQL 2023年4月13日
    00
  • MySQL唯一约束(UNIQUE KEY)详解

    MySQL的唯一约束是一种用于确保表中某一列的每个值都是唯一的约束。它可以应用于单个列或多个列,以确保每个组合值都是唯一的。 在MySQL中,可以使用UNIQUE关键字定义唯一约束。以下是使用唯一约束的语法: CREATE TABLE table_name ( column1 datatype UNIQUE, column2 datatype, … );…

    MySQL 2023年3月9日
    00
  • MySQL慢查询日志(Slow Query Log)

    MySQL慢查询日志是MySQL默认开启的一种日志记录,它可以用来记录MySQL中执行查询语句过程中耗时长的查询语句,以便于后期对这些查询进行优化,以提高MySQL服务器的性能。 MySQL慢查询日志可以记录下查询的时间、执行的SQL语句、所用的索引、扫描的行数、返回的行数等信息,这些信息都可以用来帮助我们分析SQL语句的性能问题,以及查找潜在的性能瓶颈所在…

    MySQL 2023年3月10日
    00
  • 详解MySQL LIMIT:限制查询结果的条数

    MySQL LIMIT 是一种非常实用的命令,可以用于限制查询结果的条数。当查询结果很大时,使用 LIMIT 可以方便地进行分页展示或者提高查询性能。 LIMIT 命令的语法 LIMIT 命令的语法如下: SELECT column_name(s) FROM table_name LIMIT number; 其中,column_name(s) 是要查询的列名…

    MySQL 2023年3月9日
    00
  • MySql 之UUID()

    mysql中做了个定时执行的事件,发现原来起作用,现在不行了。 调用/var/lib/mysql中的错误日志文件,发现一句: Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsaf…

    MySQL 2023年4月12日
    00
  • MySQL变量的定义和赋值方法详解

    MySQL变量的定义和赋值方法如下: 1. 使用SET语句 定义一个变量并赋值: SET @变量名 = 值; 给变量赋新值: SET @变量名 = 新值; 2. 在SELECT语句中使用: 定义一个变量并赋值: SELECT 值 INTO @变量名; 给变量赋新值: SELECT 新值 INTO @变量名; 举例说明: 假设有一张学生表students,包含…

    MySQL 2023年3月10日
    00
  • mysql报错:MySQL server version for the right syntax to use near type=InnoDB的解决方法

    当我们在创建MySQL数据库表时,有时候可能会遇到以下报错: mysql报错: MySQL server version for the right syntax to use near ‘type=InnoDB’ 的解决方法 这个错误的原因是我们在创建表时使用了过时的”TYPE”关键字,而MySQL 5.5版本以后已经不支持“type”关键字了,而应该使用…

    MySQL 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部