先看一下这个SQL
SELECT o.custid, c.name, MAX(o.payment)
FROM orders AS o, customers AS c
WHERE o.custid = c.custid
GROUP BY o.custid;
在标准SQL中,上面这句查询 是不合法的,因为该查询包含Group by子句,所以在select列表中的列只能是group by里面声明的列,或者是使用了聚集函数的列。而上面这句SQL中c.name不属于这两者
但是在Mysql中对Group by功能进行了扩展,使得在包含有group by子句的查询中也能select没有使用聚集函数的列,也就是说上面这句话在Mysql里面是合法的。可是,语句虽然合法,但是Mysql并不保证该列的正确性,Mysql只会从分组中随意的取出该列的值,也就是说在每一个分组中,未聚集的列的值如果都是相同的,那么这句话没有任何问题,否则就可能出错。
同理,对于Having子句也存在同样的问题。
标准SQL是不允许Having子句中引用未在group by子句中出现的列,除非该列是使用了聚集函数
Mysql对Having的扩展与其对Group by的扩展类似