In the following example, why does the min() query return results, but the max() query does not?
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)
The
HAVINGclause is used to filter groups of rows. You referencemin(a)andmax(a)which (in the absence of anyGROUP BYclause) aggregate over allavalues in the table but then use a comparison against a singleavalue.So which
avalue is MySQL supposed to use? All other RDBMSs that I know of would throw an error at this point however MySQL does allow this. From the docsSo in your case from the results you are getting it appears that it ended up using
1as the scalar value forabut this behaviour is not guaranteed and it could equally well have used2or any other existingavalue.