以下是一段MySQL查询语句代码:
挑选
独特字段列表
从左侧表格
连接模式连接右表
接通状态
其中过滤条件
分组依据分组字段
具有包含条件
ORDERBY排序方法
LIMIT限制行数[,偏移行数]
以上伪代码,包括连接,过滤,分组,排序等。基本涵盖了查询语句的所有子句。
但是在SQL中,第一个要处理的子句是FROM子句,SQL查询中SELECT的第一个子句会在后面处理。SQL查询的逻辑处理包括以下阶段:
FROM子句ON子句OUTER子句WHERE子句GROUPBY子句HAVING子句SELECT子句DISTINCT子句ORDERBY子句LIMIT子句SQL在查询每个类时做了什么?
求笛卡尔积。无论何种类型的连接操作,第一步都是执行交叉连接,找到笛卡尔积并生成虚拟表VT1-J1。在过滤器上。在这个阶段中,根据ON子句中出现的谓词过滤上一步中生成的VT1-J1,以便具有true谓词的行通过测试并插入到VT1-J2中。添加外部行。如果指定了outerjoin,还需要添加VT1-J2中与外部线路不匹配的线路,以生成VT1-JBOY3乐队。完成上述步骤后,FROM阶段完成。一般来说,FROM阶段是预处理,语句中提到的表是根据提供的操作符(join、apply、pivot和unpivot除外)进行处理的。
在
在
这个阶段
评估选择列表中的表达式以生成VT5-1。如果有,VT5-1中的重复行将被删除以生成VT5-2。如果有TOP,将根据ORDERBY子句中定义的逻辑顺序从VT5-2中选择具有指定数量或百分比的行,以生成VT5-3
On条件是生成临时表(VT1)时使用的条件。无论on中的条件是否为真,它都将返回左侧表中的记录。where条件是在生成临时表(VT1)之后对其进行过滤,然后生成临时表(VT2)的条件。此时没有leftjoin的意义(必须返回左表中的记录),所有条件不为真的都被过滤掉。on条件不是最终过滤器,因为leftjoin可能会在以后添加回来,而where是最终过滤器。只有在使用外连接(left,right)时,on和where才有这种区别。如果使用了innerjoin,那么它的生成位置是一样的,因为中间没有其他步骤。
总而言之:
在多表连接查询中,on比where工作得早。系统首先根据表与表之间的连接条件,将多个表组合成一个临时表,然后按where筛选,再计算,计算后再按have筛选。可见,要想正确筛选条件,首先要了解这个条件应该在什么时候起作用,然后再决定放在哪里。