繁体   English   中英

MySQL聚合函数问题

[英]MySQL aggregate function problem

在下面的示例中,为什么min()查询返回结果,但max()查询不返回结果?

mysql> create table t(id int, a int);
Query OK, 0 rows affected (0.10 sec)

mysql> insert into t(id, a) values(1, 1);
Query OK, 1 row affected (0.03 sec)

mysql> insert into t(id, a) values(1, 2);
Query OK, 1 row affected (0.02 sec)

mysql> select * from t
    -> ;
+------+------+
| id   | a    |
+------+------+
|    1 |    1 |
|    1 |    2 |
+------+------+
2 rows in set (0.00 sec)

mysql> select * from t where a < 4;
+------+------+
| id   | a    |
+------+------+
|    1 |    1 |
|    1 |    2 |
+------+------+
2 rows in set (0.00 sec)

mysql> select * from t where a < 4 having a = max(a);
Empty set (0.00 sec)

mysql> select * from t where a < 4 having a = min(a);
+------+------+
| id   | a    |
+------+------+
|    1 |    1 |
+------+------+
1 row in set (0.00 sec)

HAVING子句用于过滤行组。 您引用min(a)max(a)其(在不存在任何的GROUP BY子句)聚合在所有a表中的值,但是然后使用针对单一的比较a值。

因此,这a值的MySQL应该使用? 我所知道的所有其他RDBMS都会在此时抛出错误,但MySQL确实允许这样做。 来自文档

标准SQL不允许HAVING子句命名GROUP BY子句中找不到的任何列,除非它包含在聚合函数中。 MySQL允许使用这些列来简化计算。 此扩展假定非组合列具有相同的分组值。 否则,结果是不确定的。

所以你的情况从结果你得到看来,它结束了使用1作为标量值a但这种行为并不能完全保证其可以等效地使用2或任何其他现有的a值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM