标题2.5章节 查询表
1.在一些数据库系统中,包括旧版本的PostgreSQL, DISTINCT的实现会自动对行进行排序,因此ORDER BY是不必要的。 但是这不是SQL标准所要求的,而且当前的PostgreSQL不保证DISTINCT会导致行被排序。
标题2.7. 聚合函数
1.where子句不能使用聚合,例如 SELECT city FROM weather WHERE temp_lo = max(temp_lo); --错误
因为WHERE子句确定了哪些行将包含在聚合计算中。从而得到聚合的结果。 通常情况下,可以使用子查询,SELECT city FROM weather WHERE temp_lo = (SELECT max(temp_lo) FROM weather); --正确
子查询是一个独立的计算,它计算自己的聚合与外部查询中发生的事情分开。
2.HAVING过滤这些分组的行:SELECT city, max(temp_lo) FROM weather GROUP BY city HAVING max(temp_lo) < 40;
3.WHERE和HAVING之间的根本区别在于:WHERE在计算组和聚合之前选择输入行(因此,它控制哪些行进入聚合计算),而HAVING在计算组和聚合之后选择组行。因此,该WHERE子句不得包含聚合函数;尝试使用聚合来确定哪些行将作为聚合的输入是没有意义的。
另一方面,HAVING子句总是包含聚合函数。(严格来说,你可以写一个HAVING不使用聚合的子句,但它很少有用。在这个阶段可以更有效地使用相同的条件WHERE。)