做电影网站的服务器抖音电商培训
web/
2025/10/3 9:30:35/
文章来源:
做电影网站的服务器,抖音电商培训,wordpress采集破解版,广东省住建部官网有一张表#xff0c;id是主键#xff0c;这样的写法可以返回一条记录#xff1a;复制代码 代码如下:“SELECT * FROM t HAVING idMIN(id);”但是只是把MIN换成MAX#xff0c;这样返回就是空了#xff1a;复制代码 代码如下:“SELECT * FROM t HAVING idMAX(id);”这是为什…有一张表id是主键这样的写法可以返回一条记录复制代码 代码如下:“SELECT * FROM t HAVING idMIN(id);”但是只是把MIN换成MAX这样返回就是空了复制代码 代码如下:“SELECT * FROM t HAVING idMAX(id);”这是为什么呢我们先来做个试验验证这种情况。这是表结构初始化两条记录然后试验复制代码 代码如下:rootlocalhost : plx 10:25:10 show create table t2\G*************************** 1. row ***************************Table: t2Create Table: CREATE TABLE t2 (a int(11) DEFAULT NULL,id int(10) unsigned NOT NULL AUTO_INCREMENT,PRIMARY KEY (id)) ENGINEInnoDB AUTO_INCREMENT5 DEFAULT CHARSETutf8rootlocalhost : plx 10:25:15 select * from t2;----------| a | id |----------| 1 | 1 || 1 | 3 |----------2 rows in set (0.00 sec)rootlocalhost : plx 10:25:20 SELECT * FROM t2 HAVING idMIN(id);----------| a | id |----------| 1 | 1 |----------1 row in set (0.00 sec)rootlocalhost : plx 10:25:30 SELECT * FROM t2 HAVING idMAX(id);Empty set (0.00 sec)初看之下好像真的是这样哎怎么会这样呢我再试一下把a字段改一个为10然后试下a字段复制代码 代码如下:rootlocalhost : plx 10:26:58 select * from t2;----------| a | id |----------| 10 | 1 || 1 | 3 |----------2 rows in set (0.00 sec)rootlocalhost : plx 10:28:20 SELECT * FROM t2 HAVING aMAX(a);----------| a | id |----------| 10 | 1 |----------1 row in set (0.00 sec)rootlocalhost : plx 10:28:28 SELECT * FROM t2 HAVING aMIN(a);Empty set (0.00 sec)我擦这回MAX能返回MIN不能了这又是为啥呢旁白一般来说HAVING子句是配合GROUP BY使用的单独使用HAVING本身是不符合规范的但是MySQL会做一个重写加上一个GROUP BY NULL”SELECT * FROM t HAVING idMIN(id)”会被重写为”SELECT * FROM t GROUP BY NULL HAVING idMIN(id)”这样语法就符合规范了。继续……但是这个 GROUP BY NULL 会产生什么结果呢经过查看代码和试验可以证明GROUP BY NULL 等价于 LIMIT 1复制代码 代码如下:rootlocalhost : plx 10:25:48 SELECT * FROM t2 GROUP BY NULL;----------| a | id |----------| 10 | 1 |----------1 row in set (0.00 sec)也就是说GROUP BY NULL 以后只会有一个分组里面就是第一行数据。但是如果这样MIN、MAX结果应该是一致的那也不应该MAX和MIN一个有结果一个没结果啊这是为什么呢再做一个测试。修改一下数据然后直接查看MIN/MAX的值复制代码 代码如下:rootlocalhost : plx 10:26:58 select * from t2;----------| a | id |----------| 10 | 1 || 1 | 3 |----------2 rows in set (0.00 sec)rootlocalhost : plx 10:27:04 SELECT * FROM t2 GROUP BY NULL;----------| a | id |----------| 10 | 1 |----------1 row in set (0.00 sec)rootlocalhost : plx 10:30:21 SELECT MAX(a),MIN(a),MAX(id),MIN(id) FROM t2 GROUP BY NULL;----------------------------------| MAX(a) | MIN(a) | MAX(id) | MIN(id) |----------------------------------| 10 | 1 | 3 | 1 |----------------------------------1 row in set (0.00 sec)是不是发现问题了MAX/MIN函数取值是全局的而不是LIMIT 1这个分组内的。因此当GROUP BY NULL的时候MAX/MIN函数是取所有数据里的最大和最小值所以啊”SELECT * FROM t HAVING idMIN(id)”本质上是”SELECT * FROM t HAVING id1″, 就能返回一条记录而”SELECT * FROM t HAVING idMAX(id)”本质上是”SELECT * FROM t HAVING id3″当然没有返回记录这就是问题的根源。测试一下GROUP BY a这样就对了每个分组内只有一行所以MAX/MIN一样大这回是取得组内最大和最小值。复制代码 代码如下:rootlocalhost : plx 11:29:49 SELECT MAX(a),MIN(a),MAX(id),MIN(id) FROM t2 GROUP BY a;----------------------------------| MAX(a) | MIN(a) | MAX(id) | MIN(id) |----------------------------------| 1 | 1 | 3 | 3 || 10 | 10 | 5 | 5 |----------------------------------2 rows in set (0.00 sec)GROUP BY NULL时MAX/MIN的行为是这个问题的本质所以啊尽量使用标准语法玩花样SQL之前一定要搞清楚它的行为是否与理解的一致。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/86148.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!