数据库表连接大致分为三种:交叉连接、内连接、外连接
交叉连接(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;