有没有办法访问SELECT表中的所有列,除了特定的列?从表中选择所有非 blob 或非几何列会非常方便。
就像是:
SELECT * -the_geom FROM segments;
Run Code Online (Sandbox Code Playgroud)
刚刚遇到一个奇怪的问题,根据我创建索引的方式,需要一个索引名称。
http://dev.mysql.com/doc/refman/5.5/en/create-index.html
http://dev.mysql.com/doc/refman/5.5/en/alter-table.html
CREATE INDEX `random_name` ON `my_table` (`my_column`); # Requires an index name
ALTER TABLE `my_table` ADD INDEX (`my_column`); # Does not require an index name
Run Code Online (Sandbox Code Playgroud)
在我看来, CREATE INDEX 调用不应该要求索引名称。我想知道这是 MySQL 主义还是 SQL 标准?
的ANSI SQL标准定义(第6.5章,集功能规范),用于空的结果集的集合函数以下行为:
COUNT(...) = 0
AVG(...) = NULL
MIN(...) = NULL
MAX(...) = NULL
SUM(...) = NULL
Run Code Online (Sandbox Code Playgroud)
为 AVG、MIN 和 MAX 返回 NULL 非常有意义,因为空集的平均值、最小值和最大值是未定义的。
然而,最后一个让我感到困扰:在数学上,空集的 SUM 是明确定义的:0。使用 0,加法的中性元素,作为基本情况使一切保持一致:
SUM({}) = 0 = 0
SUM({5}) = 5 = 0 + 5
SUM({5, 3}) = 8 = 0 + 5 + 3
SUM({5, NULL}) = NULL = 0 + 5 + NULL
Run Code Online (Sandbox Code Playgroud)
定义SUM({})为null基本上使“无行”成为不适合其他行的特殊情况:
SUM({}) = NULL = NULL
SUM({5}) = 5 != …Run Code Online (Sandbox Code Playgroud) 这个问题是不同的,但类似于这个寻找 SQL-89 的请求。
SQL 的初稿被标记为 SQL-86。对其进行了大量引用。这个可以下载吗?维基百科甚至没有一个页面。由于历史原因,我对它感兴趣。
好像也叫
该规范在该时期的文件中被引用为来自ANSI 技术委员会 X3H2。
我知道有 webstore.ansi.org,但我找不到该X3.135-1986文件。但是,我可以X3.168-1989在X3.135-1992Searching for下找到可用的规格both X3.168,并且X3.135不允许我购买 1986 规格。
我看到频繁引用WITH查询(公共表表达式,或 CTE)充当优化栅栏,服务器不允许将过滤器下推到 CTE 查询中,将公共表达式从 CTE 中拉出等。它经常被声称成为 SQL 标准要求的行为。
CTE绝对是PostgreSQL 中的优化栅栏……但这是标准要求的,还是实际上只是实现细节?
例如,这些邮件列表帖子声称或建议它是标准的:
在评论中提到它之后,我被问到它的指定位置 - 在查看了 SQL:2008 的唯一草案后,我可以访问我并没有太多运气找到它。
我还没有深入研究标准,所以我希望有人提出建议:标准实际上是否需要PostgreSQL中CTE的优化围栏?如果是这样,它在哪里指定?还是 Pg 邮件列表上的陈述有误?
另见todo list上的线程CTE优化围栏?.
我在这里的评论中遇到了这个难题
CREATE TABLE r (b INT);
SELECT 1 FROM r HAVING 1=1;
Run Code Online (Sandbox Code Playgroud)
SQL Server和PostgreSQL返回 1 行。
哪个是正确的?或者两者都同样有效?
目前是否计划标准化一种限制查询返回结果数量的最佳方法?
是否有 ANSI SQL 替代 MYSQL LIMIT 关键字的堆栈溢出问题?列出了用不同语言处理这种行为的各种方法:
DB2 -- select * from table fetch first 10 rows only
Informix -- select first 10 * from table
Microsoft SQL Server and Access -- select top 10 * from table
MySQL and PostgreSQL -- select * from table limit 10
Oracle -- select * from (select * from table) where rownum <= 10
Run Code Online (Sandbox Code Playgroud)
我不经常玩数据库,所以我在这里说的是无知,但似乎这是一个非常重要的功能 - 至少足够重要,当我看到它被留给供应商时我会挠头。
SQL 标准是否定义了具有副作用的函数?
例如,当您执行类似操作时,它们是否具有写入文件* 或更新表某些列中的值的功能
SELECT myfunction(params...);
Run Code Online (Sandbox Code Playgroud)
我有时会看到这些,但我很好奇 SQL 标准是否也这样做。
* 这不是专门针对 PostgreSQL 的问题。我只使用了我在 PostgreSQL 中看到的副作用示例。
Microsoft 当前允许使用此语法。
SELECT *
FROM ( VALUES (1) ) AS g(x)
WHERE EXISTS (
SELECT *
FROM ( VALUES (1),(1) )
AS t(x)
WHERE g.x = t.x
HAVING count(*) > 1
);
Run Code Online (Sandbox Code Playgroud)
请注意,没有GROUP BY中EXISTS条款,是有效的ANSI SQL。或者它只是暴露了一个实现细节。
作为参考,PostgreSQL 中不允许使用相同的语法。
错误:列“tx”必须出现在 GROUP BY 子句中或用于聚合函数中
但是这种语法是允许的..
SELECT *
FROM ( VALUES (1) ) AS g(x)
WHERE EXISTS (
SELECT 1 -- This changed from the first query
FROM ( VALUES (1),(1) )
AS t(x)
WHERE g.x = t.x
HAVING count(*) …Run Code Online (Sandbox Code Playgroud) sql-standard ×10
postgresql ×3
aggregate ×2
exists ×1
functions ×1
group-by ×1
index ×1
limits ×1
mysql ×1
null ×1
optimization ×1
sql-server ×1