这也不是我第一次接触和使用sql 的 join in了,之前写的join in 的where条件从没有考虑过先join还是先where,因为我觉得除了先用where比较优化外,这两者的结果是一样的。以前没有遇到问题,但是现在问题却出现了先join还是先where上,事实证明我是错的,为了告诫大家,以此博客献给SQL入门的小伙伴。
我写的两句SQL
1. 先where 后join
select count(1)
from (select accountsid from ccp_account_test1 where end_day='2100-12-31') a
left join
(select accountsid from total_ccp_account2 where day='2016-12-19') b on a.accountsid=b.accountsid
where b.accountsid is null;
2.先join后where
select count(1) from ccp_account_test1 a
left join
total_ccp_account2 b on a.accountsid=b.accountsid
where a.end_day='2100-12-31' and b.day='2016-12-19' and b.accountsid is null;
看似两句SQL没有什么问题,可问题就出在这两张表的数据上,举个栗子。
SQL所指a表有以下数据:
accountsid | end_day |
---|---|
1 | 2100-12-31 |
2 | 2100-12-31 |
3 | 2100-12-31 |
SQL所指b表有以下数据:
accountsid | day |
---|---|
4 | 2016-12-19 |
5 | 2016-12-19 |
如此的话,为什么两种方式的结果不一样???第一句SQL不再多说,至于第二句SQL,先想想join完的结果是什么?对,b表的字段全为null!再使用where筛选b的字段,当然得到的数据为空。
综上所述,以后还是先where再join把,不仅能优化,而且查到的数据也不会出现问题。
明,白,了,吗?
白,了,吗?
了,吗?
吗?