SQL四种连接类型的介绍和区别

你能给我所有sql连接类型并给出测试例子和输出结果帮我区分他们的区别吗 (表请用统一的表数据,并且可以保证每个不同的连接例子能够输出不同的值)

常见的 SQL 连接类型

当然,下面是常见的 SQL 连接类型:

  1. INNER JOIN(内连接):返回两个表中匹配的行,基于一个指定的连接条件。

  2. LEFT JOIN(左连接):返回左表中的所有行,以及右表中匹配的行(如果有),如果右表中没有匹配的行,则返回 NULL 值。

  3. RIGHT JOIN(右连接):返回右表中的所有行,以及左表中匹配的行(如果有),如果左表中没有匹配的行,则返回 NULL 值。

  4. FULL JOIN(全外连接):返回左表和右表中的所有行,如果没有匹配的行,则使用 NULL 值填充。

  5. CROSS JOIN(交叉连接):返回两个表的笛卡尔积,即每个表的每一行与另一个表的每一行组合。

接下来,我将为你提供每种连接类型的测试例子和输出结果。我们将使用以下两个简单的表格:

Employees 表:

+------+----------+
|  id  |  name    |
+------+----------+
|  1   |  Alice   |
|  2   |  Bob     |
|  3   |  Charlie |
+------+----------+

Salaries 表:

+------+--------+
|  id  |  salary|
+------+--------+
|  1   |  5000  |
|  3   |  6000  |
|  4   |  5500  |
+------+--------+

现在,我们将使用这两个表格来说明每种连接类型的区别:

INNER JOIN(内连接):

SELECT e.id, e.name, s.salary
FROM Employees e
INNER JOIN Salaries s ON e.id = s.id;

输出结果:

+------+----------+--------+
|  id  |  name    | salary |
+------+----------+--------+
|  1   |  Alice   |  5000  |
|  3   |  Charlie |  6000  |
+------+----------+--------+

———————————————————————————————————————————

LEFT JOIN(左连接):

SELECT e.id, e.name, s.salary
FROM Employees e
LEFT JOIN Salaries s ON e.id = s.id;

输出结果:

+------+----------+--------+
|  id  |  name    | salary |
+------+----------+--------+
|  1   |  Alice   |  5000  |
|  2   |  Bob     |  NULL  |
|  3   |  Charlie |  6000  |
+------+----------+--------+

———————————————————————————————————————————

RIGHT JOIN(右连接):

SELECT e.id, e.name, s.salary
FROM Employees e
RIGHT JOIN Salaries s ON e.id = s.id;

输出结果:

+------+----------+--------+
|  id  |  name    | salary |
+------+----------+--------+
|  1   |  Alice   |  5000  |
|  3   |  Charlie |  6000  |
|  4   |  NULL    |  5500  |
+------+----------+--------+

———————————————————————————————————————————

FULL JOIN(全外连接)

SELECT e.id, e.name, s.salary
FROM Employees e
FULL JOIN Salaries s ON e.id = s.id;

输出结果:

+------+----------+--------+
|  id  |  name    | salary |
+------+----------+--------+
|  1   |  Alice   |  5000  |
|  2   |  Bob     |  NULL  |
|  3   |  Charlie |  6000  |
|  4   |  NULL    |  5500  |
+------+----------+--------+

———————————————————————————————————————————

CROSS JOIN(交叉连接)

SELECT e.id, e.name, s.salary
FROM Employees e
CROSS JOIN Salaries s;

输出结果:

+------+----------+--------+
|  id  |  name    | salary |
+------+----------+--------+
|  1   |  Alice   |  5000  |
|  2   |  Alice   |  5000  |
|  3   |  Alice   |  5000  |
|  1   |  Bob     |  6000  |
|  2   |  Bob     |  6000  |
|  3   |  Bob     |  6000  |
|  1   |  Charlie |  5500  |
|  2   |  Charlie |  5500  |
|  3   |  Charlie |  5500  |
+------+----------+--------+

这些例子展示了每种连接类型的不同行为。在实际应用中,你应该根据具体需求来选择合适的连接类型。

———————————————————————————————————————————

内连接 join/inner join 是 交叉连接cross join 加上条件的版本吗?

不完全是。

CROSS JOIN 加上条件会产生与 INNER JOIN 相似的结果,但语义上略有不同。

INNER JOIN 中,连接条件是必须的,它用于过滤要连接的行。只有满足连接条件的行才会被连接。而在 CROSS JOIN 中,没有连接条件,它会生成两个表的笛卡尔积,即每个表的每一行与另一个表的每一行组合,然后再根据条件进行过滤。

如果你在 CROSS JOIN 中加上条件,那么实际上它变成了一个在笛卡尔积上进行过滤的操作,这种操作与 INNER JOIN 相似。但是,语义上来说,它们仍有区别。

让我们通过一个示例来说明这个区别:

假设我们有两个表格 AB,他们的数据如下:

表格 A:

+----+------+
| id | name |
+----+------+
| 1  | Alice|
| 2  | Bob  |
+----+------+

表格 B:

+----+------+
| id | job  |
+----+------+
| 1  | Cook |
| 2  | Clerk|
+----+------+

交叉连接 Cross Join 加条件:

SELECT *
FROM A
CROSS JOIN B
WHERE A.id = B.id;

输出结果:

+----+-------+----+-------+
| id | name  | id | job   |
+----+-------+----+-------+
| 1  | Alice | 1  | Cook  |
| 2  | Bob   | 2  | Clerk |
+----+-------+----+-------+

———————————————————————————————————————————

内连接 Inner Join:

SELECT *
FROM A
INNER JOIN B ON A.id = B.id;

输出结果:

+----+-------+----+-------+
| id | name  | id | job   |
+----+-------+----+-------+
| 1  | Alice | 1  | Cook  |
| 2  | Bob   | 2  | Clerk |
+----+-------+----+-------+

如你所见,这两个查询的输出结果是一样的。

但在语义上,第一个查询是在笛卡尔积上进行了过滤,

而第二个查询是明确地使用了 INNER JOIN 来指定连接条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值