为什么`SELECT count(*)` 返回1?

log*_*gan 6 performance optimization query-performance

一些 RDBMS 似乎允许没有 FROM 子句的查询,例如:

postgres=# SELECT 'foo' bar;
???????
? bar ?
???????
? foo ?
???????
Run Code Online (Sandbox Code Playgroud)

但是对于那些允许它的人,为什么SELECT count(*)不返回 0?

postgres=# SELECT count(*);
?????????
? count ?
?????????
?     1 ?
?????????
Run Code Online (Sandbox Code Playgroud)

Eva*_*oll 7

说到 PostgreSQL,我发现这个问题有点意思。

省略 FROM 子句

这在 SQL 规范中是完全不允许的。PostgreSQL 将此功能称为“省略的 FROM 子句”,并对此进行了说明

PostgreSQL 允许省略 FROM 子句。[...] 其他一些 SQL 数据库无法做到这一点,除非引入一个虚拟的单行表来执行 SELECT。请注意,如果未指定 FROM 子句,则查询不能引用任何数据库表。

这是不明确的。PostgreSQL 只是为您引入了一个隐式的单行虚拟表。语法示例SELECT 2+2让您可以看到它仅适用于琐碎的情况。

# SELECT count(*);
 count 
-------
     1
Run Code Online (Sandbox Code Playgroud)

只要您记住它是在一个隐式虚拟表上运行,这就是有意义的。

CREATE TABLE dummy_table ();
INSERT INTO dummy_table DEFAULT VALUES;

SELECT count(*) FROM dummy_table;
Run Code Online (Sandbox Code Playgroud)