面试突击62:在使用group by时,有哪些关键点需要注意?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1179个文字,预计阅读时间需要5分钟。
请注意:以下内容基于MySQL 5.7及InnoDB数据库引擎的查询语法。
在MySQL中,使用`GROUP BY`子句时,通常不能直接在后面添加`WHERE`子句。这是因为`WHERE`子句用于过滤行,而`GROUP BY`用于对结果集进行分组。正确的顺序应该是先使用`WHERE`子句过滤数据,然后使用`GROUP BY`对过滤后的结果进行分组。
以下是SQL查询的正确顺序示例:
sqlSELECT column1, column2, ...FROM table_nameWHERE conditionGROUP BY column1, column2, ...HAVING conditionORDER BY column1, column2, ...LIMIT number;
在这个顺序中,`SELECT`用于指定要选择的数据列,`FROM`指定了数据来源的表,`WHERE`用于过滤行,`GROUP BY`用于对结果进行分组,`HAVING`用于过滤分组后的结果,`ORDER BY`用于对结果进行排序,最后`LIMIT`用于限制返回的行数。
1.group by 后面不能加 where注意:本文以下内容基于 MySQL 5.7 InnoDB 数据库引擎。
在 MySQL 中,所有的 SQL 查询语法要遵循以下语法顺序:
- select
- from
- where
- group by
- having
- order by
- limit
以上语法顺序是不能前后互换的,否则报错。比如我们不能在 group by 之后添加 where 查询语句,否则会出现如下错误:
语法顺序的执行是和 MySQL 的 select 语句执行顺序相关的,select 执行先后顺序如下:
- from 阶段
- where 阶段
- group 阶段
- having 阶段
- select 阶段
- order by 阶段
- limit 阶段
注意:其中 select 比较特殊,在进行查询语句编写时,要写在最前面,其余语法顺序要和执行先后顺序保持一致。
2.group by 或 having 可单独使用having 和 group by 可以单独使用,如下查询所示:
当 having 单独使用时,它的作用和 where 类似,但又有细微的不同。比如在 where 中不能使用别名,但 having 和 group by 却可以别名。咱们创建一个测试表来演示一下,建表 SQL 如下:
drop table if exists student_score;
create table student_score(
id int primary key auto_increment comment '主键',
name varchar(250) comment '姓名',
math decimal(4,1) comment '数学成绩',
chinese decimal(4,1) comment '语文成绩'
);
insert into student_score(name,math,chinese) values('张三',50,50),('李四',80,80),('王五',90,90);
表中的数据如下图所示:
当我们使用总成绩别名 total 分别在 where 和 having 中使用时,查询结果如下:
从上述结果可以看出,having 查询可以使用 select 中的别名,而 where 不能使用别名。
除了 having 可以使用别名之外,group by 也可以使用别名,如下图所示:
where 中不能使用别名,这和 MySQL 语句执行顺序有关,MySQL 语句执行顺序如下:
- from 阶段
- where 阶段
- group 阶段
- having 阶段
- select 阶段
- order by 阶段
- limit 阶段
也就是说,在执行 where 查询时,select 还没执行,因此在 where 中想要使用还未执行的 select 中的别名是不行的。那从上面的执行顺序可以看到,having 执行也在 select 之前,为什么它就可以使用 select 中的别名呢?
这是因为 MySQL 在 5.7.5 之后做了扩展,允许在 having 中使用别名,官方文档中有相应的说明,如下图所示:
MySQL 官方文档地址:dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
总结PS:group by 能使用别名的原理和 having 类似。
SQL 语句编写一定要遵循此先后顺序:select、from、where、group by、having、order by、limit。其中 having 或 group by 都可单独使用,并且在 MySQL 5.7.5 之后,group by 和 having 可以使用别名查询,但 where 不能使用别名。
关注下面二维码,订阅更多精彩内容。是非审之于己,毁誉听之于人,得失安之于数。
公众号:Java面试真题解析
面试合集:gitee.com/mydb/interview
关注公众号(加好友):
本文共计1179个文字,预计阅读时间需要5分钟。
请注意:以下内容基于MySQL 5.7及InnoDB数据库引擎的查询语法。
在MySQL中,使用`GROUP BY`子句时,通常不能直接在后面添加`WHERE`子句。这是因为`WHERE`子句用于过滤行,而`GROUP BY`用于对结果集进行分组。正确的顺序应该是先使用`WHERE`子句过滤数据,然后使用`GROUP BY`对过滤后的结果进行分组。
以下是SQL查询的正确顺序示例:
sqlSELECT column1, column2, ...FROM table_nameWHERE conditionGROUP BY column1, column2, ...HAVING conditionORDER BY column1, column2, ...LIMIT number;
在这个顺序中,`SELECT`用于指定要选择的数据列,`FROM`指定了数据来源的表,`WHERE`用于过滤行,`GROUP BY`用于对结果进行分组,`HAVING`用于过滤分组后的结果,`ORDER BY`用于对结果进行排序,最后`LIMIT`用于限制返回的行数。
1.group by 后面不能加 where注意:本文以下内容基于 MySQL 5.7 InnoDB 数据库引擎。
在 MySQL 中,所有的 SQL 查询语法要遵循以下语法顺序:
- select
- from
- where
- group by
- having
- order by
- limit
以上语法顺序是不能前后互换的,否则报错。比如我们不能在 group by 之后添加 where 查询语句,否则会出现如下错误:
语法顺序的执行是和 MySQL 的 select 语句执行顺序相关的,select 执行先后顺序如下:
- from 阶段
- where 阶段
- group 阶段
- having 阶段
- select 阶段
- order by 阶段
- limit 阶段
注意:其中 select 比较特殊,在进行查询语句编写时,要写在最前面,其余语法顺序要和执行先后顺序保持一致。
2.group by 或 having 可单独使用having 和 group by 可以单独使用,如下查询所示:
当 having 单独使用时,它的作用和 where 类似,但又有细微的不同。比如在 where 中不能使用别名,但 having 和 group by 却可以别名。咱们创建一个测试表来演示一下,建表 SQL 如下:
drop table if exists student_score;
create table student_score(
id int primary key auto_increment comment '主键',
name varchar(250) comment '姓名',
math decimal(4,1) comment '数学成绩',
chinese decimal(4,1) comment '语文成绩'
);
insert into student_score(name,math,chinese) values('张三',50,50),('李四',80,80),('王五',90,90);
表中的数据如下图所示:
当我们使用总成绩别名 total 分别在 where 和 having 中使用时,查询结果如下:
从上述结果可以看出,having 查询可以使用 select 中的别名,而 where 不能使用别名。
除了 having 可以使用别名之外,group by 也可以使用别名,如下图所示:
where 中不能使用别名,这和 MySQL 语句执行顺序有关,MySQL 语句执行顺序如下:
- from 阶段
- where 阶段
- group 阶段
- having 阶段
- select 阶段
- order by 阶段
- limit 阶段
也就是说,在执行 where 查询时,select 还没执行,因此在 where 中想要使用还未执行的 select 中的别名是不行的。那从上面的执行顺序可以看到,having 执行也在 select 之前,为什么它就可以使用 select 中的别名呢?
这是因为 MySQL 在 5.7.5 之后做了扩展,允许在 having 中使用别名,官方文档中有相应的说明,如下图所示:
MySQL 官方文档地址:dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
总结PS:group by 能使用别名的原理和 having 类似。
SQL 语句编写一定要遵循此先后顺序:select、from、where、group by、having、order by、limit。其中 having 或 group by 都可单独使用,并且在 MySQL 5.7.5 之后,group by 和 having 可以使用别名查询,但 where 不能使用别名。
关注下面二维码,订阅更多精彩内容。是非审之于己,毁誉听之于人,得失安之于数。
公众号:Java面试真题解析
面试合集:gitee.com/mydb/interview
关注公众号(加好友):

