sql from和 where的执行顺序

小本本记一下,工作中看同事的代码遇到这个问题。
同事开发的存储过程,把条件放在from后面 和where后面。想当然的情况下好像没啥区别。
但是sql 的执行顺序是第一步执行 from 后面的语句,第二步执行where 后面的语句。
在这里用oralce 举个例子,不同DBMS的sql基本大同小异。


1、数据准备:

在另一篇笔记中:oracle pivot unpivot 行列互换

insert into test001
  select t.id_test, t.col_int, t.col_int, t.col_int, t.col_int, t.col_int
    from test002 t
   where t.id_test like '%A%';

在这里插入图片描述
在这里插入图片描述


2、查询结果

  • 查询1,条件放在from 后面:
select t1.id_test as t1_id, t2.id_test as t2_id
  from test002 t2
  left join test001 t1
    on t1.id_test = t2.id_test
   and t1.id_test is null;
  • 结果1:
    在这里插入图片描述

  • 查询2,条件放在where 后面:

select t1.id_test as t1_id, t2.id_test as t2_id
  from test002 t2
  left join test001 t1
    on t1.id_test = t2.id_test
 where t1.id_test is null;
  • 结果2:
    在这里插入图片描述
  • 查询3,全连接:
select t1.id_test as t1_id, t2.id_test as t2_id
  from test002 t2
  full join test001 t1
    on t1.id_test = t2.id_test;
  • 结果3:
    在这里插入图片描述
  • 查询4:
select t1.id_test as t1_id, t2.id_test as t2_id
  from test002 t2
  left join (select * from test001 where id_test is null) t1
    on t1.id_test = t2.id_test;
  • 结果4:
    在这里插入图片描述

3、结果简单分析

  • 结果1可以看到,在执行from的时候,关联两张表首先用条件 t1.id_test is null 把 t1的数据先过滤,然后再和 t2表做关联,结果只剩下t2表的所有记录(t2表的5条记录)。
  • 结果2可以看到,在执行from的时候,首先把t1表的所有记录和t2表的所有记录做匹配,然后在where 子句中使用条件 t1.id_test is null 把两表关联的结果集过滤,剩下符合条件的记录(4条记录,把匹配到的t1和t2共同的记录 ID_TEST='APPLE’剔除)。
  • 结果3可以看到,侧面印证结果2是怎么来的。
  • 结果4可以看到,侧面印证结果1是怎么来的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值