SQL的JOIN语句

在使用数据库,进行查询的时候,经常会出现表中信息不全,需要连接另一张表来查询需要的数据。SQL的连接主要分为内连接、外连接。
使用如下两个表进行演示。

  • 学生表(student)
idnameagecid
1张三231
2李四232
3李四342
4赵六444
  • 班级(class)
cidcname
1一班
2二班
3三班

内连接(INNER JOIN)

单独使用join的话,默认为内连接。内连接会只会查询出两个表匹配到的条目,没有匹配上的条目不会在结果集中出现。使用如下语句进行查询。

select * from student std 
join class cla
on std.cid = cla.cid

查询结果如下,会将匹配到的连接全部查询出来。

idnameagecidcidcname
1张三2311一班
2李四2322二班
3王五3422二班

外连接

外连接的结果集则不仅仅是匹配到的行,也可以将一些没有关联匹配到的行显示出来。外连接分为左外连接、右外连接和全外连接。

左外连接(LEFT JOIN或LEFT OUTER JOIN)

左外连接可以保证关联时,左表的完整性。会查询出关联中左表(join左边,这里为std)的全部条目,若右表未匹配到关联条目,则为null。

select * from student std 
left join class cla
on std.cid = cla.cid

查询结果如下,会将左表全部查询出来,如果未匹配到连接,则右表为null。

idnameagecidcidcname
1张三2311一班
2李四2322二班
3王五3422二班
4赵六444nullnull

右外连接(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。

idnameagecidcidcname
1张三2311一班
2李四2322二班
3王五3422二班
nullnullnullnull3三班

全外连接(FULL JOIN 或 FULL OUTER JOIN)

全外连接可以同时保证左表和右表的完整性,查询结果返回两张表的所有行,若某行在另一张表中没有匹配行时,则该行在另一个表中的值为null。

select * from student std 
full join class cla
on cla.cid = std.cid

查询结果如下。

idnameagecidcidcname
1张三2311一班
2李四2322二班
3王五3422二班
4赵六444nullnull
nullnullnullnull3三班

PS:mysql不支持FULL JOIN,可用LEFT JOIN UNION RIGHT JOIN替代

笛卡儿积(CROSS JOIN)

笛卡儿积,又称交叉连接。会返回两张表的每一条数据的所有组合,如果在SQL中关联却没有给出关联条件,会产生笛卡儿积。也可以使用交叉连接,CROSS JOIN来查询笛卡儿积。

select * from student std 
CROSS JOIN class cla

查询结果如下,结果集为两表的乘积。

idnameagecidcidcname
1张三2311一班
1张三2312二班
1张三2313三班
2李四2321一班
2李四2322二班
2李四2323三班
3王五3421一班
3王五3422二班
3王五3423三班
4赵六4441一班
4赵六4442二班
4赵六4443三班
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值