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
studentId name sex 1 小明 男 2 小黄 男 3 小红 女 4 小杨 男
course
studentId courseName 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
结果
studentId name sex courseName 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
结果
studentId name sex courseName 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 courseName 1 小明 男 数学 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 courseName 1 小明 男 数学 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.courseName from student s left join course c on s.studentId=c.studentId where c.studentId is null
结果
studentId name sex courseName 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
结果
studentId name sex courseName NULL NULL NULL 数学 NULL NULL NULL 语文 NULL NULL NULL 英语
全不包含连接(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
结果
studentId name sex courseName 4 小杨 男 NULL NULL NULL NULL 数学 NULL NULL NULL 语文 NULL NULL NULL 英语
笛卡儿积(cross join)
select s.* ,c.courseName from student s cross join course c
结果
studentId name sex courseName 1 小明 男 数学 1 小明 男 语文 1 小明 男 英语 1 小明 男 数学 1 小明 男 语文 1 小明 男 英语 1 小明 男 数学 1 小明 男 语文 1 小明 男 英语 1 小明 男 数学 1 小明 男 语文 1 小明 男 英语 2 小黄 男 数学 2 小黄 男 语文 2 小黄 男 英语 2 小黄 男 数学 2 小黄 男 语文 2 小黄 男 英语 2 小黄 男 数学 2 小黄 男 语文 2 小黄 男 英语 2 小黄 男 数学 2 小黄 男 语文 2 小黄 男 英语 3 小红 女 数学 3 小红 女 语文 3 小红 女 英语 3 小红 女 数学 3 小红 女 语文 3 小红 女 英语 3 小红 女 数学 3 小红 女 语文 3 小红 女 英语 3 小红 女 数学 3 小红 女 语文 3 小红 女 英语 4 小杨 男 数学 4 小杨 男 语文 4 小杨 男 英语 4 小杨 男 数学 4 小杨 男 语文 4 小杨 男 英语 4 小杨 男 数学 4 小杨 男 语文 4 小杨 男 英语 4 小杨 男 数学 4 小杨 男 语文 4 小杨 男 英语