除了left join还有没有其他join?
时间: 2025-07-11 20:17:56 浏览: 11
<think>我们正在讨论SQL中的JOIN类型,用户询问除了LEFT JOIN之外还有哪些JOIN。
根据SQL标准,常见的JOIN类型包括:
1. INNER JOIN(内连接):返回两个表中匹配的行。
2. LEFT JOIN(左连接):返回左表的所有行,以及右表中匹配的行(不匹配则为NULL)。
3. RIGHT JOIN(右连接):返回右表的所有行,以及左表中匹配的行(不匹配则为NULL)。
4. FULL OUTER JOIN(全外连接):返回两个表中所有的行,匹配的行合并,不匹配的部分用NULL填充。
5. CROSS JOIN(交叉连接):返回两个表的笛卡尔积,即左表的每一行与右表的每一行组合。
6. 此外,还有自然连接(NATURAL JOIN)等,但使用较少。
我们将按照以下结构回答:
1. 列举并解释每种JOIN类型。
2. 给出每种JOIN的SQL示例。
3. 说明使用场景。
注意:回答后必须提出3-5个相关问题,以“§§相关问题§§”开头。</think>### SQL 中 JOIN 的完整类型解析
除了 `LEFT JOIN`,SQL 提供多种 JOIN 类型应对不同关联场景:
---
#### 一、六大 JOIN 类型详解
| 类型 | 别名 | 作用描述 | 示意图 |
|-----------------------|--------------------|--------------------------------------------------------------------------|------------------|
| **`INNER JOIN`** | `JOIN` (默认) | 仅返回两表匹配的行(交集) | [🔵∩🟡] |
| **`LEFT JOIN`** | `LEFT OUTER JOIN` | 返回左表所有行 + 右表匹配行(右表无匹配则填充 NULL) | [🔵→🟡] |
| **`RIGHT JOIN`** | `RIGHT OUTER JOIN` | 返回右表所有行 + 左表匹配行(左表无匹配则填充 NULL) | [🔵←🟡] |
| **`FULL JOIN`** | `FULL OUTER JOIN` | 返回两表所有行(无匹配的对方表字段填充 NULL) | [🔵∪🟡] |
| **`CROSS JOIN`** | 笛卡尔积 | 返回两表所有行组合(左表每行 × 右表每行) | [🔵×🟡] |
| **`SELF JOIN`** | 自连接 | 同一表内通过别名建立关联(常用于层级数据) | [🔵→🔵] |
---
#### 二、核心语法示例
1. **INNER JOIN(最常用)**
```sql
-- 获取有订单的用户信息
SELECT u.name, o.order_no
FROM user u
INNER JOIN orders o ON u.id = o.user_id;
```
2. **FULL JOIN(全外连接)**
```sql
-- 获取所有用户和订单(包含无订单用户+无用户归属的订单)
SELECT u.name, o.order_no
FROM user u
FULL JOIN orders o ON u.id = o.user_id;
```
3. **CROSS JOIN(笛卡尔积)**
```sql
-- 生成颜色和尺码的所有组合
SELECT colors.name, sizes.name
FROM colors
CROSS JOIN sizes;
```
4. **SELF JOIN(自连接)**
```sql
-- 查找员工的直接上级
SELECT e1.name AS employee, e2.name AS manager
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.id;
```
---
#### 三、特殊 JOIN 场景
1. **NATURAL JOIN(自然连接)**
```sql
-- 自动按相同列名关联(慎用!易出错)
SELECT *
FROM user
NATURAL JOIN orders;
```
**等效于**:
```sql
SELECT *
FROM user u
JOIN orders o ON u.id=o.id AND u.name=o.name ...; -- 所有同名列
```
2. **LATERAL JOIN(横向连接)**
```sql
-- 为每个用户获取最新3笔订单(PostgreSQL/MySQL 8.0+)
SELECT u.name, latest_orders.*
FROM user u
CROSS JOIN LATERAL (
SELECT order_no, amount
FROM orders
WHERE user_id = u.id
ORDER BY create_time DESC
LIMIT 3
) latest_orders;
```
---
#### 四、性能关键点
1. **JOIN 选择原则**
```mermaid
graph LR
A[需要两表交集?] -->|是| B(INNER JOIN)
A -->|否| C{需要保留哪边全量?}
C -->|左表| D(LEFT JOIN)
C -->|右表| E(RIGHT JOIN)
C -->|两边| F(FULL JOIN)
```
2. **索引优化策略**
- `INNER JOIN`:优先在**被驱动表**关联字段建索引
- `LEFT JOIN`:在**右表**关联字段建索引
- 避免在 `WHERE` 中对驱动表字段过滤(应在 `ON` 中完成)
---
#### 五、各数据库差异
| 类型 | MySQL | PostgreSQL | SQL Server | Oracle |
|-----------------|-------|------------|------------|--------|
| `FULL JOIN` | ✓ | ✓ | ✓ | ✓ |
| `NATURAL JOIN` | ✓ | ✓ | ✓ | ✓ |
| `LATERAL JOIN` | 8.0+ | ✓ | ✓ | ✓ |
| `CROSS APPLY` | ❌ | ❌ | ✓ | ❌ |
> 注:`CROSS APPLY` 是 SQL Server 的 LATERAL JOIN 实现
阅读全文
相关推荐


















