BinaryTom

导航

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 bb 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 三班

posted on 2017-12-14 22:11  BinaryTom  阅读(196)  评论(0编辑  收藏  举报