在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 |
|
|
|
|
| 科研所 |
|