数据库查询连接(JOIN)用法

工作中写SQL语句时需要用到在多个表之间各查询点数据,然后组合,利用mybatis返回给一个bean对象。
现在把这几个连接总结下,方便下次用时参考。

JOIN

下面是学生表student:

idnamesexage
001aaaboy10
002bbbgirl10
003cccgirl10
004dddboy10
005eeegirl10
006fffboy10

下面是学生成绩表grades:

idmathchineseenglish
001909495
002919793
003929896
004939291
007949090
008959596

现在,查询学生的数学成绩并对应姓名。可以先用不使用连接的SQL语句查询:

select 
    student.name,
    grades.math
from
    student,grades
where
    student.id = grades.id
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这样的查询结果为:

namemath
aaa90
bbb91
ccc92
ddd93

INNER JOIN

先看一下用INNER JOIN 的SQL语句查询上面的内容写法:

select
    student.name,
    grades.math
from
    student
inner join
    grades
on 
    student.id = grades.id
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

INNER JOIN定义:在查询的几个表中,每个表都存在至少一个匹配时,INNER JOIN 关键字返回行。也就是共有部分,即,几个表的交集。

LEFT JOIN

把上面内连接(INNER JOIN)的关键字改为left join效果如何呢?

select
    student.name,
    grades.math
from
    student
left join
    grades
on 
    student.id = grades.id
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

下面是查询结果:

namemath
aaa90
bbb91
ccc92
ddd93
eee
fff

会发现学生eee和fff没有成绩,原因是因为:
LEFT JOIN定义:关键字会从左表 (student) 那里返回所有的行,即使在右表 (grades) 中没有匹配的行。

RIGHT JOIN

有了LEFT JOIN,肯定会想,有没有RIGHT JOIN呢?答案是,有的。

select
    student.name,
    grades.math
from
    student
right join
    grades
on 
    student.id = grades.id
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

下面是查询结果:

namemath
aaa90
bbb91
ccc92
ddd93
94
95

会发现,多了两列没有名字,只有成绩的行。
RIGHT JOIN定义:关键字会右表 (grades) 那里返回所有的行,即使在左表 (student) 中没有匹配的行。

FULL JOIN

有了左连接,有了右连接,还有了内连接(交集),那有没有取并集的连接呢?答案是,有的。

select
    student.name,
    grades.math
from
    student
full join
    grades
on 
    student.id = grades.id

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

查询结果,想必也知道了:

namemath
aaa90
bbb91
ccc92
ddd93
eee
fff
94
95

FULL JOIN定义:只要查询的某个表存在匹配,FULL JOIN 关键字就会返回行。
但是:MySQL中没有FULL JOIN,那么MySQL中要用FULL JOIN的效果怎么办呢?

UNION

用法:

select
    student.name,
    grades.math
from
    student
left join
    grades
on 
    student.id = grades.id
union
select
    student.name,
    grades.math
from
    student
right join
    grades
on
    student.id = grades.id

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

UNION定义:UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
注意:
UNIONUNION ALL区别:UNION ALL会列出所有结果,有重复,UNION没有重复。

总结

  • INNER JOIN: 如果查询的表中都有至少一个匹配,则返回行
  • LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
  • RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
  • FULL JOIN: 只要其中一个表中存在匹配,就返回行
  • UNION:合并多个SELECT 语句的结果集
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值