查询优化心得

本文探讨了SQL查询优化中的连接与条件应用策略,重点解释了INNERT JOIN与WHERE子句的区别,以及如何有效利用LEFT OUTER JOIN和RIGHT OUTER JOIN展示表的全部数据。此外,文章还对比了将条件放置在JOIN子句与WHERE子句中的执行效率差异,并提供了实际查询案例。

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

在查询优化时
一般都遵循先投影,再选择,再联结
因为联结所号时间资源是最大的
而INNER JOIN 是:
再联结的同时进行选择,
也就是 扫描表1的每一条记录,然后在表二中筛选满足条件的记录加入最终表,
而用 WHERE 的话
数据库是:扫描表1的每一条记录,同时将表二中所有的记录加入最终表,
然后再根据WHERE 的条件进行筛选,耗时间和 空间资源都比INNER JOIO 大的多!!!

强调一条,在数据库里,比较2记录一次比合并2记录一次花的时间要小的多!



1 left join 就是 left outer join 的缩写形式,两者功能一样
2 left outer join 显示左表的全部数据,未匹配项写null,right outer join 保留右表的全部数据,未匹配项写null
3 没有left inner join
4 inner join 只显示左表和右表向匹配的数据
5 关于on...and... 以及 on..where....and....的区别
    on条件是外联接时在生成临时表时使用的联结条件,不论从表是确定值还是NULL,主表所有的值都会出现;
 如果再加上and条件; 如果and条件引用的是主表的列,则对结果毫无影响,主表的所有纪录依然会全部出现;如果and条件引用的是从表的列,则不符合条件的从表纪录显示NULL;where条件是在临时表生成后,再对临时表进行过滤的条件。临时表中的所有纪录都受影响,不符合条件的纪录被过滤出结果集。

***********************************************************************************

***********************************************************************************


外连接与条件配合使用

当在内连接查询中加入条件是,无论是将它加入到join子句,还是加入到where子句,其效果是完全一样的,但对于外连接情况就不同了。当把条件加入到 join子句时,SQL ServerInformix会返回外连接表的全部行,然后使用指定的条件返回第二个表的行。如果将条件放到where子句中,SQL Server将会首先进行连接操作,然后使用where子句对连接后的行进行筛选。下面的两个查询展示了条件放置位子对执行结果的影响:

条件在join子句
select *from  t_institution Ileft outer join t_teller ton i.inst_no = t.inst_no
and i.inst_no = “5801

结果是:
inst_no    inst_name            inst_no    teller_no  teller_name
5801       天河区                5801       0001       tom
5801       天河区                5801       0002
       david
5802       越秀区

5803       白云区

条件在where子句
select *from  t_institution Ileft outer join t_teller ton i.inst_no = t.inst_no
where i.inst_no = “5801

结果是:
inst_no    inst_name            inst_no    teller_no  teller_name
5801       天河区                5801       0001       tom
5801       天河区                5801       0002
       david

**********************************************************   对将条件放在on后和放在where后面的效率比较

在使用INNER JOIN时会产生一个结果集,WHERE条件在这个结果集中再根据条件进行过滤,如果把条件都放在ON中,是否比放在WHERE中效率高一点呢,理论上感觉在INNER JOIN的时候就进行过滤了,比如

        SELECT *
         FROM A
      INNER JOIN B
          ON B.ID = A.ID
          AND B.State = 1
      INNER JOIN C
          ON B.ID = C.ID

在联查B表时,就把状态不等于1的忽略掉了,这样对于状态不等于1的就不需要去联查C表了

        SELECT *
         FROM A
      INNER JOIN B
          ON B.ID = A.ID
      INNER JOIN C
          ON B.ID = C.ID
         WHERE B.State = 1
则不管B的状态是否满足,都去联查C,最后再将B状态满足的查出来,效率应该没有前面的高吧,不知道我说的对不对,欢迎指正。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值