码迷,mamicode.com
首页 > 其他好文 > 详细

内连接 外连接 交叉连接

时间:2015-10-19 22:26:16      阅读:307      评论:0      收藏:0      [点我收藏+]

标签:

数据库表连接大致分为三种:交叉连接、内连接、外连接

交叉连接(CROSS JOIN):其实就是内连接的一种特例,不带查询条件

内连接(INNER JOIN):相等连接、不等连接、自然连接

外连接(OUTER JOIN):左外联接、右外链接、全外连接(全外连接只有部分RDBMS系统可以做到,例如Oracle。做不到的有MySQL、SQL Server、Access)

 

交叉连接:

最简单,返回多张表每一行相乘的结果,也就是笛卡尔积。关键字是 CROSS JOIN

写法有三种:CROSS JOIN , JOIN , 英文逗号分隔表名

交叉连接是内连接的一种,内连接基本上就是通过查询条件移除某些结果数据行后的交叉连接。

以下四种写法得到的结果都是一样的,前三种属于交叉连接,最后一种是内连接的特例(不带条件):

1 SELECT * FROM tb_person CROSS JOIN tb_book;  -- 全写: CORSS JOIN
2 SELECT * FROM tb_person JOIN tb_book;  -- 简写: JOIN
3 SELECT * FROM tb_person,tb_book;  -- 还可以再简写: ,
4 
5 SELECT * FROM tb_person INNER JOIN tb_book;   -- 和不带条件的内联接一样

 

内连接:

相等连接:就是条件使用等值符号(=)

不等连接:就是条件使用不等符号(>,>=,<,<=,!>,!<,<>)

自然连接:只有在两张表中含有相同的列名称时,才能使用自然连接,自然连接默认利用同名列构造出相等连接

1 SELECT * FROM tb_person INNER JOIN tb_book WHERE tb_person.id = tb_book.person_id;  -- 相等连接
2 SELECT * FROM tb_person INNER JOIN tb_book WHERE tb_person.id <> tb_book.person_id;  -- 不等连接
3 SELECT * FROM tb_person NATURAL JOIN tb_book;  -- 自然连接
4 SELECT * FROM tb_person NATURAL JOIN tb_book WHERE tb_person.id = tb_book.id;  -- 与上一句一样,只是把默认条件显式的写出来了

 

外连接:

注重两张表之间的关系,也就是表的左右顺序,通常称之为左表和右表。

左外连接(LEFT OUTER JOIN):接收左表中的每一行,并利用这些行与右表匹配,找出右表中符合条件的行,最终连接形成数据结果集。如果对于左表行记录右表找不到能与之匹配的行记录,就会使用NULL替代右表,得到连接匹配结果。当左表与右表具有一对多关系时,左外联接特别有用。

右外连接(RIGHT OUTER JOIN):与左外联接是相同的道理,只是右表占主导地位而已。如果把左外联接中的左表和右表互换位置,得到的就是右外连接的结果。

全外连接(FULL OUTER JOIN):综合了左外连接和右外连接的特性,左表和右表地位相同,左表无匹配数据用NULL替代,右表无匹配数据也用NULL替代,也就是说左表和右表的数据都会在查询结果里面,不会少数据。

1 SELECT * FROM tb_person LEFT OUTER JOIN tb_book ON tb_person.id = tb_book.person_id;
2 SELECT * FROM tb_person LEFT JOIN tb_book ON tb_person.id = tb_book.person_id;  -- 简写
3 
4 SELECT * FROM tb_person RIGHT OUTER JOIN tb_book ON tb_person.id = tb_book.person_id;
5 SELECT * FROM tb_person RIGHT JOIN tb_book ON tb_person.id = tb_book.person_id;  -- 简写
6 
7 -- 外联接不是每一种数据库都有的特性
8 SELECT * FROM tb_person FULL OUTER JOIN tb_book ON tb_person.id = tb_book.person_id;
9 SELECT * FROM tb_person FULL JOIN tb_book ON tb_person.id = tb_book.person_id;  -- 简写

 

这里有一点需要注意:

交叉连接的逗号简写形式和自然连接只能使用 WHERE 条件,外连接只能使用 ON 条件,其余的连接形式既可以使用 WHERE 又可以使用 ON 

1 -- 只能使用 WHERE 关键字
2 SELECT * FROM tb_person,tb_book WHERE tb_person.id = tb_book.person_id;
3 SELECT * FROM tb_person NATURAL JOIN tb_book WHERE tb_person.id = tb_book.id;  -- 其实自然连接根本不需要显式加条件
4  
5 -- 只能使用 ON 关键字
6 SELECT * FROM tb_person LEFT OUTER JOIN tb_book ON tb_person.id = tb_book.person_id;
7 SELECT * FROM tb_person RIGHT OUTER JOIN tb_book ON tb_person.id = tb_book.person_id;
8 SELECT * FROM tb_person FULL OUTER JOIN tb_book ON tb_person.id = tb_book.person_id;

内连接 外连接 交叉连接

标签:

原文地址:http://www.cnblogs.com/litmmp/p/Litmmp.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!