SQL COUNT函数多参数的定义规则及查询结果疑问解析
SQL COUNT函数多参数形式的定义规则
测试数据与查询案例
先查看表func_tbl的完整数据:
public ❯ select * from func_tbl; +-------------------------+-------+-------+----+-----+-----+ | time | t0 | t1 | t2 | f0 | f1 | +-------------------------+-------+-------+----+-----+-----+ | 1999-12-31T00:10:00.030 | tag11 | tag23 | | 444 | 333 | | 1999-12-31T00:00:10.015 | tag14 | tag24 | | 444 | 111 | | 1999-12-31T01:00:00.035 | tag14 | tag24 | | 555 | 222 | | 1999-12-31T00:00:00 | tag11 | tag21 | | 111 | 444 | | 1999-12-31T00:00:10.020 | tag14 | tag21 | | 222 | 555 | | 1999-12-31T00:00:00.005 | tag12 | tag22 | | 222 | 444 | | 1999-12-31T00:10:00.025 | tag11 | tag22 | | 333 | 555 | | 1999-12-31T00:00:00.010 | tag12 | tag23 | | 333 | 222 | +-------------------------+-------+-------+----+-----+-----+ Query took 0.008 seconds.
执行COUNT(t0, t1)查询:
public ❯ select count(t0,t1) from func_tbl; +--------------------------------+ | COUNT(func_tbl.t0,func_tbl.t1) | +--------------------------------+ | 7 | +--------------------------------+ Query took 0.006 seconds.
执行COUNT(t0, t2)查询(t2列全为NULL):
public ❯ select count(t0,t2) from func_tbl; +--------------------------------+ | COUNT(func_tbl.t0,func_tbl.t2) | +--------------------------------+ | 0 | +--------------------------------+ Query took 0.006 seconds.
补充测试查询:
public ❯ select count(f0,null) from func_tbl; +-------------------------+ | COUNT(func_tbl.f0,NULL) | +-------------------------+ | 8 | +-------------------------+ Query took 0.007 seconds. public ❯ select count(null) from func_tbl; +-------------+ | COUNT(NULL) | +-------------+ | 0 | +-------------+ Query took 0.005 seconds. public ❯ select count(t0,null) from func_tbl; +-------------------------+ | COUNT(func_tbl.t0,NULL) | +-------------------------+ | 3 | +-------------------------+ Query took 0.007 seconds.
规则总结
标准SQL并未定义多参数形式的COUNT函数,这是特定数据库(如本次测试的CnosDB)的扩展语法。结合上述测试案例,可总结其行为规则:
- 仅传入
NULL常量:返回0,与标准SQL中COUNT(NULL)的行为一致。 - 传入多个非NULL列:返回这些列的唯一组合行数,等价于
COUNT(DISTINCT 列1, 列2)。例如COUNT(t0, t1)返回7,对应表中t0与t1的唯一组合共7种(第2、3行组合重复)。 - 传入包含全NULL列的参数:返回
0,因为每一行的参数组合中都存在NULL,无有效组合。例如COUNT(t0, t2)中t2全为NULL,因此返回0。 - 传入列+NULL常量的组合:行为存在差异,需结合数据库具体实现确认:
- 部分场景下返回表的总行数,如
COUNT(f0, NULL)返回8,等价于COUNT(*)。 - 部分场景下返回列的唯一值数量,如
COUNT(t0, NULL)返回3,对应t0列的唯一值个数。
- 部分场景下返回表的总行数,如
内容的提问来源于stack exchange,提问作者Baker X
相关产品推荐
相关产品推荐

