(转)SQL 执行顺序

(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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值