当前位置: 首页 > 面试题库 >

为什么MySQL允许您按未选择的列分组

柯浩壤
2023-03-14
问题内容

我正在读一本有关SQL的书(《山姆在10分钟内自学SQL》),尽管书名很不错。但是关于分组依据的一章使我感到困惑

“对数据进行分组是一个简单的过程。选定的列(查询中SELECT关键字后的列列表)是可以在GROUP
BY子句中引用的列。如果在SELECT语句中找不到列,则不能考虑到这是合乎逻辑的,如果不显示数据,可以将数据分组到报表上吗?”

当我在MySQL中运行此语句时,为什么会起作用?

select EMP_ID, SALARY
from EMPLOYEE_PAY_TBL
group by BONUS;

问题答案:

因为这本书是错误的。

中的列group byselect根据ANSI标准的中的列只有一种关系。如果某列位于中select,没有聚合函数,则该列(或其所在的表达式)需要位于该group by语句中。MySQL实际上放松了这种情况。

这甚至很有用。例如,如果要从表中为每个组选择具有最高ID的行,则写查询的一种方法是:

select t.*
from table t
where t.id in (select max(id)
               from table t
               group by thegroup
              );

(注意:还有其他方式可以编写这样的查询,这只是一个示例。)

编辑:

您建议的查询:

select EMP_ID, SALARY
from EMPLOYEE_PAY_TBL
group by BONUS;

可以在MySQL中工作,但可能不能在任何其他数据库中工作(除非BONUS碰巧是表上命名不佳的主键,但这是另一回事)。会为的每个值产生一行BONUS。对于每一行,它会得到一个任意EMP_IDSALARY该组中的行。该文档实际上说“不确定”,但我认为随意更容易理解。

真正 应该了解的这种类型的查询就是根本不使用它。中的所有“裸露”列SELECT(即没有聚合函数)都应位于中GROUP BY。在大多数数据库中,这是必需的。请注意,这与书中所说的 相反 。这样做没有问题:

select EMP_ID
from EMPLOYEE_PAY_TBL
group by EMP_ID, BONUS;

除了您可能会为同一行返回多个行EMP_ID而无法在它们之间进行区分。



 类似资料:
  • 本文向大家介绍MySQL 按列名选择,包括了MySQL 按列名选择的使用技巧和注意事项,需要的朋友参考一下 示例 询问 结果            

  • 这可能是一个复制品。但是经过一天的研究,我希望你能宽大处理。这是一个关于协方差的问题。 为什么我能这么做? 但不能这样做吗? 我读了一些关于协方差的讨论。 “C#中的协方差” “将列表转换为接口列表” “转换列表到接口列表” 我的理解是,我不能将狗的名单添加到动物名单中,因为这样我就可以将猫添加到动物名单中,这将是危险的。但是在动物列表中添加一个猫或狗的例子也同样危险,不是吗?在我看来,C#还没有

  • 问题内容: 惊喜-这是MySQL中完全有效的查询: 如果您在Oracle或SQL Server中尝试了此查询,则会收到自然错误消息: 那么MySQL如何确定每个X显示哪个Y?它只是选择一个。据我所知,它只是选择找到的第一个Y。理由是,如果Y既不是聚合函数也不在group by子句中,则在查询中指定“选择Y”是没有道理的。因此,作为数据库引擎的我将返回我想要的任何东西,而您会喜欢它。 甚至还有一个M

  • 问题内容: W3指定表列(带有元素)仅允许使用四个CSS规则- 边框,背景,宽度和可见性。 有人知道这个决定的原因吗?如果可以使用边框和背景,为什么不使用字体和颜色呢? 问题答案: IanHixie在这里详细解释:为什么只有四个属性应用于表列的奥秘。相关报价: 文本的颜色取决于其元素的“颜色”属性。除非指定,否则“ color”属性(基本上)默认为“ inherit”,这意味着“采用父元素的值”。

  • 问题内容: 我仅使用kibana搜索ElasticSearch,并且我有几个只能接受几个值的字段(最坏的情况,服务器名,30个不同的值)。 我确实了解分析对像这样的更大,更复杂的字段执行的操作,但是对于那些简单的小字段,我却无法理解分析/未分析字段的优点/缺点。 那么,对于“有限的一组值”字段(例如,服务器名:server [0-9] *,没有特殊字符可以打破),使用analyd和not_anal

  • 问题内容: 我有一个包含大量数据的数据库。我想选择所有数据,但是按一列分组。 因此,例如: 在示例列中,A是具有重复值且需要分组的列。但是B列具有不同的值,我想选择所有这些值。 最后,我想得到一个查询,导致: B列的值在jQuery手风琴中。 我已经尝试并搜索了几个小时,但仍然没有找到一种方法来进行此操作。 编辑: 我已经设法使用戈登提供的答案解决问题。使用PHP,我分解了查询结果,并通过whil