sql表连接的几种方式

一.SQL 左外连接,右外连接,全连接,内连接

表结构

a表 id name b表 id job parent_id

1  张三      1 23   1 
2  李四      2 34   2 
3  王武      3 34   4

a.id同parent_id 存在关系

内连接

inner join与join的结果是一样的

select a.,b. from a inner join b on a.id=b.parent_id

结果是

1 张3 1 23 1

2 李四 2 34 2

左连接

select a.,b. from a left join b on a.id=b.parent_id

结果是

1 张3 1 23 1

2 李四 2 34 2

3 王武 null

右连接

select a.,b. from a right join b on a.id=b.parent_id

结果是

1 张3 1 23 1

2 李四 2 34 2

null 3 34 4

完全连接

select a.,b. from a full join b on a.id=b.parent_id

结果是

1 张3 1 23 1

2 李四 2 34 2

null 3 34 4

3 王武 null

注意:join 默认结果等于inner join

二、自然连接

natural join:自然连接(不允许带on/using)

natrual join:全自然连接,对左右2个表相同名字的列进行等值匹配,不可用on,using操作指定,自动删除多余重名列,自动合并不同的列

natrual left join:左自然连接,保留2个表的列(删除多余重名列),以左表为准,不存在匹配的右表列,值置为NULL

natrual right join:和左自然连接相反

select * from tb_test1 natural join tb_student; 
+—-+——–+——–+——-+————+ 
| id | name | gender | score | birthday | 
+—-+——–+——–+——-+————+ 
| 1 | 李毅 | 男 | 95.30 | 1988-03-20 | 
+—-+——–+——–+——-+————+

select * from tb_test1 natural left join tb_student; 
+—-+———–+——–+——-+————+ 
| id | name | gender | score | birthday | 
+—-+———–+——–+——-+————+ 
| 1 | 李毅 | 男 | 95.30 | 1988-03-20 | 
| 2 | 二丫 | 女 | 95.30 | NULL | 
| 3 | 张三 | 女 | 95.30 | NULL | 
| 4 | 李四 | 女 | 95.30 | NULL | 
| 7 | 胡鲁瓦 | 男 | 95.30 | NULL | 
| 9 | 后羿 | 男 | 95.30 | NULL | 
+—-+———–+——–+——-+————+

select * from tb_test1 natural right join tb_student; 
+—-+——–+——–+————+——-+ 
| id | name | gender | birthday | score | 
+—-+——–+——–+————+——-+ 
| 1 | 李毅 | 男 | 1988-03-20 | 95.30 | 
| 2 | kevin | 男 | 1987-08-23 | NULL | 
| 3 | marry | 女 | 1989-11-25 | NULL | 
| 4 | lucy | 女 | 1989-11-25 | NULL | 
| 5 | lily | 女 | 1992-01-25 | NULL | 
+—-+——–+——–+————+——-+

笛卡尔乘积
已上连接都是基于cross join(笛卡尔乘积),即两表行数的乘积

概念:没有where条件的交叉连接将产生连接表所涉及的笛卡尔积。即TableA的行数TableB的行数的结果集。(TableA 3行TableB 3行=9行)

sql语句:

select * from TableA cross join TableB