SQL中的连接操作很多,这里总结一下。
假设有以下两张表
教师表teacher
teacher_id | teacher_name |
---|---|
1 | 刘娟 |
2 | 朱卫平 |
3 | 刘婧 |
4 | 李春葆 |
课程表course
course_id | course_name | teacher_id |
---|---|---|
1 | 商务智能 | 2 |
2 | 高级算法分析与设计 | 1 |
3 | 程序设计方法学 | 3 |
4 | 模式识别 | 2 |
sql如下:
1 | create table teacher ( |
cross join
交叉连接(cross join):如果不带where子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积。
语法:
1 | select 列名,... |
示例:
1 | select * from teacher cross join course; |
输出:
1 | +------------+--------------+-----------+-----------------------------+------------+ |
inner join
等值连接(inner join或join):返回两张表中相互匹配的行。
语法:
1 | select 列名,... |
其中的inner是可省略的。
示例:
查询每门课程的的课程号、课程名称、教师编号以及教师姓名。
1 | select course.*,teacher.teacher_name from course |
输出:
1 | +-----------+-----------------------------+------------+--------------+ |
natural join
自然连接(natural join):在等值连接的基础上,去掉重复的列名。
语法:
1 | select 列名,... |
示例:
1 | select * from course |
输出:
由于course表中已经包含了teacher_id,所以,在进行自然连接时,自动去掉了teacher表中多余的teacher_id。
1 | +------------+-----------+-----------------------------+--------------+ |
left join
左外连接(left outer join):返回左表中的所有行及右表中满足on条件的行,如果右表没有匹配的行,对应列填充NULL。
其中outer是可省略的,即可写为left join。
示例:
查询所有的教师信息,即使他尚未被安排课程
1 | select course.*,teacher.teacher_name from teacher |
输出:
1 | +-----------+-----------------------------+------------+--------------+ |
right join
右外连接(right outer join):返回右表有行和左表中满足on条件的行,如果左表没有匹配的行,对应列填充NULL。
其中outer是可省略的,即可写为right join。
示例:
查询所有的教师信息,即使他尚未被安排课程
1 | select * from course |
输出:
1 | +-----------+-----------------------------+------------+------------+--------------+ |
full join
全外连接(full outer join或full join):返回左表和右表中的所有行。若某一张表中的行在另一张表中没有匹配的行,对应列填充NULL。
1 | select * from course |
注意:MySQL不支持full outer join,可以使用左连接和右连接的并来实现。
1 | select * from course |
输出:
1 | +-----------+-----------------------------+------------+------------+--------------+ |