【sql】面试题join on和where

知识点:sql执行顺序

from (去加载2个表 ) -> join -> on -> where -> group by->select 普通字段

聚合函数:count,sum -> having -> distinct -> order by -> limit

知识点:left join on和where的条件过滤区别

(以下只适用于left join,right join,full join,不适合inner join)

1、left join where + 基表过滤条件:先对基表执行过滤,然后进行left join;

2、left join where + 被关联表过滤条件:先执行left join,然后执行关联表的过滤条件;

3、left join on+基表过滤条件:满足过滤的基表记录执行left join,不满足的基表记录后面补null,然后两集合并一起;

4、left join on+被关联表过滤条件:先执行被关联表的过滤条件,然后执行left join;

面试题:表A数据在什么情况下相同,什么情况下不同?两种写法有什么区别?


SELECT
    a.*,
    b.*
FROM
    acl_class AS a
    LEFT JOIN acl_object_identity AS b ON a.id = b.object_id_class
WHERE
    a.num > 20
    AND b.owner_sid = 'devaclsid410'

 select
    a.*,
    b.*
FROM
    acl_class AS a
    LEFT JOIN acl_object_identity AS b ON a.id = b.object_id_class AND b.owner_sid = 'devaclsid410'
WHERE
    a.num > 20

解题分析:考察sql执行顺序,join on关联条件和where条件的区别

答案:

当表a无法和表b关联上的内容也,不符合where表a过滤条件时候,两边结果一样。

当表a未关联上表b的内容,有符合表a过滤条件的时候,两边结果不一样, on过滤会比where过滤条件b多出,表a未关联上但符合表a过滤条件的内容

因为sql执行顺序是先on后where,在on中进行表b过滤, 表a与符合表b条件的内容进行关联,不会导致表a中未能关联上的内容过滤掉,但是where过滤中,表a中未关联上内容,表b字段为null,一定会被过滤掉

表a

【sql】面试题join on和where

表b

【sql】面试题join on和where

表a b通过class来进行关联,表B中只有102班的数据,表a中符合大于20的除了102以外还有3条数据

sql1:where过滤 运行结果6条 ab关联上且符合where条件b的

【sql】面试题join on和where

sql1 where过滤表B条件执行

  1. jion结果是ab表关联内容+a表未关联上内容。
  2. where针对表b条件+表a条件过滤, a表关联不上的信息被过滤,只有关联上的信息,因为未关联信息,b表内容是null
  3. 最终结果是ab表关联连上切符合where 表a+表b条件的数据

sql2:on过滤 运行结果9(6+3)条 ab关联上且符合表b条件+ab未关联上但符合表a条件的

【sql】面试题join on和where

sql2 on过滤表B条件执行

  1. join结果是关联后是ab表关联且符合b表条件的内容+a表中未关联上的内容,
  2. 再进行针对a表的条件过滤
  3. 最终结果是ab关联上符合条件的数据+ 表a中未关联上表b但符合where 表a条件的数据

Original: https://blog.csdn.net/ranran0224/article/details/127772513
Author: IT猫咪酱
Title: 【sql】面试题join on和where

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/656545/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球