SQL的JOIN语句
在使用数据库,进行查询的时候,经常会出现表中信息不全,需要连接另一张表来查询需要的数据。SQL的连接主要分为内连接、外连接。
使用如下两个表进行演示。
- 学生表(student)
id | name | age | cid |
---|---|---|---|
1 | 张三 | 23 | 1 |
2 | 李四 | 23 | 2 |
3 | 李四 | 34 | 2 |
4 | 赵六 | 44 | 4 |
- 班级(class)
cid | cname |
---|---|
1 | 一班 |
2 | 二班 |
3 | 三班 |
内连接(INNER JOIN)
单独使用join的话,默认为内连接。内连接会只会查询出两个表匹配到的条目,没有匹配上的条目不会在结果集中出现。使用如下语句进行查询。
select * from student std
join class cla
on std.cid = cla.cid
查询结果如下,会将匹配到的连接全部查询出来。
id | name | age | cid | cid | cname |
---|---|---|---|---|---|
1 | 张三 | 23 | 1 | 1 | 一班 |
2 | 李四 | 23 | 2 | 2 | 二班 |
3 | 王五 | 34 | 2 | 2 | 二班 |
外连接
外连接的结果集则不仅仅是匹配到的行,也可以将一些没有关联匹配到的行显示出来。外连接分为左外连接、右外连接和全外连接。
左外连接(LEFT JOIN或LEFT OUTER JOIN)
左外连接可以保证关联时,左表的完整性。会查询出关联中左表(join左边,这里为std)的全部条目,若右表未匹配到关联条目,则为null。
select * from student std
left join class cla
on std.cid = cla.cid
查询结果如下,会将左表全部查询出来,如果未匹配到连接,则右表为null。
id | name | age | cid | cid | cname |
---|---|---|---|---|---|
1 | 张三 | 23 | 1 | 1 | 一班 |
2 | 李四 | 23 | 2 | 2 | 二班 |
3 | 王五 | 34 | 2 | 2 | 二班 |
4 | 赵六 | 44 | 4 | null | null |
右外连接(RIGHT JOIN或RIGHT OUTER JOIN)
右外连接是左外连接的反向连接,可以保证右表的完整性,若左表未匹配到关联条目则为null。因此a left join b
和b right join a
结果集相同,只是左右位置互换。
select * from student std
right join class cla
on cla.cid = std.cid
查询结果如下,会将右表全部查询出来,如果未匹配到连接,则左表为null。
id | name | age | cid | cid | cname |
---|---|---|---|---|---|
1 | 张三 | 23 | 1 | 1 | 一班 |
2 | 李四 | 23 | 2 | 2 | 二班 |
3 | 王五 | 34 | 2 | 2 | 二班 |
null | null | null | null | 3 | 三班 |
全外连接(FULL JOIN 或 FULL OUTER JOIN)
全外连接可以同时保证左表和右表的完整性,查询结果返回两张表的所有行,若某行在另一张表中没有匹配行时,则该行在另一个表中的值为null。
select * from student std
full join class cla
on cla.cid = std.cid
查询结果如下。
id | name | age | cid | cid | cname |
---|---|---|---|---|---|
1 | 张三 | 23 | 1 | 1 | 一班 |
2 | 李四 | 23 | 2 | 2 | 二班 |
3 | 王五 | 34 | 2 | 2 | 二班 |
4 | 赵六 | 44 | 4 | null | null |
null | null | null | null | 3 | 三班 |
PS:mysql不支持FULL JOIN
,可用LEFT JOIN UNION RIGHT JOIN
替代
笛卡儿积(CROSS JOIN)
笛卡儿积,又称交叉连接。会返回两张表的每一条数据的所有组合,如果在SQL中关联却没有给出关联条件,会产生笛卡儿积。也可以使用交叉连接,CROSS JOIN来查询笛卡儿积。
select * from student std
CROSS JOIN class cla
查询结果如下,结果集为两表的乘积。
id | name | age | cid | cid | cname |
---|---|---|---|---|---|
1 | 张三 | 23 | 1 | 1 | 一班 |
1 | 张三 | 23 | 1 | 2 | 二班 |
1 | 张三 | 23 | 1 | 3 | 三班 |
2 | 李四 | 23 | 2 | 1 | 一班 |
2 | 李四 | 23 | 2 | 2 | 二班 |
2 | 李四 | 23 | 2 | 3 | 三班 |
3 | 王五 | 34 | 2 | 1 | 一班 |
3 | 王五 | 34 | 2 | 2 | 二班 |
3 | 王五 | 34 | 2 | 3 | 三班 |
4 | 赵六 | 44 | 4 | 1 | 一班 |
4 | 赵六 | 44 | 4 | 2 | 二班 |
4 | 赵六 | 44 | 4 | 3 | 三班 |