在from子句中表示连接操作有四种:inner(内连接),left[outer](左外连接),right[outer](右外连接),full[outer](完全外连接)。
一、理论讲解
1、内连接join
结果集中只保留了符合连接条件的元组,而排除了两个表中没有对应的或匹配的元组的操作称为内连接。
2、左外连接left
左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。
3、右外连接right
与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。
4、完全外连接full
返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
(MySQL目前不支持此种方式,可以用其他方式替代解决。)
二、案例说明
设有职工和部门两个表。
职工表
|
职工号 |
姓名 |
性别 |
年龄 |
所在部门 |
|
1010 |
李勇 |
男 |
20 |
11 |
|
1011 |
刘晨 |
女 |
19 |
|
|
1012 |
王敏 |
女 |
22 |
12 |
|
1014 |
张立 |
男 |
21 |
13 |
部门表
|
部门号 |
部门名称 |
电话 |
|
11 |
生产科 |
566 |
|
12 |
计划科 |
578 |
|
13 |
一车间 |
467 |
|
14 |
科研所 |
|
用sql表达职工表和部门表的内连接、左外连接、右外连接操作如下:
内连接:
select 职工.*,部门名称,电话
from 职工 inner join 部门 on 职工.所在部门 = 部门.部门号
左外连接:
select 职工.*,部门名称,电话
from 职工 left join 部门 on 职工.所在部门 = 部门.部门号
右外连接:
select 职工.*,部门名称,电话
from 职工 right join 部门 on 职工.所在部门 = 部门.部门号
各种连接的结果集对照表
内连接结果集,如下所示,进保留了两张表符合条件的元组。
|
职工号 |
姓名 |
性别 |
年龄 |
所在部门 |
部门名称 |
电话 |
|
1010 |
李勇 |
男 |
20 |
11 |
生产科 |
566 |
|
1012 |
王敏 |
女 |
22 |
12 |
计划科 |
578 |
|
1014 |
张立 |
男 |
21 |
13 |
一车间 |
467 |
左外连接结果集,如下所示,左表中元组全部包含,右表中只包含符合条件的,不符合条件的为空。
|
职工号 |
姓名 |
性别 |
年龄 |
所在部门 |
部门名称 |
电话 |
|
1010 |
李勇 |
男 |
20 |
11 |
生产科 |
566 |
|
1011 |
刘晨 |
女 |
19 |
|
|
|
|
1012 |
王敏 |
女 |
22 |
12 |
计划科 |
578 |
|
1014 |
张立 |
男 |
21 |
13 |
一车间 |
467 |
右外连接结果集,如下所示,右表中元组全部包含,左表中只包含符合条件的,不符合条件的为空。
|
职工号 |
姓名 |
性别 |
年龄 |
所在部门 |
部门名称 |
电话 |
|
1010 |
李勇 |
男 |
20 |
11 |
生产科 |
566 |
|
1012 |
王敏 |
女 |
22 |
12 |
计划科 |
578 |
|
1014 |
张立 |
男 |
21 |
13 |
一车间 |
467 |
|
|
|
|
|
|
科研所 |
|