where基于from的数据做的筛选;
(个人理解)having基于select的数据做的筛选
按照以上的理解,可以做以下测试:
表名student,列名及数据:
+------+--------+------+------+
| SId | Sname | Sage | Ssex |
+------+--------+------+------+
| 1 | 张三 | 18 | 男 |
| 2 | 李四 | 20 | 男 |
| 3 | 王武 | 22 | 男 |
| 4 | 小白 | 20 | 女 |
+------+--------+------+------+
mysql> select * from student a where a.Sage > 20;
+------+--------+------+------+
| SId | Sname | Sage | Ssex |
+------+--------+------+------+
| 3 | 王武 | 22 | 男 |
+------+--------+------+------+
1 row in set (0.00 sec)
mysql> select * from student a having a.Sage > 20;
+------+--------+------+------+
| SId | Sname | Sage | Ssex |
+------+--------+------+------+
| 3 | 王武 | 22 | 男 |
+------+--------+------+------+
mysql> select a.Sname from student a having a.Sage > 20;
ERROR 1054 (42S22): Unknown column 'a.Sage' in 'having clause'
错误原因:select中没有Sage字段
mysql> select max(a.Sage) as ma from student a where ma > 20;
ERROR 1054 (42S22): Unknown column 'ma' in 'where clause'
错误原因:where 后不能使用select中的别名或聚合行数
mysql> select max(a.Sage) as ma from student a having ma > 20;
+------+
| ma |
+------+
| 22 |
+------+
1 row in set (0.00 sec)