在关系代数中,连接运算是由一个笛卡尔积运算和一个选取运算构成的。首先用笛卡尔积完成对两个数据集合的乘运算,然后对生成的结果集合进行选取运算,确保只把分别来自两个数据集合并且具有重叠部分的行合并在一起。连接的全部意义在于在水平方向上合并两个数据集合(通常是表),并产生一个新的结果集合,其方法是将一个数据源中的行于另一个数据源中和它匹配的行组合成一个新元组。SQL提供了多种类型的连接方式,它们之间的区别在于:从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同。
Join操作定义
不同的SQL JOIN操作如下表所示:
连接类型 | 定义 | |
Inner Join | 内连接是最常见的一种连接,它也被称为普通连接,只连接匹配的行(仅对满足连接条件的CROSS中的列)。它又分为等值连接(连接条件运算符为"=")和不等值连接(连接条件运算符不为"=",例如between...and)。 | |
Outer Join | Full Outer Join | FULL JOIN 会从左表 和右表 那里返回所有的行。如果其中一个表的数据行在另一个表中没有匹配的行,那么对面的数据用NULL代替 |
Left Outer Join | LEFT JOIN返回左表的全部行和右表满足ON条件的行,如果左表的行在右表中没有匹配,那么这一行右表中对应数据用NULL代替。 | |
Right Outer Join | RIGHT JOIN返回右表的全部行和左表满足ON条件的行,如果右表的行在左表中没有匹配,那么这一行左表中对应数据用NULL代替。 | |
Cross Join | CROSS对两个表执行笛卡尔乘积。它为左表行和右表行的每种可能的组合返回一行。返回(左表行数*右表行数)行的表。 | |
Appendix | Natural Join | 自然连接是一种特殊的等值连接,在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。 |
自连接 | 某个表和其自身连接,常用在同一表内不同数据间对同一列的比较 |
Join操作实例
自连接
select
a.emp_no,
a.emp_name,
a.date_hired,
b.emp_no,
b.emp_name,
b.date_hired
from
employee a join employee b
on a.emp_no!=b.emp_no
and a.date_hired=b.date_hired
order by a.date_hired
这样操作会产生重复的数据,只需要加上一句a.emp_name > b.emp_name 就可以达到去重的目的。
UNION操作
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
另外,UNION和UNION ALL结果集的列名总是等于UNION中第一个SELECT语句中的列名。