• 面试官:group by 有哪些注意事项?


    1.group by 后面不能加 where

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

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

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

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

    2.group by 或 having 可单独使用

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

    820eb40808c54ed4b7d072a3dde40b7e.png 

    3.group by 和 having 可使用别名

    当 having 单独使用时,它的作用和 where 类似,但又有细微的不同。比如在 where 中不能使用别名,但 having 和 group by 却可以别名。咱们创建一个测试表来演示一下,建表 SQL 如下:

    9cb511a1615f4cea8ef5af0c2b38a0fd.png
    表中的数据如下图所示: 

    29587392371e4b7aa59883dd2880f5d2.png
    当我们使用总成绩别名 total 分别在 where 和 having 中使用时,查询结果如下: 

    43056ee6bf5c4e20861a6e0c67367331.png
    从上述结果可以看出,having 查询可以使用 select 中的别名,而 where 不能使用别名。 除了 having 可以使用别名之外,group by 也可以使用别名,如下图所示: 

    65efd10eec354b5db438434c4f5f8ea7.png 

    为什么可用别名?

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

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

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

    4f03f2983b004bf385d8a6bb4989e9fe.png
    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 不能使用别名。

  • 相关阅读:
    activiti7的数据表和字段的解释
    堆内存诊断
    C++进阶语法——OOP(面向对象)【学习笔记(四)】
    netty系列之:在netty中实现线程和CPU绑定
    Docker安装Redis——下载Redis镜像——创建配置文件——创建容器实例并启动
    HAL库配置通用定时器TIM触发ADC采样,然后DMA搬运到内存空间。
    工资短信-模板参考
    【python】(一)字符串基本操作
    无需CORS,用nginx解决跨域问题,轻松实现低代码开发的前后端分离
    Starday为什么是跨境电商卖家的不二之选?
  • 原文地址:https://blog.csdn.net/m0_72088858/article/details/126845365