2

考虑以下简单示例:

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;

结果会怎样?

天真的可能会认为它将是:

Bill|2
Sally|1

但是有经验的人会注意到 SELECT 查询缺少 'GROUP BY' 子句。事实上,当 Oracle 出现这个查询时,会抛出一个错误:

SQL ERROR: ORA-00937: not a single-group group function

然而,SQLite 并没有抱怨,而是产生:

Bill|3

这对我来说似乎是假的......我想显示总行数可能是有道理的,但简单地选择最后一个'first_name'似乎相当随意且有潜在危险。

这是我无法理解的错误还是功能?SQLite 不提供类似的安全网是否有原因?

4

1 回答 1

5

这一切都记录在案

如果 SELECT 语句是没有 GROUP BY 子句的聚合查询,则结果集中的每个聚合表达式都会在整个数据集上计算一次。结果集中的每个非聚合表达式都会针对任意选择的数据集行进行一次评估。每个非聚合表达式使用相同的任意选择的行...

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

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

于 2013-04-02T16:38:42.270 回答