gpt4 book ai didi

mysql - 引用文档中mysql如何定义DISTINCT()

转载 作者:行者123 更新时间:2023-11-29 01:34:01 26 4
gpt4 key购买 nike

编辑:这个问题是关于在 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 站点上搜索了有关此特定语法的引用,但找不到任何内容。有没有人有 DISTINCT() 在 mysql 中定义的链接或知道其他权威来源?

最佳

编辑在 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;

是合法的。

因此,如果这是一个异常(exception),我只能得出结论,通常函数默认会忽略空格。

如果函数默认忽略空格,那么如果上下文不明确,例如第一个函数在 select 表达式的第一项上,那么它们无法与关键字区分开来并且不会抛出错误并且 MySQL 必须接受它们作为关键字。

尽管如此,我的结论感觉它们有很多假设,我仍然会很感激并接受任何指示,看看在哪里可以跟进。

最佳答案

为了完整起见,我正在回答我自己的问题并链接到另一个 question我自己的。这种行为似乎是 SQL 标准允许函数和括号之间有空格的直接结果。

因为(通常)允许说 FUNCTION_NAME (x) 那么当此函数应用于 select 的第一项时

SELECT FUNCTION_NAME (x)

然后解析器将很难确定这是一个函数名称的上下文还是 SELECT 修改关键字。

因此在上述情况下,FUNCTION_NAME 实际上是解析器的 FUNCTION_NAME_OR_KEYWORD。

但更进一步:由于函数名和括号之间的空格是允许的,因此解析器实际上无法区分

SELECT FUNCTION_NAME_OR_KEYWORD (x)

SELECT FUNCTION_NAME_OR_KEYWORD(x)

(它必须测试关键字以查看它们是否是函数),并且由于 (x) 将被解析为 x 因此对于 FUNCTION_NAME_OR_KEYWORD -> DISTINCT(以及所有其他 SELECT 修改关键字)之间没有区别

SELECT DISTINCT x, y, z, ...

SELECT DISTINCT(x), y, z, ...

QED,但没有硬引用(假设 standard 不关心函数名称和括号之间的空格,我相信,这是合理的,但我无法遵循 BNF 语法到我可以引用确切规则的地步).

注意:mysql 有一定数量的函数,它关心函数和括号之间的空格,但我相信这些是异常(exception)(因此服务器选择忽略它)

关于mysql - 引用文档中mysql如何定义DISTINCT(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2476307/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com