select count的几种用法
注意到SQL的COUNT()函数有不同的变体了吗?本文将解释这些变体的参数以及它们的用途。
作为一名SQL用户,你可能已经非常熟悉COUNT()函数了。尽管这个函数相对简单,它却可以用多种方式来使用,而每种方式都有截然不同的用途。你可能见过代码中使用COUNT(*)或COUNT(1)这样的函数调用。你也可能见过COUNT(column name)和COUNT(DISTINCT column name)这样的用法,即使你可能并没有实际使用过它们。
你可能在想:每种COUNT()变体究竟是做什么的呢?让我们一起来揭晓答案!
COUNT()函数究竟做什么?
COUNT()函数专门用于计数。那么,它到底计算什么呢?COUNT()是SQL中聚合函数的一员,它计算满足查询中定义条件的行数。但它不会返回这些行的具体内容,而是显示满足你条件的行的总数。
COUNT()函数的几种变体
由于可以计数的内容是不同的,因此COUNT()函数有多种变体。本文将主要关注以下四种:
- COUNT(*)
- COUNT(1)
- COUNT(column name)
- 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_asterisk | count_1 |
8 | 8 |
两者返回的行数完全相同。
一个常见误区是认为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_id
为NULL
,所以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行,但客户CU108
和CU052
出现了两次。如果我们想统计唯一的客户数量,可以使用COUNT(DISTINCT column_name)
:
SELECT COUNT(DISTINCT customer_id) AS number_of_customers FROM orders;
结果是:
number_of_customers |
6 |
这才是真正的客户数量。
总结
通过理解COUNT()函数的多种变体,你可以轻松构建更复杂的SQL计算和报告。COUNT()是SQL中最常用的聚合函数之一,因此清晰理解它的不同用途非常重要。
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接