一、SQL中大概有这么几种JOIN:
cross join
inner join
left outer join
right outer join
full outer join
他们都是基于cross join(笛卡尔乘积)
二、
笛卡尔乘积就是说 把所有的组合都出现一次。
举例:
A_test表
Id a_name a_describe
1 a11111 a11111
2 a22222 a22222
3 a33333 a33333
B_test表
Id b_name b_describe
1 b11111 01
1 b11111 02
2 b22222 01
2 b22222 02
3 b44444 04
select * from a_test a //查询出所有a表中的所有记录 3条
select * from b_test b //查询出所有b表中的所有记录 5条
select * from a_test a cross join b_test b //a b 两表的笛卡尔乘积 即所有的组合共15条记录
结果:
1 a11111 a111111 1 b11111 01
1 a11111 a111111 1 b11111 02
1 a11111 a111111 2 b22222 01
1 a11111 a111111 2 b22222 02
1 a11111 a111111 4 b44444 01
2 a22222 a222222 1 b11111 01
2 a22222 a222222 1 b11111 02
2 a22222 a222222 2 b22222 01
2 a22222 a222222 2 b22222 02
2 a22222 a222222 4 b44444 01
3 a33333 a333333 1 b11111 01
3 a33333 a333333 1 b11111 02
3 a33333 a333333 2 b22222 01
3 a33333 a333333 2 b22222 02
3 a33333 a333333 4 b44444 01
1 a11111 a111111 1 b11111 01
1 a11111 a111111 1 b11111 02
1 a11111 a111111 2 b22222 01
1 a11111 a111111 2 b22222 02
1 a11111 a111111 4 b44444 01
2 a22222 a222222 1 b11111 01
2 a22222 a222222 1 b11111 02
2 a22222 a222222 2 b22222 01
2 a22222 a222222 2 b22222 02
2 a22222 a222222 4 b44444 01
3 a33333 a333333 1 b11111 01
3 a33333 a333333 1 b11111 02
3 a33333 a333333 2 b22222 01
3 a33333 a333333 2 b22222 02
3 a33333 a333333 4 b44444 01
select * from a_test a inner join b_test b on a.id =b.id
//在笛卡尔乘积的结果集中去掉不符合连接条件的行 包含于笛卡尔乘积
结果:
1 a11111 a111111 1 b11111 01
1 a11111 a111111 1 b11111 02
2 a22222 a222222 2 b22222 01
2 a22222 a222222 2 b22222 02
1 a11111 a111111 1 b11111 01
1 a11111 a111111 1 b11111 02
2 a22222 a222222 2 b22222 01
2 a22222 a222222 2 b22222 02
select * from a_test a left outer join b_test b on a.id =b.id
//是在inner join的结果集上加上左面表中没被选上的不相等的记录,不包含于笛卡尔乘积
//行的右表部分每个字段都用NUll填充
结果:
1 a11111 a111111 1 b11111 01
1 a11111 a111111 1 b11111 02
2 a22222 a222222 2 b22222 01
2 a22222 a222222 2 b22222 02
3 a33333 a333333 NULL NULL NULL
select * from a_test a right join b_test b on a.id =b.id
//是在inner join的结果集上加上右面表中没被选上的不相等的记录,不包含于笛卡尔乘积
//行的左表部分每个字段都用NUll填充
1 a11111 a111111 1 b11111 01
1 a11111 a111111 1 b11111 02
2 a22222 a222222 2 b22222 01
2 a22222 a222222 2 b22222 02
NULL NULL NULL 4 b44444 01
select * from a_test a full outer join b_test b on a.id =b.id
//是在innerjoin的结果集上加上左、右两面表中没被选上的不相等的记录,不包含于笛卡尔乘积
//行的右、左表两部分每个字段都用NUll填充
1 a11111 a111111 1 b11111 01
1 a11111 a111111 1 b11111 02
2 a22222 a222222 2 b22222 01
2 a22222 a222222 2 b22222 02
NULL NULL NULL 4 b44444 01
3 a33333 a333333 NULL NULL NULL