(8) SELECT (9) DISTINCT (11) <TOP_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
1,FROM: LEFT TABLE and RIGHT TABLE的笛卡尔集,生成一个VT1,比如A有N条记录,B有M条,则VT1有N*M条记录。
2,ON: JOIN CONDITION, SQL中三大筛选短语之一(ON,WHERE,HAVING),从VT1中将符合条件的行取出到VT2。
三值逻辑关系:不同于传统的排中律(A∨┐A)。即TRUE, FALSE 和 UNKNOWN. UNKNOWN一般是判断逻辑中有NULL,包括NULL与NULL的比较。如 NULL > 42, NULL = NULL, X + NULL > Y.
在不同的Query element中,对NULL的处理并不一致。在三大判断逻辑(ON, WHERE, HAVING)中,NULL都会导致FALSE. 比如我们在WHERE中写 WHERE NULL > 0,则不会出现任何结果。因为默认该比较结果为FALSE。
而在其他Element中,则可能为TRUE,如给表的某个column加一个check,要求其值必须>0, 则null可以输入,因为null > 0 是unknown且在这里unknown默认为true.
在Group By和Sort中,NULL被归为一组。
3,OUTER JOIN(LEFT, RIGHT, FULL),add outer lines back this step. OUTER JOIN保证某个表的所有内容被保留到结果集内,保留表中的值如果不在VT2中,则非保留表column赋null值。得到VT3。
Question: 如果是inner join怎么办? inner join就没有step 3。其结果就是VT2。
SELECT T1.A, T2.B FROM T1,T2 WHERE T1.C=T2.C is an inner join.
4,WHERE Filter, 三大筛选短语(ON, WHERE, HAVING),将前一步的返回结果进一步条件筛选,返回逻辑判断为true的rows.
注意:where条件时以下不可用:aggregate function(因为还没有group),Aliases(别名,因为还没有select)
Question: 筛选条件写在ON和WHERE有何区别?
答:在部分OUTER JOIN中有区别。INNER JOIN不存在,因为INNER JOIN没有add outer lines这一步。
ON在add outer lines之前,如果针对保留表进行筛选,最终add outer lines之后,这些保留表的rows还会回来。
WHERE在add outer lines之后,可以保证筛选结果的正确性。
因此,ON筛选条件只能加在非保留表上。
5, GROUP BY,后续的操作只能对Groupping columns或者expression(column)进行。
6,CUBE | ROLLUP,
with cube, 根据group by的条件数量,生成 2的n次方种group结果存在同一个结果集中。
7,HAVING,对group data进行筛选
HAVING COUNT(o.orderid) < 3
Question: COUNT(*)和COUNT(o.orderid)的区别。
答案:COUNT(*)是计算行数。由于OUTER JOIN有些保留表数据其outer lines值为null,COUNT(*)时会错误计入。应正确使用COUNT(o.orderid)
8,SELECT, column aliases can used at next steps but can't used at before steps. => VT8
“ALL-AT-ONCE” Operation
9,DISTINCT,如果有GROUP BY, DISTINCT就是多余的。
10,ORDER BY,返回一个cursor而不是一个VT。ORDER BY 可以使用非selelct返回集中的column。也可以用位置来代替column name.
如:ORDER BY 2, 1;