赞
踩
join(自然连接) 只有进行连接的两个表中都存在与连接条件相匹配的数据才会被保留下来
inner join(等值连接、内连接) 只返回两个表中联结字段相等的行
full join (全连接、满外连接) 把左右两个表的数据都取出来,不管是否匹配
注意:开发中使用的left join和right join属于outer join
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
outer join (外连接) 就是在关联不上的时候,把其中的部分信息查询出来
cross join 把表A和表B的数据进行一个N*M的组合,即笛卡尔积
join和inner join执行结果相同,但这两个有什么区别?
- 结果集中的记录是一样的,只是记录的顺序不一样。
- join是自然连接,对两张表中字段名和数据类型都相同的字段进行等值连接,并返回符合条件的结果。
- 而inner join是内连接,显示符合连接条件的记录,连接条件已经指明了。
- 这里需要注意join的时候和inner join连接时使用的连接条件是不一样的,所以在结果中记录出现的顺序会有所不同,但两个结果结合是一样的。
举例如下:
- --------------------------------------------
- 表A记录如下:
- id num
- 1 a20050111
- 2 a20050112
- 3 a20050113
- 4 a20050114
- 5 a20050115
-
- 表B记录如下:
- id num
- 1 2006032401
- 2 2006032402
- 3 2006032403
- 4 2006032404
- 8 2006032408
-
- --------------------------------------------
select * from A join B on A.id = B.id
- id num id num
- 1 a20050111 1 2006032401
- 2 a20050112 2 2006032402
- 3 a20050113 3 2006032403
- 4 a20050114 4 2006032404
select * from A left join B on A.id = B.id
结果如下:
- id num id num
- 1 a20050111 1 2006032401
- 2 a20050112 2 2006032402
- 3 a20050113 3 2006032403
- 4 a20050114 4 2006032404
- 5 a20050115 NULL NULL
(所影响的行数为 5 行)
结果说明:
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
B表记录不足的地方均为NULL。
select * from A right join B on A.id = B.id
结果如下:
- id num id num
- 1 a20050111 1 2006032401
- 2 a20050112 2 2006032402
- 3 a20050113 3 2006032403
- 4 a20050114 4 2006032404
- NULL NULL 8 2006032408
(所影响的行数为 5 行)
结果说明:
仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.
--------------------------------------------
select * from A inner join B on A.id = B.id
结果如下:
- id num id num
- 1 a20050111 1 2006032401
- 2 a20050112 2 2006032402
- 3 a20050113 3 2006032403
- 4 a20050114 4 2006032404
结果说明:
很明显,这里只显示出了 A.id = B.id的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录。
在mysql中没有full 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
- id num id num
- 1 a20050111 1 2006032401
- 2 a20050112 2 2006032402
- 3 a20050113 3 2006032403
- 4 a20050114 4 2006032404
- 5 a20050115 (null) (null)
- (null) (null) 8 2006032408
select * from A left outer join B on A.id = B.id (同left join)
- id num id num
- 1 a20050111 1 2006032401
- 2 a20050112 2 2006032402
- 3 a20050113 3 2006032403
- 4 a20050114 4 2006032404
- 5 a20050115 NULL NULL
select * from A right outer join B on A.id = B.id (同 right join)
- id num id num
- 1 a20050111 1 2006032401
- 2 a20050112 2 2006032402
- 3 a20050113 3 2006032403
- 4 a20050114 4 2006032404
- NULL NULL 8 2006032408
cross join 把表A和表B的数据进行一个N*M的组合,即笛卡尔积。
- id num id num
- 1 a20050111 1 2006032401
- 2 a20050112 1 2006032401
- 3 a20050113 1 2006032401
- 4 a20050114 1 2006032401
- 5 a20050115 1 2006032401
- 1 a20050111 2 2006032402
- 2 a20050112 2 2006032402
- 3 a20050113 2 2006032402
- 4 a20050114 2 2006032402
- 5 a20050115 2 2006032402
- 1 a20050111 3 2006032403
- 2 a20050112 3 2006032403
- 3 a20050113 3 2006032403
- 4 a20050114 3 2006032403
- 5 a20050115 3 2006032403
- 1 a20050111 4 2006032404
- 2 a20050112 4 2006032404
- 3 a20050113 4 2006032404
- 4 a20050114 4 2006032404
- 5 a20050115 4 2006032404
- 1 a20050111 8 2006032408
- 2 a20050112 8 2006032408
- 3 a20050113 8 2006032408
- 4 a20050114 8 2006032408
- 5 a20050115 8 2006032408
select * from A cross join B on A.id = B.id
- id num id num
- 1 a20050111 1 2006032401
- 2 a20050112 2 2006032402
- 3 a20050113 3 2006032403
- 4 a20050114 4 2006032404
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。