mysql - GROUP BY 语法 Mysql - 省略可分组的列
问题描述
我有带有 X、Y、Z 列的表 A。
X 是 FK,Y 是描述。每个 X 都有一个对应的 Y。因此,如果 X 在多条记录中保持不变,则 Y 也保持不变。因此,可能有任意数量的 X 和 Y 相同的记录。
现在我正在运行以下查询:
SELECT X, Y
FROM A
GROUP BY X;
这个查询会起作用吗?Y 应该与 X 一起分组,但我没有在查询中明确指定它。MySQL 是否仍然隐含地采取这种方式?这种行为是否可靠/标准化?此外,结果是否会根据 Y 的数据类型而有所不同。例如,如果 Y 是 VARCHAR、CHAR 或 INT,是否会有所不同?如果是 int,结果会是分组记录的 SUM() 吗?
MySQL 在这种情况下会暴露的行为是规范/标准化的吗?我在哪里可以查到它?
解决方案
每一个
X
都有一个对应的Y
SELECT X, Y FROM A GROUP BY X;
这个查询会起作用吗?
从技术上讲,当您在 MySQL 下运行此查询时会发生什么取决于是否启用了 sql 模式ONLY_FULL_GROUP_BY
:
如果启用,查询错误:所有非聚合列必须出现在
GROUP BY
子句中(您需要添加Y
到GROUP BY
子句中)否则,查询将执行,并为您提供一个任意值
Y
for eachX
; 但由于Y
函数依赖于X
,因此该值实际上是可预测的,所以这没关系。
GROUP BY
通常,尽管 SQL 标准确实承认函数依赖列的概念,但在子句中始终包含所有非聚合列是一种很好的做法。它也是 MySQL 以外的大多数数据库的要求(从 MySQL 5.7 开始,ONLY_FULL_GROUP_BY
默认启用)。这也可以防止您陷入各种陷阱和不可预测的行为。
UsingANY_VALUE()
使查询对于其目的既有效又明确:
SELECT X, ANY_VALUE(Y) FROM A GROUP BY X;
请注意,如果您只想要 的不同组合X, Y
,则使用起来更简单SELECT DISTINCT
:
SELECT DISTINCT X, Y FROM A;
推荐阅读
- ios - 如何在swift中手动手动调用tableview的cellforrowat?
- swift - 更改选定的单元格图像 uitableview
- visual-studio - 为什么我们不能在非系统驱动器上安装大部分 Visual Studio 2019?
- sql - 如何从提到的查询中获取需要记录
- css - 替换搜索和购物篮图标 shopisle
- python - pyspark 中的分桶和一种热编码
- c# - C# WPF:模糊文本
- javascript - 如何在量角器中与黄瓜框架共享网络驱动程序
- python - 如何在 pyplot 中使用 xlim 绘制时间戳
- netlogo - 设置半径寻找伙伴龟