count(列名) ,count(1)与count(*) 有何区别?

Mysql版本:8.0.26
可视化客户端:sql yog


文章目录

  • 一、Mysql之count函数简介
  • 二、count(列名) ,count(常量)与count(*) 有何区别?
    • 2.1 统计字段上的区别
    • 2.2 执行效率上的区别


一、Mysql之count函数简介

表达式

COUNT(expression)

描述

返回查询的记录总数,expression 参数是一个字段或者 * 号

举例说明

①准备表数据

count(列名) ,count(1)与count(*) 有何区别?_第1张图片
②查询统计user表中的username字段的总记录数

代码示例如下:

SELECT COUNT(username) FROM USER;

count(列名) ,count(1)与count(*) 有何区别?_第2张图片

ps:

MySQL在Windows下不区分大小写,但在Linux下默认是区分大小写。 因此,数据库名、表名、字段名,都不允许出现任何大写字母,避免节外生枝。


二、count(列名) ,count(常量)与count(*) 有何区别?

2.1 统计字段上的区别

区别

  • count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略为NULL的值
  • count(常量)包括了所有的列,比如用1代表代码行,在统计结果的时候,不会忽略为NULL的值。
  • count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是指空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。

不信?请看如下案例演示

①准备表数据

count(列名) ,count(1)与count(*) 有何区别?_第3张图片

②sql代码测试(以字段id与name举例)

  1. 使用count(*) 与 count(常量) 查询统计

    查询user表中所有的记录行数

    代码示例如下:

    a. 使用count(*)查询统计

    SELECT COUNT(*) FROM USER;
    

    count(列名) ,count(1)与count(*) 有何区别?_第4张图片
    b. 使用count(常量)查询统计,以1为例

    SELECT COUNT(1) FROM USER;
    

    count(列名) ,count(1)与count(*) 有何区别?_第5张图片

  2. 使用count函数统计列name与id

    代码示例如下:

    a. 使用count(name) 查询统计列name的总记录数【2条】

    SELECT COUNT(NAME) FROM USER;
    

    count(列名) ,count(1)与count(*) 有何区别?_第6张图片

    b. 使用count(id) 查询统计列id的总记录数【4条】

    SELECT COUNT(id) FROM USER;
    

    count(列名) ,count(1)与count(*) 有何区别?_第7张图片

why?

原因

从下图中表user中的数据来看,列name下有效【非NULL】的字段值共有两行,无效【为NULL】的字段值共有两条,而列id下有效【非NULL】的字段值共有四行,没有无效【为NULL】的字段值

count(列名) ,count(1)与count(*) 有何区别?_第8张图片

2.2 执行效率上的区别

区别

  • 列名为主键,count(列名)会比count(1)快

  • 列名不为主键,count(1)会比count(列名)快

  • 如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)

  • 如果有主键,则 select count(主键)的执行效率是最优的

  • 如果表只有一个字段,则 select count(*)最优


你可能感兴趣的:(MySQL,mysql,sql)