注意到SQL的COUNT()函数有不同的变体了吗?本文将解释这些变体的参数以及它们的用途。

作为一名SQL用户,你可能已经非常熟悉COUNT()函数了。尽管这个函数相对简单,它却可以用多种方式来使用,而每种方式都有截然不同的用途。你可能见过代码中使用COUNT(*)或COUNT(1)这样的函数调用。你也可能见过COUNT(column name)和COUNT(DISTINCT column name)这样的用法,即使你可能并没有实际使用过它们。

你可能在想:每种COUNT()变体究竟是做什么的呢?让我们一起来揭晓答案!

COUNT()函数究竟做什么?

COUNT()函数专门用于计数。那么,它到底计算什么呢?COUNT()是SQL中聚合函数的一员,它计算满足查询中定义条件的行数。但它不会返回这些行的具体内容,而是显示满足你条件的行的总数。

COUNT()函数的几种变体

由于可以计数的内容是不同的,因此COUNT()函数有多种变体。本文将主要关注以下四种:

  1. COUNT(*)
  2. COUNT(1)
  3. COUNT(column name)
  4. COUNT(DISTINCT column name)

COUNT(*) vs COUNT(1)

你可能见过关于COUNT(*)和COUNT(1)差异的讨论。或许有些讨论让你感到更加困惑。那么,它们之间真的有区别吗?简单回答是:没有——两者完全相同。

  • COUNT(*) 会计算表中所有行的总数,包括NULL值。
  • COUNT(1) 的语义略有不同,但最终返回的结果与COUNT(*)是完全一致的。

我们可以通过一个示例查询来验证这一点。假设有一个名为orders的表,它包含以下几列:

  • order_id:订单的ID。
  • customer_id:下单客户的ID。
  • order_value:订单总金额(单位为欧元)。
  • payment_date:客户支付订单的日期。

以下是使用COUNT(*)与COUNT(1)的比较:

SELECT
  COUNT(*) AS count_asterisk,
  COUNT(1) AS count_1
FROM orders;

结果如下:

count_asteriskcount_1
88

两者返回的行数完全相同。

一个常见误区是认为COUNT(1)中的”1″表示“仅对第一列的非空值进行计数,返回行的数量”。基于这一误解,有些人还认为COUNT(1)更快,因为它只需计算第一列,而COUNT(*)需要遍历整个表。但是,这种说法并不正确。

COUNT(1)实际上会将括号中的值(这里是数字1)分配给表中每一行,然后对分配的值进行计数。无论括号内是什么值,最终结果总是等于表中的行数。因此,COUNT(*)和COUNT(1)完全一致。

性能方面,两者之间也没有差异。COUNT(*)并不会像SELECT *那样检索整个表以返回结果。

综上所述,COUNT()和COUNT(1)在功能上完全相同。但建议使用COUNT(),因为它更常见且更容易理解。


COUNT(*) vs COUNT(column name)

COUNT(*)与COUNT(column name)之间有明显的区别:

  • COUNT(*) 计算表中的所有行,包括NULL值。
  • COUNT(column name) 则仅计算指定列中非NULL的行。

假设orders表有8行。如果我们使用order_id列作为计数依据,就会得到一个不同的结果。例如:

SELECT COUNT(order_id) AS number_of_orders
FROM orders;

结果如下:

number_of_orders
7

这意味着表中有一行的order_idNULL,所以COUNT(column name)排除了这一行。

请记住:COUNT(column name) 只统计指定列中非NULL值的行。


COUNT(column name) vs COUNT(DISTINCT column_name)

两者的区别在于是否考虑重复值:

  • COUNT(column name) 会统计列中的所有行,包括重复值。
  • COUNT(DISTINCT column_name) 仅统计指定列中的唯一值。

比如,我们想统计下单的客户数量。以下是代码示例:

SELECT COUNT(customer_id) AS number_of_customers
FROM orders;

结果如下:

number_of_customers
8

虽然表里有8行,但客户CU108CU052出现了两次。如果我们想统计唯一的客户数量,可以使用COUNT(DISTINCT column_name)

SELECT COUNT(DISTINCT customer_id) AS number_of_customers
FROM orders;

结果是:

number_of_customers
6

这才是真正的客户数量。


总结

通过理解COUNT()函数的多种变体,你可以轻松构建更复杂的SQL计算和报告。COUNT()是SQL中最常用的聚合函数之一,因此清晰理解它的不同用途非常重要。



select count的几种用法插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.choupangxia.com/2025/08/02/select-count/