面试突击62:在使用group by时,有哪些关键点需要注意?

更新于
2026-10-09 13:52:01
1阅读来源:SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1179个文字,预计阅读时间需要5分钟。

面试突击62:在使用group by时,有哪些关键点需要注意?

请注意:以下内容基于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`用于限制返回的行数。

注意:本文以下内容基于 MySQL 5.7 InnoDB 数据库引擎。

1.group by 后面不能加 where

在 MySQL 中,所有的 SQL 查询语法要遵循以下语法顺序:

  1. select
  2. from
  3. where
  4. group by
  5. having
  6. order by
  7. limit

以上语法顺序是不能前后互换的,否则报错。比如我们不能在 group by 之后添加 where 查询语句,否则会出现如下错误:

语法顺序的执行是和 MySQL 的 select 语句执行顺序相关的,select 执行先后顺序如下:

  1. from 阶段
  2. where 阶段
  3. group 阶段
  4. having 阶段
  5. select 阶段
  6. order by 阶段
  7. limit 阶段

注意:其中 select 比较特殊,在进行查询语句编写时,要写在最前面,其余语法顺序要和执行先后顺序保持一致。

2.group by 或 having 可单独使用

having 和 group by 可以单独使用,如下查询所示:

3.group by 和 having 可使用别名

当 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 语句执行顺序如下:

面试突击62:在使用group by时,有哪些关键点需要注意?

  1. from 阶段
  2. where 阶段
  3. group 阶段
  4. having 阶段
  5. select 阶段
  6. order by 阶段
  7. 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分钟。

面试突击62:在使用group by时,有哪些关键点需要注意?

请注意:以下内容基于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`用于限制返回的行数。

注意:本文以下内容基于 MySQL 5.7 InnoDB 数据库引擎。

1.group by 后面不能加 where

在 MySQL 中,所有的 SQL 查询语法要遵循以下语法顺序:

  1. select
  2. from
  3. where
  4. group by
  5. having
  6. order by
  7. limit

以上语法顺序是不能前后互换的,否则报错。比如我们不能在 group by 之后添加 where 查询语句,否则会出现如下错误:

语法顺序的执行是和 MySQL 的 select 语句执行顺序相关的,select 执行先后顺序如下:

  1. from 阶段
  2. where 阶段
  3. group 阶段
  4. having 阶段
  5. select 阶段
  6. order by 阶段
  7. limit 阶段

注意:其中 select 比较特殊,在进行查询语句编写时,要写在最前面,其余语法顺序要和执行先后顺序保持一致。

2.group by 或 having 可单独使用

having 和 group by 可以单独使用,如下查询所示:

3.group by 和 having 可使用别名

当 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 语句执行顺序如下:

面试突击62:在使用group by时,有哪些关键点需要注意?

  1. from 阶段
  2. where 阶段
  3. group 阶段
  4. having 阶段
  5. select 阶段
  6. order by 阶段
  7. 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

关注下面二维码,订阅更多精彩内容。

关注公众号(加好友):