暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

点解? MySQL数据库里"不严谨"的分组查询

FocusOnMrBen 2022-07-28
451

        MySQL的分组查询与其他数据库有一点不同的地方,不需要查询的字段一定处于分组条件里和聚合函数里。

        

        这一点和SQL语句的严谨性和准确性仿佛有些矛盾。

        

        以同样的表结构和测试数据。在不同的关系型数据库中经过测试,只有MySQL数据库和SQLite可以执行分组查询。如查询结果里的 “f1,f5” 两列,既不存在于group by语句中,也没有经过聚合查询。但是在MySQL中会正常执行,返回值则是测试数据的默认顺序里的第一行,无论第一行字段值是否为空。

        

        

  表结构及测试数据

CREATE TABLE `tab02` (

  `f1` int NOT NULL,

  `f2` varchar(200) DEFAULT NULL,

  `f3` varchar(200) DEFAULT NULL,

  `f4` varchar(200) DEFAULT NULL,

  `f5` varchar(200) DEFAULT NULL,

  PRIMARY KEY (`f1`)

);

INSERT INTO db2022.tab02 (f1,f2,f3,f4,f5) VALUES

 (1,'aa','bb','cc','dd'),

 (2,'aa','bb','cc','ee'),

 (3,'aa','bb','cc','ff'),

 (4,'aa','bb','cc','gg'),

 (5,'aa','bb','zz','dd'),

 (6,'aa','bb','zz','ee'),

 (7,'aa','bb','zz','ff'),

 (8,'aa','bb','zz','gg');


数据库版本:MySQL8.0.27

    

  


GROUP BY


        返回值中的“f1, f5”这两个字段,既没在group by语句里,也没经过 SUM,MIN,GROUP_CONCAT等等聚合运算。从当前结果来看,只是把未分组数据中的第一行拿了回来。这如果出现在子查询或者活动数据中,不就意味着SQL结果集的不可控?


        经过测试,相同的情况在SQLite数据库中也会出现。不过在其他常用的关系型数据库中,都不会出现。例如SqlServer,DB2,Oracle,PostgreSQL等。因为这样的查询语句,会在编译阶段就报错。

    

在SqlServer中测试的报错信息:


PG中的报错,类似



DB2和Oracle



        这次突然遇到这个GroupBy语句的特殊情况,在过往的开发和运维工作经历中是没有遇到过的。SQL语句向来是秉持着严谨的运算逻辑,编写时要考虑到各种约束和边界条件,实在想不通MySQL这么通用的数据库语法中竟然保留有这样具有随机性的东西。不了解这一点,在开发和调优上会很容易踩坑。出现诸如前后查询数据不一致,数据不完整等情况。                 

文章转载自FocusOnMrBen,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论