WHERE
和HAVING
的基本区别:
-
WHERE
在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算); -
HAVING
在分组和聚集之后选取分组行。 - 因此,
WHERE
子句不能包含聚集函数(可以在子查询用聚集); 因为试图用聚集函数判断哪些行应输入给聚集运算是没有意义的。相反,HAVING
子句总是包含聚集函数(严格说来,你可以写不使用聚集的HAVING
子句, 但这样做很少有用。同样的条件用在WHERE
阶段会更有效)。
事务:
- 事务最重要的一点是将多个步骤捆绑成了一个单一的、要么全完成要么全不完成的操作。步骤之间的中间状态对于其他并发事务是不可见的,并且如果有某些错误发生导致事务不能完成,则其中任何一个步骤都不会对数据库造成影响。
- PostgreSQL实际上将每一个SQL语句都作为一个事务来执行。如果我们没有发出
BEGIN
命令,则每个独立的语句都会被加上一个隐式的BEGIN
以及(如果成功)COMMIT
来包围它
窗口函数:
- 对于每一行,在它的分区中的行集被称为它的窗口帧
- 窗口函数只允许出现在查询的
SELECT
列表和ORDER BY
子句中。它们不允许出现在其他地方,例如GROUP BY
、HAVING
和WHERE
子句中。这是因为窗口函数的执行逻辑是在处理完这些子句之后。另外,窗口函数在非窗口聚集函数之后执行。这意味着可以在窗口函数的参数中包括一个聚集函数,但反过来不行。