表a
id | name |
1 | 张三 |
2 | 李四 |
3 | 赵六 |
表b
id | bname |
1 | 红烧肉 |
2 | 火腿肠 |
4 | 大白菜 |
(一)外连接
外连接可分为:左连接、右连接、完全外连接。
1、左连接(left join 或 left outer join)
SQL语句:select * from a left join b on a.id=b.id
左外连接包含left join左表所有行,如果左表中某行在右表没有匹配,则结果中对应行右表的部分全部为空(NULL)。
id | name | id | bname |
1 | 张三 | 1 | 红烧肉 |
2 | 李四 | 2 | 火腿肠 |
3 | 赵六 | NULL | NULL |
- 右连接(right join 或 right outer join)
SQL语句:select * from a right join b on a.id=b.id
右外连接包含right join右表所有行,如果左表中某行在右表没有匹配,则结果中对应左表的部分全部为空(NULL)。
id | name | id | bname |
1 | 张三 | 1 | 红烧肉 |
2 | 李四 | 2 | 火腿肠 |
NULL | NULL | 4 | 大白菜 |
- 完全外连接(full join 或 full outer join)
SQL语句:select * from a full join b on a.id=b.id
完全外连接包含full join左右两表中所有的行,如果右表中某行在左表中没有匹配,则结果中对应行右表的部分全部为空(NULL),如果左表中某行在右表中没有匹配,则结果中对应行左表的部分全部为空(NULL)。
id | name | id | bname |
1 | 张三 | 1 | 红烧肉 |
2 | 李四 | 2 | 火腿肠 |
3 | 赵六 | NULL | NULL |
NULL | NULL | 4 | 大白菜 |
(二)内连接(join 或 inner join)
SQL语句:select * from a inner join b on a.id=b.id
inner join 是比较运算符,只返回符合条件的行。
此时相当于:select * from a,b where a.id=b.id
id | name | id | bname |
1 | 张三 | 1 | 红烧肉 |
2 | 李四 | 2 | 火腿肠 |
(三)交叉连接(course join)
SQL语句:select * from a cross join b
概念:没有 WHERE 子句的交叉联接将产生连接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。
id | name | id | bname |
1 | 张三 | 1 | 红烧肉 |
2 | 李四 | 1 | 红烧肉 |
3 | 赵六 | 1 | 红烧肉 |
1 | 张三 | 2 | 火腿肠 |
2 | 李四 | 2 | 火腿肠 |
3 | 赵六 | 2 | 火腿肠 |
1 | 张三 | 4 | 大白菜 |
2 | 李四 | 4 | 大白菜 |
3 | 赵六 | 4 | 大白菜 |
如果我们在此时给这条SQL加上WHERE子句的时候,
比如SQL:select * from a cross join b where a.id=b.id
此时将返回符合条件的结果集,结果和inner join所示执行结果一样。
id | name | id | bname |
1 | 张三 | 1 | 红烧肉 |
2 | 李四 | 2 | 火腿肠 |
(四)两表关系为一对多,多对一或多对多时的连接语句
1、一对多,多对一
两表一对多的SQL语句和一对一的SQL语句的写法都差不多,只是查询的结果不一样,当然两表也要略有改动。比如表a的列可以改为:aid name bid,表b的列可以改为:bid bname。
这样两表就可以写一对多和多对一的SQL语句了,写法和上面的一对一SQL语句一样。
2、多对多:
表a
aid | aname |
A1 | 张三 |
A2 | 李四 |
A3 | 王五 |
表b
bid | bname |
B1 | 红烧肉 |
B2 | 火腿肠 |
B3 | 大白菜 |
表c
id | aid | bid |
1 | A1 | B1 |
2 | A2 | B2 |
3 | A3 | B2 |
4 | A3 | B3 |
5 | A2 | B1 |
当两表为多对多关系的时候,我们需要建立一个中间表c,中间表至少要有两表的主键,当然还可以有别的内容。
SQL语句:select a.aname,b.bname from c left join a on a.aid=c.aid left join b on b.bid=c.bid
aname | bname |
张三 | 红烧肉 |
李四 | 火腿肠 |
王五 | 火腿肠 |
王五 | 大白菜 |
李四 | 红烧肉 |