你能给我所有sql连接类型并给出测试例子和输出结果帮我区分他们的区别吗 (表请用统一的表数据,并且可以保证每个不同的连接例子能够输出不同的值)
常见的 SQL 连接类型
当然,下面是常见的 SQL 连接类型:
-
INNER JOIN(内连接):返回两个表中匹配的行,基于一个指定的连接条件。
-
LEFT JOIN(左连接):返回左表中的所有行,以及右表中匹配的行(如果有),如果右表中没有匹配的行,则返回 NULL 值。
-
RIGHT JOIN(右连接):返回右表中的所有行,以及左表中匹配的行(如果有),如果左表中没有匹配的行,则返回 NULL 值。
-
FULL JOIN(全外连接):返回左表和右表中的所有行,如果没有匹配的行,则使用 NULL 值填充。
-
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
相似。但是,语义上来说,它们仍有区别。
让我们通过一个示例来说明这个区别:
假设我们有两个表格 A
和 B
,他们的数据如下:
表格 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
来指定连接条件。