仅作为记录用来翻阅提醒,因为老忘:
1、
select * from a,b
为笛卡尔乘积,对笛卡尔乘积概念不熟的呢就自行搜索百科复习一下;
2、
select * from a,b where a.c=b.c
等价于select * from a inner join b on a.c=b.c;
3、
select * from a left join b on a.c=b.c
将a表查询的结果去b中做匹配,匹配不到的就显示为null,所以返回的总数为表a中行数;
4、
select * from a right join b on a.c=b.c
与上相反,将b表结果拿去和a做匹配,匹配不到为null,返回总行数为b表行数。
总结:
单纯的select * from a,b是笛卡尔乘积。
但是如果对两个表进行关联:select * from a,b where a.id = b.id 意思就变了,此时就等价于:
select * from a inner join b on a.id = b.id。即就是内连接。
执行顺序以及效率问题:
1.首先了解 on 、where 的执行顺序以及效率?
from a join b 与 from a, b 产生的临时表结果集 。
都是执行笛卡尔积即(select * from a cross join b )两表的行乘积数。
on :与取得结果集同步进行数据刷选及过滤。
where : 获得结果集之后,才进行数据刷选及过滤。
执行顺序:on在上游,where在中游,having在下游。
2、select * from a,b where a.c=b.c 等价于 inner joinselect * from a, b where a.c=b.c (先取后算)
select * from a inner join b on a.c=b.c (取中带算)
性能方面inner join较好
最好直接写成inner join的写法。