一般都遵循先投影,再选择,再联结
因为联结所号时间资源是最大的
而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 Server、Informix会返回外连接表的全部行,然后使用指定的条件返回第二个表的行。如果将条件放到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
在使用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