sql执行顺序以及内连接和外连接ON和WHERE的区别

SQL查询的执行顺序包括FROM、JOIN、ON、WHERE、GROUPBY、HAVING、SELECT、DISTINCT、ORDERBY和LIMIT等步骤。FROM和JOIN构建虚拟表,ON和WHERE进行条件筛选,GROUPBY用于分组,HAVING针对分组后的数据过滤,SELECT选择字段,DISTINCT去重,ORDERBY排序,LIMIT限制返回行数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Sql的执行顺序,

  1. From

from对需要查询的表进行笛卡尔乘积,得到虚拟的表VT1

  1. Join

对虚拟表VT1应用On筛选器,只有为真的才会被插入到虚拟表VT2

  1. On

如果是外连接,把第二步中主表过滤掉的数据进行保留(也就是无论如何,外连接的主表中的数据,在这一步都会是全部数据,所以我们如果想对主表进行筛选,其实这里影响的只是VT2中不满足条件的行数据中,从表的值变为null),从VT2表中把过滤掉的数据的从表的列的值赋予NULL,并生成表VT3

注意:如果存在多个表的连接,则重复以上步骤,也就是连接两个表后,进行ON的筛选,再用结果表和下一张表进行连接筛选,多表连接注意null的处理

内连接时,因为ON后面是满足两张表的条件,所以在内连接时,条件写在ON后面会减少临时表中数据的条数,会更快一点

  1. Where

对虚拟表VT3(满足连接条件后的结果)应用WHERE条件筛选器,根据指定条件进行筛选,并把满足条件的插入表VT4

注意:1.由于这里还没有执行SELECT,所以不能使用列的别名

2.由于还没有执行分组,Group by 所以聚合函数在这里也不能被执行

  1. Group by

这里进行分组,分组的条件使得同一个组中,所有的原有数据的分组条件都是一致的,所以此时是对组中除条件外的列进行聚合函数的计算,生成虚拟表VT5

注意:这一步后可以使用SELECT中的别名(可以理解为这一步先把所有的列先查询出来,后面的SELECT再进行筛选)

  1. Avg,sum 等聚合函数

函数一般包括

AVG:返回平均值

COUNT:返回行数

FIRST:返回第一个记录的值

LAST:返回最后一个记录的值

MAX:返回最大值

MIN:返回最小值

SUM:返回总和

  1. Having

和where是相同的功能,都是筛选数据,不过它是对分组过后的聚合完的列的值进行删选,因为WHERE和聚合函数不能一起使用,并生成虚拟表VT6

  1. Select

进行需要的字段的筛选,并进行字段的表达式的处理,如IF(),并产生虚拟表VT7

  1. Distinct

去除重复的行,只保留唯一的,并产生虚拟表VT8

  1. Order by

它不是生成虚拟表,只是相当于生成游标,标记某一条数据的排序位置

  1. Limit

限制生成的行数,生成虚拟表VT9,返回给调用者

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值