sql中的连接
sql中的表连接有inner join,left join(left outer join),right join(right outer join),full join(full outer join),cross join
在此基础上我们能扩展出 left excluding join,right excluding join,full outer excluding join
注:left join是left outer join 的简写,即左连接和左外连接是一样的
首先定义两个比较经典的表
学生信息表和选课表
student
studentIdname sex
1 小明 男
2 小黄 男
3 小红 女
4 小杨 男
course
studentIdcourseName
1 数学
1 语文
1 英语
2 数学
2 语文
2 英语
3 数学
3 语文
3 英语
5 数学
5 语文
5 英语
这两张表其实并不规范,course的studentId其实是一个外键,对应student的studentId,所以course的studentId不应该有5,不过为了测试方便,暂且这么写
内连接(inner join)
select s.* ,c.courseName
from student s
inner join course c
on s.studentId=c.studentId
结果
studentIdname sexcourseName
1 小明 男数学
1 小明 男语文
1 小明 男英语
2 小黄 男数学
2 小黄 男语文
2 小黄 男英语
3 小红 女数学
3 小红 女语文
3 小红 女英语
左连接(left join)
select s.* ,c.courseName
from student s
left join course c
on s.studentId=c.studentId
结果
studentIdname sexcourseName
1 小明 男数学
1 小明 男语文
1 小明 男英语
2 小黄 男数学
2 小黄 男语文
2 小黄 男英语
3 小红 女数学
3 小红 女语文
3 小红 女英语
4 小杨 男NULL
右连接
select s.* ,c.courseName
from student s
right join course c
on s.studentId=c.studentId
结果
studentId name sex courseName1小明 男 数学1小明 男 语文1小明 男 英语2小黄 男 数学2小黄 男 语文2小黄 男 英语3小红 女 数学3小红 女 语文3小红 女 英语
NULL NULL NULL 数学
NULL NULL NULL 语文
NULL NULL NULL 英语
全连接
select s.* ,c.courseName
from student s
full join course c
on s.studentId=c.studentId
结果
studentId name sex courseName1小明 男 数学1小明 男 语文1小明 男 英语2小黄 男 数学2小黄 男 语文2小黄 男 英语3小红 女 数学3小红 女 语文3小红 女 英语4小杨 男 NULL
NULL NULL NULL 数学
NULL NULL NULL 语文
NULL NULL NULL 英语
左不包含连接(left excluding join)
select s.*,c.courseNamefromstudent s
left join course c
on s.studentId=c.studentIdwhere c.studentId is null
结果
studentIdnamesexcourseName
4 小杨 男NULL
右不包含连接(right excluding join)
select s.* ,c.courseName
from student s
right join course c
on s.studentId=c.studentId
where s.studentId is null
结果
studentIdnamesexcourseName
NULL NULLNULL数学
NULL NULLNULL语文
NULL NULLNULL英语
全不包含连接(Full outer excluding join)
select s.* ,c.courseName
from student s
full join course c
on s.studentId=c.studentId
where s.studentId is null or c.studentId is null
结果
studentIdnamesexcourseName
4 小杨 男NULL
NULL NULLNULL数学
NULL NULLNULL语文
NULL NULLNULL英语
笛卡儿积(cross join)
select s.* ,c.courseName
from student s
cross join course c
结果