SQLite"COUNT(*)"被认为有害吗?

Dab*_*phy 2 sql database sqlite

考虑以下简单示例:

prompt% sqlite3 test.db
sqlite> create table employee (
           employee_id   integer       primary key,
           first_name    varchar2(32)  not null,
           last_name     varchar2(32)  not null
        );

sqlite> insert into employee (first_name, last_name) values ('Bill', 'Smith');
sqlite> insert into employee (first_name, last_name) values ('Sally', 'Jones');
sqlite> insert into employee (first_name, last_name) values ('Bill', 'Jones');

sqlite> select first_name, count(*) from employee;
Run Code Online (Sandbox Code Playgroud)

结果会是什么?

天真可能会认为它将是:

Bill|2
Sally|1
Run Code Online (Sandbox Code Playgroud)

但有经验的人会注意到SELECT查询缺少'GROUP BY'子句.事实上,Oracle在提出此查询时会抛出错误:

SQL ERROR: ORA-00937: not a single-group group function
Run Code Online (Sandbox Code Playgroud)

然而,SQLite不抱怨,而是产生:

Bill|3
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎是假的......我想,显示总行数可能有意义,但只是选择最后一个'first_name'似乎相当武断,而且有潜在危险.

这是一个我只是无法理解的错误或功能吗?有没有理由SQLite不提供类似的安全网?

Ben*_*Ben 5

这些都记录在案:

如果SELECT语句是没有GROUP BY子句的聚合查询,则结果集中的每个聚合表达式将在整个数据集中进行一次求值.对于任意选择的数据集行,对结果集中的每个非聚合表达式求值一次.每个非聚合表达式使用相同的任意选择行...

通过评估结果集中的聚合和非聚合表达式创建的单行结果集数据形成了没有GROUP BY子句的聚合查询的结果.没有GROUP BY子句的聚合查询总是返回一行数据,即使输入数据为零行也是如此.

简而言之,没有安全网.如果需要,请不要忘记GROUP BY.