当前位置: 首页 > 后端技术 > Java

面试惊喜62:groupby的注意事项有哪些?

时间:2023-04-01 19:21:14 Java

注:本文以下内容基于MySQL5.7InnoDB数据库引擎。1、groupby后不能加where在MySQL中,所有SQL查询语法必须遵循如下语法顺序:selectfromwheregroupbyhavingorderbylimit以上语法顺序不能互换,否则会报错。比如我们不能在groupby后面加上where查询语句,否则会出现如下错误:语法顺序的执行与mysqlselect语句的执行顺序有关,select的执行顺序如下:fromstagewherestagegroupstagehavingstageselectstageorderAttentioninthebystageandthelimitstage:selectisspecial.写查询语句时,应该写在最前面,其余语法的顺序要与执行顺序一致。2.groupby或having可以单独使用。having和groupby可以单独使用,如下查询所示:3.groupby和having可以使用别名having单独使用时,其功能与where类似,但有细微差别。比如where不能用别名,而having和groupby可以用别名。让我们创建一个测试表来演示。表SQL如下:droptableifexistsstudent_score;createtablestudent_score(idintprimarykeyauto_incrementcomment'主键',namevarchar(250)comment'姓名',mathdecimal(4,1)comment'数学成绩',chinesedecimal(4,1)comment'语文成绩');insertintostudent_score(name,math,chinese)values('张三',50,50),('李四',80,80),('王五',90,90);表中数据如下图所示:当我们分别在where和having中使用总分别名total时,查询结果如下:从上面的结果我们可以看出,having查询可以在select中使用别名,但是在哪里不能使用别名。groupby除了having可以使用别名外,还可以使用别名,如下图:为什么可以使用别名?where不能使用别名,这与MySQL语句的执行顺序有关。MySQL语句的执行顺序是:fromstagewherestagegroupstagehavingstageselectstageorderbystagelimitstage也就是执行where查询时,还没有执行select。因此,在where中没有执行过的select中是不可能使用别名的。从上面的执行顺序可以看出,having是在select之前执行的,那为什么可以在select中使用别名呢?这是因为MySQL在5.7.5之后扩展了允许在having中使用别名。官方文档中有相应的说明,如下图:MySQL官方文档地址:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.htmlPS:原理是groupbycanusealiases类似于having。总结SQL语句的编写必须遵循这样的顺序:select、from、where、groupby、having、orderby、limit。其中having或groupby可以单独使用,MySQL5.7.5以后groupby和having可以使用别名查询,where不能使用别名。判断是非在自己,名誉在别人,得失在人数。公众号:Java面试真题分析面试合集:https://gitee.com/mydb/interview