一,数据构建
先建表,再说话
create database Test
use Test
create table A
(
AID int identity(1,1) primary key,
name nvarchar(50),
age int
)
create table B
(
BID int identity(1,1) primary key,
name nvarchar(50),
gender int
)
创建完之后,插入数据
insert A(name,age)values('张三',35)
insert A(name,age)values('李四',25)
insert A(name,age)values('XXX',35)
insert A(name,age)values('YYY',35)
insert B(name,gender)values('张三',1)
insert B(name,gender)values('李四',1)
insert B(name,gender)values('AAA',2)
insert B(name,gender)values('BBB',2)
二,对比测试
缺省情况下是 inner join(也就是你直接输入 join), 开发中使用的 left join 和 right join 属于 outer join, 另外 outer join 还包括 full join. 下面我通过图标让大家认识它们的区别.
现有两张表,Table A,Table B 其各有四条记录,其中有两条记录 name 是相同的:
1.INNER JOIN 产生的结果是 AB 的交集
SELECT * FROM A INNER JOIN B ON A.name = B.name
2.LEFT [OUTER] JOIN 产生表 A 的完全集,而 B 表中匹配的则有值,没有匹配的则以 null 值取代.
SELECT * FROM A LEFT OUTER JOIN B ON A.name = B.name
3.RIGHT [OUTER] JOIN 产生表 B 的完全集,而 A 表中匹配的则有值,没有匹配的则以 null 值取代.
SELECT * FROM A RIGHT OUTER JOIN B ON A.name = B.name
4.FULL [OUTER] JOIN 产生 A 和 B 的并集.对于没有匹配的记录,则会以 null 做为值.
SELECT * FROM A FULL OUTER JOIN B ON A.name = B.name
你可以通过 is NULL 将没有匹配的值找出来:
SELECT * FROM A FULL OUTER JOIN B ON A.name = B.name
WHERE A.id IS null OR B.id IS null
5. CROSS JOIN 把表 A 和表 B 的数据进行一个 N*M 的组合,即笛卡尔积.如本例会产生 4*4=16 条记录,在开发过程中我们肯定是要过滤数据,所以这种很少用.
SELECT * FROM A CROSS JOIN B
相信大家对 inner join,outer join 和 cross join 的区别一目了然了.
补充一点:按照 sql 标准 CROSS JOIN 是笛卡尔积.但对于 mysql 来说,CROSS JOIN 相当于 INNER JOIN.
来源: http://www.bubuko.com/infodetail-2466461.html