【发布时间】:2011-01-29 09:32:54
【问题描述】:
编辑: 这个问题是关于在 SELECT 修改关键字和函数上找到对 MySQL 语法的明确参考。 /编辑
AFAIK SQL 定义了 DISTINCT 关键字的两种用途 - SELECT DISTINCT field... 和 SELECT COUNT(DISTINCT field) ... 但是,在我管理的一个 Web 应用程序中,我注意到像
这样的查询存在性能问题SELECT DISTINCT(field1), field2, field3 ...
单列上的 DISTINCT() 没有意义,我几乎可以肯定它被解释为
SELECT DISTINCT field1, field2, field3 ...
但是我该如何证明呢?
我已经在 mysql 站点上搜索了有关此特定语法的参考,但找不到任何内容。有没有人有 mysql 中 DISTINCT() 定义的链接或知道其他权威来源?
最好的
编辑 在 mysql 论坛上问了同样的问题后,我了解到,在解析 SQL 时,mysql 并不关心函数和列名之间的空格(但我仍然缺少参考)。
看起来你可以在函数和括号之间有空格
SELECT LEFT (field1,1), field2...
让mysql理解为SELECT LEFT(field,1)
类似地 SELECT DISTINCT(field1), field2... 似乎被分解为 SELECT DISTINCT (field1), field2... 然后 DISTINCT 不被视为一些未定义(或未记录)的函数,而是作为 SELECT 修改关键字和 field1 周围的括号被评估为好像它们是字段表达式的一部分。
如果有人能提供指向说明函数和括号之间的空白不重要的文档的指针,或者提供指向适当的 MySQL 论坛、邮件列表的链接,我可以在其中提出问题并将其放入参考。
编辑 我找到了对服务器选项IGNORE SPACE 的引用。 它指出“IGNORE SPACE SQL 模式可用于修改解析器如何处理对空格敏感的函数名称”,后来它指出最近版本的 mysql 已将此数字从 200 减少到 30。
例如,剩下的 30 个中的一个是 COUNT。 同时启用 IGNORE SPACE
SELECT COUNT(*) FROM mytable;
SELECT COUNT (*) FROM mytable;
是合法的。
因此,如果这是一个例外,我只能得出结论,通常函数默认会忽略空格。
如果函数默认忽略空格,那么如果上下文不明确,例如对于 select 表达式的第一项上的第一个函数,那么它们与关键字无法区分,并且不能抛出错误,MySQL 必须接受它们作为关键字。
不过,我的结论感觉他们有很多假设,我仍然会很感激并接受任何指示,看看在哪里跟进。
【问题讨论】:
-
你是说mysql的 SELECT DISTINCT(field1), field2, field3 ... 相当于postgres的 DISTINCT ON () 吗?另外,我真的很想找一些mysql的权威参考...
-
只是运行一些测试来仔细检查,但我可以确认 mysql 的 SELECT DISTINCT() 在 postgres 中的行为不像 DISTINCT ON ()
标签: mysql