知识点: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
表b
表a b通过class来进行关联,表B中只有102班的数据,表a中符合大于20的除了102以外还有3条数据
sql1:where过滤 运行结果6条 ab关联上且符合where条件b的
sql1 where过滤表B条件执行
- jion结果是ab表关联内容+a表未关联上内容。
- where针对表b条件+表a条件过滤, a表关联不上的信息被过滤,只有关联上的信息,因为未关联信息,b表内容是null
- 最终结果是ab表关联连上切符合where 表a+表b条件的数据
sql2:on过滤 运行结果9(6+3)条 ab关联上且符合表b条件+ab未关联上但符合表a条件的
sql2 on过滤表B条件执行
- join结果是关联后是ab表关联且符合b表条件的内容+a表中未关联上的内容,
- 再进行针对a表的条件过滤
- 最终结果是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/
转载文章受原作者版权保护。转载请注明原作者出处!