SQL JOIN是软件开发者的必会知识点,这些JOIN有什么区别和联系呢,本文来一一剖析。
要了解SQL,其实我们需要了解下关系代数。为什么这么说呢?
数据库系统合并数据的原理其实是基于关系代数。SQL 语言是在关系代数上的一层封装,目的是方便程序员使用。关系代数是 SQL 语言的基础。
1、关系代数:
关系代数是由E.F.Codd于1970年提出的,它是合并数据集合的理论基础。
关系代数的操作接受一个或多个关系作为输入,再输出一个新的关系,不同的关系操作可以进行相互的组合。例如可以先进行选择操作再进行投影操作,先进行自然连接操作再进行选择操作等等。根据不同的需求需要灵活的组合这些操作。
2、在关系代数的形式化语言中:
用表、或者数据集合表示关系或者实体。
用行表示元组。
用列表示属性。
3、关系代数包含三大类运算符:
关系运算符 :选择、投影、连接、除
集合运算符 :并、差、交、笛卡尔积
比较操作符:大于 小于 等于 与 或 非
比较操作符比较简单就不介绍了,集合和关系运算符共8个,我们简单说明:
选择-返回满足指定条件的行。select
投影-从数据集合中返回指定的列。
连接-在水平方向上合并两个表,其方法是:将两个表中在共同数据项上相互匹配的那些行合并起来。Join
除-返回两个数据集之间的精确匹配。
并-关系的加法和减法,它可以在行的方向上合并两个表中的数据,就像把一个表垒在另一个表之上一样。
交-返回两个数据集合所共有的行。
差-返回只属于一个数据集合的行。
笛卡尔积-是关系的乘法,它将分别来自两个数据集合中的行以所有可能的方式进行组合。
此外,作为一种实现现代关系代数运算的方法,SQL还提供了:
子查询-类似于连接,但更灵活;在外部查询中,可以使用表达式、列表或者数据集合的地方都可以使用子查询的结果。
本文将主要讲述多种类型的连接。
JOIN子句合并两个或多个表中的行。在临时表中创建一组行。
在关系代数中,连接运算是由一个笛卡尔积运算和一个选取运算构成的。首先用笛卡尔积完成对两个数据集合的乘运算,然后对生成的结果集合进行选取运算,确保只把分别来自两个数据集合并且具有重叠部分的行合并在一起。连接的全部意义在于在水平方向上合并两个数据集合(通常是表),并产生一个新的结果集合,其方法是将一个数据源中的行与另一个数据源中和它匹配的行组合成一个新元组。
SQL提供了多种类型的连接方式,它们之间的区别在于:从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同。
连接类型 |
定义 |
自身连接 |
|
内连接 |
只连接匹配的行 |
左连接或左外连接 |
包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行 |
右连接或右外连接 |
包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行 |
全外连接 |
包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。 |
自然连接 |
其结构使得具有相同名称的关联表的列将仅出现一次 |
交叉连接 |
生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配
|
自联接是表与自身联接(一元关系)的联接,特别是当表具有引用其自身PRIMARY KEY的FOREIGN KEY时。例如人力资源数据库中雇员与老板的关系。联接表本身意味着表的每一行都与自身以及表的其他每一行结合在一起。自联接可以看作是同一表的两个副本的联接。
例如:SELF JOIN
SELECT *
FROM table_A X,table_A Y
WHERE XA = YA;
只要各列之间存在匹配,INNER JOIN就会从两个参与表中选择所有行。SQL INNER JOIN与JOIN子句相同(即inner可以省略),它组合了两个或多个表中的行。
示例:INNER JOIN
SELECT * FROM table_A
INNER JOIN table_B
ON table_A.A = table_B.A;
SQL LEFT JOIN连接两个表,并根据条件获取行,两个表中的行均匹配。
JOIN子句之前的表中还将提供不匹配的行。
示例:LEFT JOIN或LEFT OUTER JOIN
SELECT * FROM table_A
LEFT JOIN table_B
ON table_A.A = table_B.A;
SQL RIGHT JOIN连接两个表,并根据条件获取行,两个表中的行均匹配。不匹配的行也可以从JOIN子句后面编写的表中获得。
示例:RIGHT JOIN或RIGHT OUTER JOIN
SELECT * FROM table_A
RIGHT JOIN table_B
ON table_A.A = table_B.A;
合并左右外部联接的结果。返回所有匹配或不匹配的行。在join子句的两边都包含表。
说明:全外连接返回参与连接的两个数据集合中的全部数据,无论它们是否具有与之相匹配的行。在功能上,它等价于对这两个数据集合分别进行左外连接和右外连接,然后再使用消去重复行的并操作将上述两个结果集合并为一个结果集。
在现实生活中,参照完整性约束可以减少对于全外连接的使用,一般情况下左外连接就足够了。在数据库中没有利用清晰、规范的约束来防范错误数据情况下,全外连接就变得非常有用了,你可以使用它来清理数据库中的数据。
示例:FULL OUTER JOIN
SELECT * FROM table_A
FULL OUTER JOIN table_B
ON table_A.A = table_B.A;
如果未与CROSS JOIN一起使用WHERE子句,则SQL CROSS JOIN会产生一个结果集,该结果集是第一个表中的行数乘以第二个表中的行数。这种结果称为笛卡尔积。例如,如果第一个数据源中有5个行,而第二个数据源中有4个行,那么在它们之间进行交叉连接就会产生20个行。如果WHERE子句与CROSS JOIN一起使用,则其功能类似于INNER JOIN。
说明:大多数交叉连接都是由于错误操作而造成的;但是它们却非常适合向数据库中填充例子数据,或者预先创建一些空行以便为程序执行期间所要填充的数据保留空间。
示例:CROSS JOIN
SELECT *
FROM table_A
Cross join table_B;
SQL NATURAL JOIN是EQUI JOIN的一种,其结构使得具有相同名称的关联表的列将仅出现一次。关联的表具有一对或多对相同名称的列。这些列必须是相同的数据类型。不要在自然连接中使用ON子句。
示例:NATURAL JOIN
SELECT *
FROM table_A
NATURAL JOIN table_B;
1、掌握SQL语言要掌握关系代数。关系代数的三类运算符:关系运算符、集合运算符、比较操作符。数据库系统合并数据的原理其实是基于关系代数。SQL 语言是在关系代数上的一层封装。
2、不同join之间的区别。