Where(MySQL查询语句的执行顺序以及On和Where条件过滤的区别)是什么意思
admin
2023-08-28 22:23:05

以下是一段MySQL查询语句代码:

挑选

独特字段列表

从左侧表格

连接模式连接右表

接通状态

其中过滤条件

分组依据分组字段

具有包含条件

ORDERBY排序方法

LIMIT限制行数[,偏移行数]

以上伪代码,包括连接,过滤,分组,排序等。基本涵盖了查询语句的所有子句。

但是在SQL中,第一个要处理的子句是FROM子句,SQL查询中SELECT的第一个子句会在后面处理。SQL查询的逻辑处理包括以下阶段:

FROM子句ON子句OUTER子句WHERE子句GROUPBY子句HAVING子句SELECT子句DISTINCT子句ORDERBY子句LIMIT子句SQL在查询每个类时做了什么?

(1)FROM阶段

FROM阶段标识查询的源表,并处理表运算符。在涉及连接操作(各种连接)的查询中,主要有以下步骤:

求笛卡尔积。无论何种类型的连接操作,第一步都是执行交叉连接,找到笛卡尔积并生成虚拟表VT1-J1。在过滤器上。在这个阶段中,根据ON子句中出现的谓词过滤上一步中生成的VT1-J1,以便具有true谓词的行通过测试并插入到VT1-J2中。添加外部行。如果指定了outerjoin,还需要添加VT1-J2中与外部线路不匹配的线路,以生成VT1-JBOY3乐队。完成上述步骤后,FROM阶段完成。一般来说,FROM阶段是预处理,语句中提到的表是根据提供的操作符(join、apply、pivot和unpivot除外)进行处理的。

(2)WHERE阶段

WHERE阶段,根据where_predicate中的条件过滤VT1中的行,满足条件的行将被插入VT2。

(3)GROUPBY阶段

分组阶段,根据指定的列名列表对VT2中的行进行分组,以生成VT3。最后,每组只有一行。

(4)HAVING阶段

此阶段根据HAVING子句中出现的谓词过滤VT3的分组,并将合格的组插入VT4。

这个阶段

(5)SELECT阶段

是一个投影过程,它处理SELECT子句中提到的元素并生成VT5。该步骤通常按以下顺序进行:

评估选择列表中的表达式以生成VT5-1。如果有,VT5-1中的重复行将被删除以生成VT5-2。如果有TOP,将根据ORDERBY子句中定义的逻辑顺序从VT5-2中选择具有指定数量或百分比的行,以生成VT5-3

(6)ORDERBY阶段

。根据ORDERBY子句中指定的列表,VT5-3中的行将被排序以生成游标VC6。

提示和注意事项

在列表中创建的别名不能用于前面的选择步骤。之所以实施此限制,是因为当出现在SELECT evaluation子句(如WHERE子句)之前的子句。在某些数据库(如MySQL)中,在and子句中使用SELECT允许使用在列表中创建的别名,即使这些子句出现在子句之前(并且在子句之前被求值)。同一选择列表中的其他表达式不能使用GROUPBYHAVINGSELECT表达式别名。这是因为求值表达式的逻辑顺序是不相关的,也不能保证。例如,此SELECT子句可能无法按预期工作,因此不受支持:SELECTa 1ASx,x 1ASy使用INNERJOIN,无论在WHERE子句还是on子句中指定了逻辑表达式,都没有关系。这是正确的,因为ON和WHERE之间没有逻辑上的区别(除非使用OUTERJOIN或GROUPBYALL选项)。DISTINCT子句在使用时是多余的。因此,它不会从记录集中删除任何行。

on条件与where条件的区别

从上面SQL查询的执行顺序可以看出,如果使用leftjoin,

On条件是生成临时表(VT1)时使用的条件。无论on中的条件是否为真,它都将返回左侧表中的记录。where条件是在生成临时表(VT1)之后对其进行过滤,然后生成临时表(VT2)的条件。此时没有leftjoin的意义(必须返回左表中的记录),所有条件不为真的都被过滤掉。on条件不是最终过滤器,因为leftjoin可能会在以后添加回来,而where是最终过滤器。只有在使用外连接(left,right)时,on和where才有这种区别。如果使用了innerjoin,那么它的生成位置是一样的,因为中间没有其他步骤。

总而言之:

在多表连接查询中,on比where工作得早。系统首先根据表与表之间的连接条件,将多个表组合成一个临时表,然后按where筛选,再计算,计算后再按have筛选。可见,要想正确筛选条件,首先要了解这个条件应该在什么时候起作用,然后再决定放在哪里。

参考资料

https://blog . csdn . net/leehowee/article/details/20281435https://www . design cise.com/web/tutorial/what-the-the-order-of-an-SQL-query http://blog . jobbole.com/40443/https://stack overflow.com/questions/24127932/MySQL-query-clause-execution-order

相关内容

热门资讯

金花创建房间/微信金花房卡怎么... 1.微信渠道:(荣耀联盟)大厅介绍:咨询房/卡添加微信:88355042 2.微信游戏中心:打开微...
金花房间卡/金花房卡如何购买/... 金花房间卡/金花房卡如何购买/新超圣金花房卡正版如何购买新超圣是一款非常受欢迎的游戏,咨询房/卡添加...
牛牛创建房间/金花房卡批发/神... 微信游戏中心:神牛大厅房卡在哪里买打开微信,添加客服【88355042】,进入游戏中心或相关小程序,...
链接牛牛/牛牛房卡游戏代理/鸿... 鸿运大厅房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根...
科技实测!牛牛房卡怎么获得/乐... 微信游戏中心:乐酷大厅房卡在哪里买打开微信,添加客服【88355042】,进入游戏中心或相关小程序,...