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)
说到 PostgreSQL,我发现这个问题有点意思。
这在 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)
归档时间: |
|
查看次数: |
2058 次 |
最近记录: |