mysql sql where 执行顺序_MySQL 查询语句执行顺序以及On与Where条件过滤的区别,条件表达式顺序...

MySQL 查询语句执行顺序以及On与Where条件过滤的区别的MySQL查询语句的执行顺序和区别的On和Where条件过滤,Mysql中每个条件的执行顺序的处理。

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

选择

DISTINCT字段列表

从左表

连接模式JOIN右表

接通连接条件

哪里过滤条件

GROUPBY分组字段

具有包含条件

ORDERBY排序方法

LIMIT行数[,偏移量行数]的伪代码包括连接、过滤、分组、排序等。它基本上涵盖了查询语句的所有子句。

但是在SQL中,第一个要处理的子句是FROM子句,后面还要处理SQL查询中SELECT的第一个子句。

SQL查询的逻辑处理涉及的阶段如下:

格式条款

ON子句

外部条款

WHERE子句

分组依据条款

HAVING子句

SELECT子句

DISTINCT子句

订单条款

限制条款

SQL在查询各个阶级分别干了什么?

(1)Form 阶段

“从”阶段标识查询的源表,并处理表运算符。在涉及连接操作(各种连接)的查询中,

主要有以下几个步骤:

求笛卡尔乘积。不管什么类型的连接操作,首先进行交叉连接,得到笛卡尔积,生成虚拟表VT1-J1。

打开过滤器。在这一阶段,根据出现在ON子句中的“谓词”对上一步生成的VT1-J1进行过滤,以便“谓词”值为真的行通过测试并插入到VT1-J2中。

添加外部行。如果指定了外部连接,还需要将VT1-J2与VT1-J2不匹配的线路添加为外部线路,以生成VT1-JBOY3乐队。

完成上述步骤后,开始阶段完成。一般来说,FROM阶段是经过预处理的,语句中提到的每个表都是根据提供的操作符(除了join、apply、pivot、unpivot)进行处理的

(2)Where 阶段

在where阶段,根据Where谓词中的条件筛选VT1中的行,以便将具有条件的行插入到VT2中。

(3)Group By 阶段

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

(4)Having 阶段

在这个阶段,VT3的分组根据Having子句中出现的谓词进行筛选,合格的组被插入到VT4中。

(5)Select 阶段

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

评估选择列表中的表达式以生成VT5-1。

如果有DISTINCT,删除VT5-1中的重复行以生成VT5-2

如果有TOP,

,则根据 ORDER BY 子句定义的逻辑顺序,从 VT5-2 中选择签名指定数量或者百分比的行,生成 VT5-3

(6)Order By 阶段

根据 ORDER BY 子句中指定的列明列表,对 VT5-3 中的行,进行排序,生成游标 VC6 。

提示和注意事项:

SELECT先前步骤不能使用列表中创建的别名。强制执行此限制是因为在SELECT评估子句之前出现的子句(例如WHERE子句)时,可能尚未确定列值。

在某些数据库(例如MySQL)中,使用和子句中SELECT允许使用列表中创建的别名,即使这些子句出现在子句之前(并且在其之前评估)。GROUP BYHAVINGSELECT

表达式别名不能被同一SELECT列表中的其他表达式使用。这是因为评估表达式的逻辑顺序无关紧要,并且无法保证。例如,此SELECT子句可能无法按预期工作,因此不受支持:SELECT a + 1 AS x, x + 1 AS y

使用 ON 时INNER JOIN,如果在WHERE子句或ON子句中指定逻辑表达式,则无关紧要。这是正确的,因为ON和之间没有逻辑差异WHERE(除了使用OUTER JOIN或GROUP BY ALL选项时)。

使用时该DISTINCT子句是多余的GROUP BY。因此,它不会从记录集中删除任何行。

ON条件与Where条件的区别

由上述SQL查询执行的顺序可以看出,假设使用左连接(left join)时,

on条件是在生成临时表(VT1)时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

where条件是在临时表(VT1)生成好后,再对临时表进行过滤的条件,进而生成临时表(VT2)。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

on条件不是最终过滤, 因为后面left join还可能添加回来, 而where才是最终过滤.只有当使用外连接(left, right)时, on 和 where 才有这个区别, 如果用inner join, 在哪里制定都一样, 因为on 之后就是where, 中间没有其它步骤。

总结一下:

在多表联接查询时,on比where更早起作用。系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由where进行过滤,然后再计算,计算完后再由having进行过滤。由此可见,要想过滤条件起到正确的作用,首先要明白这个条件应该在什么时候起作用,然后再决定放在那里。

转载地址:http://www.mzh.ren/mysql-query-clause-execution-order.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值