• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > MySQL无GROUP BY直接HAVING返回空的问题分析

MySQL无GROUP BY直接HAVING返回空的问题分析

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了mysql having by,mysql having,mysql having用法,mysql中having的用法,mysql having count等相关知识,希望本文的分享对您有所帮助

有一张表,id是主键,这样的写法可以返回一条记录:

初看之下,好像真的是这样哎,怎么会这样呢?我再试一下,把a字段改一个为10,然后试下a字段:

我擦,这回MAX能返回,MIN不能了,这又是为啥呢?

旁白
一般来说,HAVING子句是配合GROUP BY使用的,单独使用HAVING本身是不符合规范的,
但是MySQL会做一个重写,加上一个GROUP BY NULL,”SELECT * FROM t HAVING id=MIN(id)”会被重写为”SELECT * FROM t GROUP BY NULL HAVING id=MIN(id)”,这样语法就符合规范了。
继续……
但是,这个 GROUP BY NULL 会产生什么结果呢?经过查看代码和试验,可以证明,GROUP BY NULL 等价于 LIMIT 1:

也就是说,GROUP BY NULL 以后,只会有一个分组,里面就是第一行数据。
但是如果这样,MIN、MAX结果应该是一致的,那也不应该MAX和MIN一个有结果,一个没结果啊,这是为什么呢,再做一个测试。
修改一下数据,然后直接查看MIN/MAX的值:

是不是发现问题了?
MAX/MIN函数取值是全局的,而不是LIMIT 1这个分组内的。
因此,当GROUP BY NULL的时候,MAX/MIN函数是取所有数据里的最大和最小值!
所以啊,”SELECT * FROM t HAVING id=MIN(id)”本质上是”SELECT * FROM t HAVING id=1″, 就能返回一条记录,而”SELECT * FROM t HAVING id=MAX(id)”本质上是”SELECT * FROM t HAVING id=3″,当然没有返回记录,这就是问题的根源。
测试一下GROUP BY a,这样就对了,每个分组内只有一行,所以MAX/MIN一样大,这回是取得组内最大和最小值。

GROUP BY NULL时MAX/MIN的行为,是这个问题的本质,所以啊,尽量使用标准语法,玩花样SQL之前,一定要搞清楚它的行为是否与理解的一致。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • MySQL中无GROUP BY情况下直接使用HAVING语句的问题探究
  • MySQL无GROUP BY直接HAVING返回空的问题分析

相关文章

  • 2018-12-05SQLserver 2008将数据导出到Sql脚本文件的方法
  • 2018-12-05MySQL 绿色版安装方法图文教程
  • 2017-05-11mysql支持跨表delete删除多表记录
  • 2018-12-05汇总整理MYSQL相关操作命令
  • 2017-05-11VMware中Linux共享mysql数据库的方法
  • 2018-12-05MSSQL批量替换语句 在SQL SERVER中批量替换字符串的方法
  • 2018-12-05MySQL实现同时查询更新同一张表的实例分析
  • 2018-12-05MySQL 随机查询数据与随机更新数据实现代码
  • 2017-05-11mysql 关键词相关度排序方法详细示例分析
  • 2018-12-05列出SQL Server中具有默认值的所有字段的语句

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • MySQL的安装与配置经验分享
    • mysql嵌套查询和联表查询优化方法
    • Sql Server 2012 转换函数的比较(Cast、Convert和Parse)
    • 总结10篇索引操作的实例教程
    • 详解MySQL根(Root)密码在Linux(CentOS)下如何重置(图文)
    • oracle 常见等待事件及处理方法
    • 101个MySQL优化技巧和提示
    • 分享20个数据库设计的最佳实践
    • mySQL用代码添加表格内容和删除数据方法
    • 超详细mysql left join,right join,inner join用法分析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有