概述
工作中写SQL语句时需要用到在多个表之间各查询点数据,然后组合,利用mybatis返回给一个bean对象。
现在把这几个连接总结下,方便下次用时参考。
JOIN
下面是学生表student:
id | name | sex | age |
001 | aaa | boy | 10 |
002 | bbb | girl | 10 |
003 | ccc | girl | 10 |
004 | ddd | boy | 10 |
005 | eee | girl | 10 |
006 | fff | boy | 10 |
下面是学生成绩表grades:
id | math | chinese | english |
001 | 90 | 94 | 95 |
002 | 91 | 97 | 93 |
003 | 92 | 98 | 96 |
004 | 93 | 92 | 91 |
007 | 94 | 90 | 90 |
008 | 95 | 95 | 96 |
现在,查询学生的数学成绩并对应姓名。可以先用不使用连接的SQL语句查询:
select
student.name,
grades.math
from
student,grades
where
student.id = grades.id
这样的查询结果为:
name | math |
aaa | 90 |
bbb | 91 |
ccc | 92 |
ddd | 93 |
INNER JOIN
先看一下用INNER JOIN 的SQL语句查询上面的内容写法:
select
student.name,
grades.math
from
student
inner join
grades
on
student.id = grades.id
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
下面是查询结果:
name | math |
aaa | 90 |
bbb | 91 |
ccc | 92 |
ddd | 93 |
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
下面是查询结果:
name | math |
aaa | 90 |
bbb | 91 |
ccc | 92 |
ddd | 93 |
94 | |
95 |
会发现,多了两列没有名字,只有成绩的行。
RIGHT JOIN定义:关键字会右表 (grades) 那里返回所有的行,即使在左表 (student) 中没有匹配的行。
FULL JOIN
有了左连接,有了右连接,还有了内连接(交集),那有没有取并集的连接呢?答案是,有的。
select
student.name,
grades.math
from
student
full join
grades
on
student.id = grades.id
查询结果,想必也知道了:
name | math |
aaa | 90 |
bbb | 91 |
ccc | 92 |
ddd | 93 |
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
UNION定义:UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
注意: UNION
和UNION ALL
区别:UNION ALL会列出所有结果,有重复,UNION没有重复。
总结
- INNER JOIN: 如果查询的表中都有至少一个匹配,则返回行
- LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN: 只要其中一个表中存在匹配,就返回行
- UNION:合并多个SELECT 语句的结果集