笛卡尔积:cross join
笛卡尔积是将两个表的任一记录相互组合,如果A有m条记录,B有n条记录,那么通过笛卡尔积产生的结果就会有m*n条记录。
产生迪卡尔积有三种情况:
select * from A cross join B;
select * form A inner join B; #如果有on的话,就是内连接,即求交集
select * from A,B;#注意,此时不能用on或者using,可以用where
select * from A nature join B;
select * from A natura join B;
#特意搜索了一下,这个和natura和nature的有啥区别,结果都是一样的。要与自然连接区分清楚,自然连接是
select * from A natural join B;
所谓自然连接是有隐式的on条件的,无需显式的写出来,mysql会自动找相同的字段连接(划重点,相同的字段名称,不相同是不行的)
内连接:inner join,从笛卡尔的角度看就是从那么多任意相连接的记录中找到符合on条件的记录。共有下面几种写法:
select * from A inner join B on A.id = B.id; #省略inner也是可以的
select * from A , B where A.id = B.id;
select * from A straight_join B on A.id = B.id;
左连接:
即是除了A、B两个表的交集外,还要加上A表中剩下的记录。
select * from A left join B on A.id = B.id
右连接:即是除了A、B两个表的交集外,还要加上B表中剩下的记录。
select * from A right join B on A.id = B.id
外连接:
即A、B的并集,即从笛卡尔积中挑选出on子句成立的记录+左边剩下的记录+右表剩下的记录。因为mysql暂时不支持outer join,故可以对左连接的结果union右连接的结果
select * from A left join B on A.id = B.id union select * from A right join B on A.id = B.id
using
这个厉害了,目的就是为了替代on那一大串连接条件的,前提是A,B表中要连接的字段名称是相同的,否则把using累坏也找不到哪个是要连接的。
比如A,B中都有id,并且就是要让id相连的,那可以呀,直接上using
`select * from A left join B on A.id = B.id`
改为:
select * from A left join B using(id);
是不是很完美~
自然连接:
那就更厉害了,using也不用了,不过前提都是一样的,两表相连接的字段名称是一样的,直接
select * from A left join B on A.id = B.id
改为:
select * from A natural join B;
可见为了简便无所不用其极,这就是进步的动力吧,咋样方便咋样来。
当然啦,要对称,咋个能缺少左自然连接、右自然连接呢
select * from A left natural join B;
select * from A right natural join B;