在关系型数据库中,所有的信息应该只出现一次。但是,你可能会有分离在不同表中的信息,这些信息是相互关联的。
而你可能想把这些相关的信息放在一起分析其数据--也就是说,你可能想把所有的数据(或其中一部分)连接在一起。在这种情况下,你需要使用SQL的JOIN 语句。让我们学习一下它是如何工作的。
什么是SQL中的JOIN?
正如我在上面简单解释的那样,JOIN操作符可以让你以各种方式组合相关信息。有各种类型的连接,主要分为两类--内联和外联。
内联和外联的最大区别是,内联将只保留两个表中相互关联的信息(在结果表中)。另一方面,外连接也会在结果表中保留与其他表无关的信息。
让我们看看INNER JOIN和OUTER JOIN的详细工作情况,以便更好地理解它们。
如何在SQL中使用INNER JOIN
内联将只保留两个联接表中相关的信息。如果你把这两个表想象成一个维恩图,那么由内联产生的表将是下面它们重叠的绿色突出部分:
内联表的维恩图表示
下面是内联接的语法:
SELECT * FROM table1
JOIN table2
ON relation;
内联的语法
我们将在下面的例子中看到它是如何工作的。
如何在SQL中使用OUTER JOIN
如果你想保留所有的数据,而不仅仅是相互关联的数据,你可以使用一个OUTER连接。
有三种类型的外联接。LEFT JOIN,RIGHT JOIN, 和FULL JOIN 。它们之间的区别涉及到保留哪些不相关的数据--可以是第一个表中的,也可以是第二个表中的,或者是两个表中的。没有数据填充的单元格将有一个值:NULL 。
注意:LEFT JOIN 是所有版本的SQL中最普遍的实现。但是,RIGHT JOIN 和FULL JOIN 则不是这样,它们在各种SQL版本中都没有实现。
让我们看看每个人是如何单独工作的。然后我们再通过下面的例子看看它们都是如何工作的。
SQL中的LEFT OUTER JOIN
LEFT OUTER JOIN,或者简单的说是Left Join,将保留左边(第一个)表中的不相关的数据。
你可以把它想象成一个有两个圆圈的维恩图,结果表是绿色的高亮部分,包括共同/重叠部分,以及左边圆圈的其余部分。
左外联接的维恩图表示
语法看起来如下所示。你会看到它与Inner Join的语法相似,但加入了LEFT 关键字:
SELECT columns
FROM table1
LEFT JOIN table2
ON relation;
左外联接
SQL中的RIGHT OUTER JOIN
RIGHT OUTER JOIN,或者简称为Right Join,将把与第一个表无关的数据保留在第二个表中。
你可以用一个有两个圆圈的维恩图来想象它,结果表是绿色突出显示的部分,它包括重叠的部分,以及右圈的其余部分:
右外联接的维恩图表示
语法如下,唯一不同的是RIGHT 关键字:
SELECT columns
FROM table1
RIGHT JOIN table2
ON relation;
右外联接
SQL中的FULL OUTER JOIN
你可以认为FULL OUTER JOIN是左联接和右联接的组合。它将保留两个表中的所有记录,而缺失的数据将用NULL 来填补。
你可以用一个有两个圆圈的维恩图来想象它,结果表是绿色突出显示的部分,它包括了所有的东西:重叠部分、左圆和右圆。
全外联的维恩图表示
语法如下,使用FULL 关键字:
SELECT columns
FROM table1
FULL JOIN table2
ON relation;
全外联接
SQL JOIN操作的例子
一个兽医诊所的数据库可能有一个宠物表和一个主人表。由于一个主人可能有多个宠物,宠物表将有一个owner_id 列,指向主人表:
| id | 名字 | 年龄 | 业主_id |
|---|---|---|---|
| 1 | Fido | 7 | 1 |
| 2 | 大小姐 | 3 | 1 |
| 3 | 茜茜 | 10 | 2 |
| 4 | 铜牌 | 1 | 3 |
| 5 | 漏斗 | 2 | 0 |
| id | 名称 | 电话_号码 |
|---|---|---|
| 1 | 约翰尼 | 4567823 |
| 2 | 奥利 | 7486513 |
| 3 | 伊莱尼亚 | 3481365 |
| 4 | 路易丝 | 1685364 |
你可以用简单的查询来得到一个表,其中有宠物的名字和主人的名字相邻。让我们用所有不同的JOIN操作符来做吧。
SQL INNER JOIN例子
让我们先用JOIN 。
SELECT 在这种情况下,你将从pets 表的name 列(并重命名为pet_name )。然后你将从owners 表中选择name 列,并将其重命名为owner 。这看起来就像这样:SELECT pets.name AS pet_name, owners.name AS owner 。
你可以用FROM 来表示这些列来自pets 表,用JOIN 来表示你想把它和owners 表连接起来,使用这样的语法。FROM pets JOIN owner.
最后,当pets 表中的owner_id 列等于owner 表中的id 列时,你会说你想把两行连在一起,用ON pets.owner_id = owners.id 。
在这里,它是一起的:
SELECT pets.name AS pet_name, owners.name AS owner
FROM pets
JOIN owners
ON pets.owner_id = owners.id;
你会得到一个如下的表,其中只包括与主人相连的宠物和与宠物相连的主人:
| 宠物_名称 | 主人 |
|---|---|
| 菲多 | 强尼 |
| 密西 | 强尼 |
| 茜茜 | 欧力 |
| 銅牌 | 伊莲娜 |
SQL LEFT JOIN例子
让我们用LEFT JOIN 做同样的查询,这样你就可以看到区别。除了添加LEFT 关键字外,该查询是相同的:
SELECT pets.name AS pet_name, owners.name AS owner
FROM pets
LEFT JOIN owners
ON pets.owner_id = owners.id;
在这种情况下,来自左边表pets 的行都被保留,当有数据从owners 表丢失时,就用NULL 来填补:
| 宠物名称 | 主人 |
|---|---|
| 菲多 | 强尼 |
| 密西 | 强尼 |
| 茜茜 | 欧力 |
| 銅牌 | 伊莲娜 |
| 霍普 | 命名 |
似乎有一只宠物没有注册主人。
SQL RIGHT JOIN的例子
如果你用RIGHT JOIN 做同样的查询,你会得到一个不同的结果:
SELECT pets.name AS pet_name, owners.name AS owner
FROM pets
RIGHT JOIN owners
ON pets.owner_id = owners.id;
在这种情况下,所有来自右表的行,owners ,都被保留,如果有一个缺失的值,就用NULL :
| 宠物名称 | 主人 |
|---|---|
| 菲多 | 强尼 |
| 密西 | 强尼 |
| 茜茜 | 欧力 |
| 銅牌 | 伊莲娜 |
| NULL | 露易丝 |
似乎有一个主人没有注册宠物。
SQL FULL JOIN例子
你可以再次做同样的查询,使用FULL JOIN :
SELECT pets.name AS pet_name, owners.name AS owner
FROM pets
FULL JOIN owners
ON pets.owner_id = owners.id;
结果表又是不同的--在这个例子中,两个表中的所有记录都被保留:
| 宠物名称 | 主人 |
|---|---|
| 菲多 | 强尼 |
| 密西 | 强尼 |
| 茜茜 | 欧力 |
| 銅牌 | 伊莲娜 |
| 霍普 | NULL |
| 毋庸置疑 | 露易丝 |
看来,在我们的数据库中,有一个没有主人的宠物和一个没有宠物的主人。
结论
在一个关系型数据库中,所有的数据应该只写一次。为了分析这些数据,你需要一些东西来把相关的数据连接起来。
在这篇文章中,你已经学会了如何使用JOIN操作符来做到这一点。我希望它对你有用,祝你愉快