MYSQL  group by 有哪些注意事项

 更新时间:2022年07月05日 10:37:17   作者:​ Java中文社群 ​  
这篇文章主要介绍了MYSQL  group by 有哪些注意事项,比如我们不能在 group by 之后添加 where 查询语句,更多相关分享,需要的朋友可以参考下面文章内容

前言:

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

1.group by 后面不能加 where

在 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.having 或 group by 可单独使用

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

3.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不能用别名?为having却可以?

where 中不能使用别名,这和 MySQL 语句执行顺序有关,MySQL 语句执行顺序如下:

  • from 阶段
  • where 阶段
  • group 阶段
  • having 阶段
  • select 阶段
  • order by 阶段
  • limit 阶段

也就是说,**在执行 where 查询时,select 还没执行,因此在 where 中想要使用还未执行的 select 中的别名是不行的。**那从上面的执行顺序可以看到,having 执行也在 select 之前,为什么它就可以使用 select 中的别名呢?

这是因为 MySQL 在 5.7.5 之后做了扩展,允许在 having 中使用别名,官方文档中有相应的说明,

如下图所示: 

 MySQL 官方文档地址:

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 不能使用别名。

到此这篇关于MYSQL group by 有哪些注意事项?的文章就介绍到这了,更多相关MYSQL group by内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL锁阻塞的深入分析

    MySQL锁阻塞的深入分析

    这篇文章主要给大家介绍了关于MySQL锁阻塞的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • MySQL获取系统性能和状态代码

    MySQL获取系统性能和状态代码

    使用MySQL获取系统性能和状态的代码片段,由此需求的朋友可以参考下,希望对大家有所帮助
    2013-07-07
  • 如何修改mysql数据库的max_allowed_packet参数

    如何修改mysql数据库的max_allowed_packet参数

    本篇文章是对修改mysql数据库的max_allowed_packet参数进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 用VirtualBox构建MySQL测试环境的笔记

    用VirtualBox构建MySQL测试环境的笔记

    这篇文章主要介绍了如何用VirtualBox构建MySQL测试环境,特分享下,方便需要的朋友
    2013-08-08
  • CentOS 7下mysql 5.7 安装教程

    CentOS 7下mysql 5.7 安装教程

    这篇文章主要为大家详细介绍了CentOS 7下mysql 5.7 安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • 浅谈MySQL函数

    浅谈MySQL函数

    这篇文章主要介绍MySQL函数,主要解说数学函数、字符串函数、 时间函数、加密函数,需要的朋友可以参考下面文章具体内容
    2021-09-09
  • mysql 优化日记

    mysql 优化日记

    mysql 优化日记 使用mysql的朋友可以参考下,大家知道如果mysql优化与没优化性能会相差不少呢。
    2009-07-07
  • Linux下mysql异地自动备份的方法

    Linux下mysql异地自动备份的方法

    这篇文章主要介绍了Linux下mysql异地自动备份的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • mybatis-plus如何使用sql的date_format()函数查询数据

    mybatis-plus如何使用sql的date_format()函数查询数据

    这篇文章主要给大家介绍了关于mybatis-plus如何使用sql的date_format()函数查询数据的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-02-02
  • MySQL流程控制语句解读

    MySQL流程控制语句解读

    MySQL存储过程支持多种流程控制语句,如IF、CASE、WHILE、LOOP、REPEAT等,每种语句有特定的执行逻辑,用于实现条件判断和循环操作
    2024-11-11

最新评论