SQL关于GROUP的配置

问题:

为什么

select *
from (select * from A where a = 'xx' order by A.b desc) t
group by a

这个sql不报错,

select * from (SELECT *
            FROM B
            ORDER BY B.a desc) t group by B.c,B.d

这个sql报错,都是有多条记录的情况下

原因:

A表包含多个字段,上述的第一个 SQL 查询可能不会报错,这主要取决于使用的数据库管理系统(DBMS)及其配置。一些数据库系统(如 MySQL)在默认情况下允许这样的查询,即使它并不完全符合 SQL 标准。

在标准的 SQL 中,当使用 GROUP BY 时,应该只选择那些包含在 GROUP BY 子句中的列或使用聚合函数的列。然而,MySQL 在某些配置下会放宽这一限制,允许选择其他列,此时对于非分组列,它会返回每个分组中的任意值(这通常是分组中的第一个值)。这种行为可能会导致不确定的结果,因为不知道会返回哪一行的数据。

如果在使用 MySQL,并且没有启用 ONLY_FULL_GROUP_BY 选项,那么第一个查询就不会报错,即使 SELECT * 选择了所有列,而 GROUP BY 仅按 MEMBER_ID 分组。但是,如果启用了 ONLY_FULL_GROUP_BY,这个查询就会报错,因为它违反了 SQL 的分组规则。

第一个查询在某些数据库配置下可能不报错,但这并不意味着它是一个好的或正确的查询。为了避免潜在的问题和不确定性,最好始终遵循 SQL 的标准规则。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jc_hsx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值