如果我们需要从多个表的组合匹配关系中得出结果,那么就需要使用连接运算。
连接运算分为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...就可以啦。