MySQL聚合函数问题

Jus*_*ner 8 mysql aggregate-functions

在以下示例中,为什么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)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 7

HAVING子句用于过滤行组.您引用min(a)max(a)(在没有任何GROUP BY子句的情况下)聚合a表中的所有值,然后使用针对单个a值的比较.

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

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

所以在你的情况下你得到的结果似乎它最终1用作标量值,a但这种行为不能得到保证,它同样可以使用2或任何其他现有a值.

  • 正确的方法是使用子查询:`select*from t其中a =(从t中选择min(a));` (2认同)