- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:这个问题是关于在 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/
我有一个包含电子邮件、IP、州、城市、时间戳、ID 列的表 我需要按州分组计算电子邮件和 IP 的不同位置 所以当我运行 MYSQL 查询时, select State, City ,count(di
我试过 select distinct ID from DB.TABLE; 它返回所有记录中的唯一 ID。 select distinct * from DB.TABLE; 它将通过比较所有列
我正在尝试在 Postgresql 中编写一个查询,该查询提取一组有序数据并按不同的字段对其进行过滤。我还需要从同一表行中提取其他几个字段,但需要将它们排除在不同的评估之外。示例: SELECT
我有一个使用以下语句创建的 Postgres 表。该表由另一个服务的数据转储填充。 CREATE TABLE data_table ( date date DEFAULT NULL,
我在一个名为 products 的表中有 4 列 id|p_name| p_img | 1 | Xs | xsmax.png | 2 | Xs | xr.png |
当它的状态仅为"is"时,我想从“num”中选择不同的值,而不是立即包括“否”? 表: +--------+-----+--------+ | id | num | status | +---
全部!今天我有一个棘手的问题要给你,我想使用 select DISTINCT 语句来选择一个需要不同的行,但也在同一个语句中(或者我尝试过的方式?)一个没有的行't/不能区分。我想要的结果是每个类名中
我有一个正在使用 Distinct() 的 linq 查询。如果我只是调用 Distinct() 而没有转换为列表,那么它不会返回不同的列表 - 它仍然包含重复项。 但是,如果我转换为 List 并然
说到性能,我应该使用 .ToList().Distinct() 还是 .Distinct().ToList() ? 两种扩展方法是否生成相同的 SQL 查询? 看起来第二种方法应该表现更好,但这是真的
如何在不支持 SQL Server 2008R2 的 SQL 实现中重写包含标准 IS DISTINCT FROM 和 IS NOT DISTINCT FROM 运算符的表达式? 最佳答案 IS DI
有一张 table (在 HIVE) 示例 - meanalytics.key2_master_ids 该表有 6 列(cmpgn_id、offr_id、exec_id、creatv_id、cmpl_
SELECT * FROM `amc_info` WHERE department =' ( SELECT DISTINCT department ) into outfile = 'Differe
如何在Elasticsearch中计算“不同的平均值”?我有一些这样的非规范化数据: { "record_id" : "100", "cost" : 42 } { "record_id" : "200
关注这个question我有... ID SKU PRODUCT ======================= 1 FOO-23 Orange 2 BAR
我有这个 mysql 查询: SELECT DISTINCT post.postId,hash,previewUrl,lastRetrieved FROM post INNER JOIN (tag a
http://sqlfiddle.com/#!2/37dd94/17 如果我执行 SELECT DISTINCT,我得到的结果与只执行 SELECT 的结果相同。 在查询结果中,您将看到两个包含 Di
我有一列包含空条目,例如此列中的可能值为 None, 1, 2, 3 当我使用 session.query(func.count(distinct(Entry.col))).scalar() 计算列中
这是否可能从表列中选择不同的行并计算单个查询中每个不同字段的重复行 $sql = "SELECT DISTINCT location and COUNT(DISTINCT location)
我在 MySQL 数据库中有一个包含 1100 万行的表。其中一列是个人身份证号码。人们在表中被多次列出,我想知道有多少个唯一的个人 ID 号码。然后创建一个包含这些唯一数字的表格。当我计算列中不同的
我刚刚注意到我的 Informix SQL 列(在同一个表中)的某些 上有些奇怪。当我执行此查询时 SELECT DISTINCT colName FROM myTable 例如,我得到 40 行。但
我是一名优秀的程序员,十分优秀!