[sql]join的5种方式:inner join、left(outer) join、right (outer) Join、full(outer) join、cross join...
时间: 2024-06-05 14:12:11 浏览: 92
是的,你说得对,SQL中常用的join方式有以下五种:
1. Inner Join:仅返回满足两个表中关联条件的记录。语法为:SELECT * FROM table1 INNER JOIN table2 ON table1.column = table2.column。
2. Left (Outer) Join:返回左表中所有记录和右表中满足关联条件的记录。如果右表中没有匹配的记录,仍然返回左表中的所有记录。语法为:SELECT * FROM table1 LEFT JOIN table2 ON table1.column = table2.column。
3. Right (Outer) Join:与左外连接相反,返回右表中所有记录和左表中满足关联条件的记录。如果左表中没有匹配的记录,仍然返回右表中的所有记录。语法为:SELECT * FROM table1 RIGHT JOIN table2 ON table1.column = table2.column。
4. Full (Outer) Join:返回左表和右表中所有记录,如果某个表中没有匹配的记录,将返回NULL值。语法为:SELECT * FROM table1 FULL OUTER JOIN table2 ON table1.column = table2.column。
5. Cross Join:返回两个表中的所有记录的笛卡尔积(即没有任何条件约束的连接)。语法为:SELECT * FROM table1 CROSS JOIN table2。
相关问题
②联接查询中,INNER JOIN、 LEFT OUTER JOIN 、RIGHT OUTER JOIN、 FULL OUTER JOIN 的结果各有什么不同?
### 不同类型的 JOIN 查询结果区别
#### 1. INNER JOIN
`INNER JOIN` 返回两张表中满足连接条件的记录。这意味着只有那些在两张表中都存在的匹配数据才会被返回。
```sql
SELECT table1.column_name, table2.column_name
FROM table1
INNER JOIN table2 ON table1.common_field = table2.common_field;
```
在这种情况下,如果 `common_field` 的值在任一表中不存在,则对应的行不会出现在结果集中[^1]。
#### 2. LEFT OUTER JOIN (LEFT JOIN)
`LEFT OUTER JOIN` 或简称 `LEFT JOIN` 将返回左表中的所有记录以及右表中与之匹配的记录。如果没有找到匹配项,那么对应的位置将以 `NULL` 值填充。
```sql
SELECT table1.column_name, table2.column_name
FROM table1
LEFT JOIN table2 ON table1.common_field = table2.common_field;
```
此查询会确保无论是否有匹配项,都会显示左侧表的所有行[^4]。
#### 3. RIGHT OUTER JOIN (RIGHT JOIN)
类似于 `LEFT JOIN`,但是这里是保留右侧表的所有记录,并补充左侧表的相关信息或者以 `NULL` 替代缺失部分。
```sql
SELECT table1.column_name, table2.column_name
FROM table1
RIGHT JOIN table2 ON table1.common_field = table2.common_field;
```
这种形式通常较少见,因为可以通过交换两侧表位置实现同样的功能[^4]。
#### 4. FULL OUTER JOIN
理论上讲,`FULL OUTER JOIN` 是将 `LEFT JOIN` 和 `RIGHT JOIN` 的结果结合起来展示所有的不重复组合。但实际上并非所有数据库引擎原生支持这一特性;例如 MySQL 并无直接提供这样的关键字[^2]。
一种替代方案是在标准 SQL 中使用如下方法模拟:
```sql
SELECT *
FROM table1
LEFT JOIN table2 ON table1.common_field = table2.common_field
UNION ALL
SELECT *
FROM table1
RIGHT JOIN table2 ON table1.common_field = table2.common_field
WHERE table1.common_field IS NULL;
```
这里利用了 `UNION ALL` 来合并两个独立的部分,同时排除掉重复的内容[^3]。
---
### 联接查询中列名使用表名的规则
正如之前讨论过的那样,在进行多表联合检索的时候,为了避免名称冲突或者是提升语句可读性,应该遵循一定的命名约定原则:
- 当同一个字段名字仅仅在一个单独的表格里出现时,可以选择不用加前缀说明它来自于哪个特定的对象;
- 对于跨多个资源文件共享的名字而言,则强烈建议采用完全限定的形式书写出来以便清楚表明意图所在之处[^1][^2]。
此外还需注意一点就是当涉及到复杂的子询问结构或者其他高级技巧应用场合下也可能需要更加细致入微地对待这个问题以免造成不必要的麻烦或混乱局面发生。
---
JOIN: 可以是 INNER JOIN、LEFT JOIN、RIGHT JOIN 或 FULL JOIN
### SQL JOIN 类型及用法
#### 1. INNER JOIN
`INNER JOIN` 返回两个表中存在匹配的行。如果在指定的连接条件中没有找到匹配的记录,则不会返回任何数据。
```sql
SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name = table_name2.column_name;
```
例如,假设有两个表 `A` 和 `B`,其中 `A.id` 和 `B.id` 是连接条件,那么只有当 `A.id` 和 `B.id` 存在匹配时,才会返回对应的行[^2]。
#### 2. LEFT JOIN (或 LEFT OUTER JOIN)
`LEFT JOIN` 返回左表中的所有行,以及右表中与左表匹配的行。如果右表中没有匹配的行,则结果集中对应的列将包含 `NULL` 值。
```sql
SELECT A.*, B.*
FROM A
LEFT JOIN B
ON A.id = B.id;
```
例如,对于表 `A` 和 `B`,即使 `B` 中没有与 `A` 匹配的记录,`A` 的所有行仍然会出现在结果集中,而 `B` 的列将填充为 `NULL` 值[^3]。
#### 3. RIGHT JOIN (或 RIGHT OUTER JOIN)
`RIGHT JOIN` 返回右表中的所有行,以及左表中与右表匹配的行。如果左表中没有匹配的行,则结果集中对应的列将包含 `NULL` 值。
```sql
SELECT A.*, B.*
FROM A
RIGHT JOIN B
ON A.id = B.id;
```
例如,对于表 `A` 和 `B`,即使 `A` 中没有与 `B` 匹配的记录,`B` 的所有行仍然会出现在结果集中,而 `A` 的列将填充为 `NULL` 值[^3]。
#### 4. FULL JOIN (或 FULL OUTER JOIN)
`FULL JOIN` 返回左表和右表中的所有行。如果某一行在另一个表中没有匹配的行,则结果集中对应的列将包含 `NULL` 值。需要注意的是,MySQL 不支持 `FULL JOIN`,但可以通过 `UNION` 来模拟实现。
```sql
SELECT A.*, B.*
FROM A
FULL JOIN B
ON A.id = B.id;
```
在 MySQL 中,可以使用以下方法模拟 `FULL JOIN`:
```sql
SELECT *
FROM A
LEFT JOIN B ON A.id = B.id
UNION
SELECT *
FROM A
RIGHT JOIN B ON A.id = B.id;
```
这种情况下,`UNION` 操作符用于合并 `LEFT JOIN` 和 `RIGHT JOIN` 的结果集[^4]。
### 示例代码
以下是一个完整的示例,展示如何使用不同的 JOIN 类型:
```sql
-- 创建示例表
CREATE TABLE A (
id INT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE B (
id INT PRIMARY KEY,
value VARCHAR(50)
);
-- 插入示例数据
INSERT INTO A (id, name) VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Charlie');
INSERT INTO B (id, value) VALUES (2, 'X'), (3, 'Y'), (4, 'Z');
-- INNER JOIN 示例
SELECT A.id, A.name, B.value
FROM A
INNER JOIN B ON A.id = B.id;
-- LEFT JOIN 示例
SELECT A.id, A.name, B.value
FROM A
LEFT JOIN B ON A.id = B.id;
-- RIGHT JOIN 示例
SELECT A.id, A.name, B.value
FROM A
RIGHT JOIN B ON A.id = B.id;
-- FULL JOIN 示例(MySQL)
SELECT A.id, A.name, B.value
FROM A
LEFT JOIN B ON A.id = B.id
UNION
SELECT A.id, A.name, B.value
FROM A
RIGHT JOIN B ON A.id = B.id;
```
### 注意事项
- `INNER JOIN` 只返回匹配的行,而 `LEFT JOIN` 和 `RIGHT JOIN` 还会返回不匹配的行,并用 `NULL` 填充。
- `FULL JOIN` 在某些数据库中可能不受支持,需要通过 `UNION` 模拟实现。
- 使用 `JOIN` 时,确保连接条件明确且优化良好,以避免性能问题。
阅读全文
相关推荐













