使用join进行关联查询时,我们有可以使用on作为条件也可以使用where作为条件。但是两者是不同的。
SQL执行的顺序on是在join之前执行where是在前面两者之后执行。
我们以一个案例分析。
select * from student st left join score sc on sc.s_id = st.s_id and st.s_id = '01'
上面的sql我们对查询条件s_id有限制,但是这个限制却看似没有起作用。
起不了作用是不能的,不可能不起作用的。—窃格瓦拉
我们把条件去掉
看到区别了吧。右下角的数据在第一张图里是没有的。
其实原因如下:
student和score表做笛卡尔积后,on条件会对这个笛卡尔积做筛选,筛选出符合sc.s_id = st.s_id and st.s_id = '01'
条件的记录。此时的结果如下:
之后进行join根据join的类型为left会保留前表未匹配的数据。也就是会补充下表方框中的数据。
以上就是问题的原因。
那有什么办法呢?
方案一:使用join。保留两表完全匹配的项。结果如下
方案二:使用where条件,对join后的表进行筛选。结果如下:
[end]