MySQL JOIN类型及其使用
MySQL JOIN类型及其使用
内连接
内连接inner join可以不使用on,此时和交叉连接等价。
使用方法:
select * from table_a a join table_b b on a.id=b.id;
select * from table_a a inner join table_b b on a.id=b.id;
上面两种方法,与下面等价
select * from table_a a,table_b where a.id=b.id;
通常省略inner,使用第一种。
外连接
外连接必须要有on。
-
左外连接
获取左表所有行,右表不匹配的,用null填充。
使用方法:select * from table_a a left join table_b b on a.id=b.id; select * from table_a a left outer join table_b b on a.id=b.id; 通常省略outer,使用第一种。
-
右外连接
获取右表所有行,左表不匹配的,用null填充。
使用方法:select * from table_a a right join table_b b on a.id=b.id; select * from table_a a right outer join table_b b on a.id=b.id; 通常省略outer,使用第一种。
-
全外连接
即左外连接与右外连接的并集,经测试,MySQL不支持。
使用方法:select * from table_a a full join table_b b on a.id=b.id; select * from table_a a full outer join table_b b on a.id=b.id; 通常省略outer,使用第一种。
MySQL中可以使用union实现。
使用方法:select * from table_a a left join table_b b on a.id=b.id union select * from table_a a right join table_b b on a.id=b.id;
交叉连接
cross join 即笛卡尔积。
使用方法
select * from table_a a cross join table_b;
此时等价于
select * from table_a a inner join table_b;
有资料显示cross join与inner join的区别在于不能加on,但实际在MySQL中测试,可以使用on,即
select * from table_a a cross join table_b on a.id=b.id;
此时等价于
select * from table_a a inner join table_b b on a.id=b.id;
很少使用,多用inner join代替。
其他
关于连接中笛卡尔积的计算顺序
MySQL中,JOIN的笛卡尔积计算顺序,似乎是以右表或行数多的表为主导的。 例如:
table_a
id | name |
---|---|
1 | n1 |
2 | n2 |
table_b
id | age |
---|---|
1 | 18 |
2 | 19 |
此时
select * from table_a join table_b;
结果为
id | name | id | age |
---|---|---|---|
1 | n1 | 1 | 18 |
2 | n2 | 1 | 18 |
1 | n1 | 2 | 19 |
2 | n2 | 2 | 19 |
select * from table_a join table_b;
结果为
id | age | id | name |
---|---|---|---|
1 | 18 | 1 | n1 |
2 | 19 | 1 | n1 |
1 | 18 | 2 | n2 |
2 | 19 | 2 | n2 |
即当两表行数相等时,以右表为主导。
而当
table_b
id | age |
---|---|
1 | 18 |
2 | 19 |
3 | 20 |
此时
select * from table_a join table_b;
结果为
id | name | id | age |
---|---|---|---|
1 | n1 | 1 | 18 |
2 | n2 | 1 | 18 |
1 | n1 | 2 | 19 |
2 | n2 | 2 | 19 |
1 | n1 | 3 | 20 |
2 | n2 | 3 | 20 |
而
select * from table_b join table_a;
时,结果为
id | age | id | name |
---|---|---|---|
1 | 18 | 1 | n1 |
1 | 18 | 2 | n2 |
2 | 19 | 1 | n1 |
2 | 19 | 2 | n2 |
3 | 20 | 1 | n1 |
3 | 20 | 2 | n2 |
即两表行数不等时,以行数多的表为主导。