产品经理从0开始学SQL(四)

2021-11-02 14:44:03 浏览数 (2)

如果我们需要从多个表的组合匹配关系中得出结果,那么就需要使用连接运算。

连接运算分为2种类型,分别是内连接和外连接。

No.1

内连接

语法:join后面跟着的是需要连接的表名,on后面跟着的是两个表关联起来的条件。

代码语言:javascript复制
join {表名} on {表1字段} = {表2字段}

举个例子:假设有2张表,分别是t_student学生信息表和t_course课程表。

t_student:

t_course:

查询条件:找出所有学生选修了的课程信息 以前的写法:

代码语言:javascript复制
select * from t_student,t_course 
where t_student.course_id=t_course.id

使用内连接的写法:

代码语言:javascript复制
select * from t_student join t_course on 
t_student.course_id=t_course.id;

查询结果:

join..on 操作符把2个表在条件属性下取值相同的元组搜出来。需要注意的是,学生表中陈红这名学生没有选修任何课程,所以她的记录没有出现在结果表中,内连接会把2个关系没有匹配的元组 “丢失” 掉。

我们来看下查询结果中字段的排序,首先出现的是第一个表中的所有字段,紧接着的才是第二个表中的所有字段。

如果我们想找出所有学生的信息和选修的课程该怎么办呢?这时我们可以考虑使用外连接了。

No.2

外连接

外连接还分为三种子类型:

左外连接(left outer join): 只保留出现在连接符左边表的元组。

右外连接(right outer join): 只保留出现在连接符右边表的元组。

全外连接(full outer join):保留出现在2个表中的元组。

1、左外连接

我们继续上面的例子,找出所有学生选修的课程情况:

代码语言:javascript复制
select * from t_student 
left outer join t_course on t_student.course_id=t_course.id

查询结果:可以看到结果中陈红这名同学是没有选修任何课程的,但是也出现在了结果表中。

左外连接会以左边表格元组为主,如果是没有找到匹配关系的元组,则左边表格的字段继续保留,右边表格的字段以 null 来填充。

2、右外连接

右外连接和左外连接是相对称的。举个例子:找出所有课程的选修情况:

代码语言:javascript复制
select * from t_student 
right join t_course on t_student.course_id=t_course.id;

查询结果:可以看出算法和政治这2门课是没有学生选修的。

右外连接会以右边表格元组为主,如果是没有找到匹配关系的元组,则右边表格的字段继续保留,左边表格的字段以 null 来填充。

3、全外连接

全外连接是左外连接和右外连接的组合。如果想找出所有学生以及他们选修的所有课程列表,则就可以使用全外连接。但是需要注意的是Mysql中不支持全外连接的语法。我们可以使用 union 操作符代替。

代码语言:javascript复制
(
select * from t_student  
left join t_course on t_student.course_id=t_course.id
) 
union
(select * from t_student 
right join t_course on t_student.course_id=t_course.id
)

查询结果:可以看到没有选修的课程和没有选修课程的学生信息都出现了。

注意:外连接可以省略outer这个关键字,直接写left...join..、right...join...就可以啦。

0 人点赞