# JOIN 与子查询

URL: https://caijiao.org/postgresql/basic/sql-query/join-subquery
Source: docs/postgresql/basic/sql-query/join-subquery.md
Description: 讲解 PostgreSQL 中的 JOIN 操作与子查询，包括不同类型的 JOIN（内连接、外连接等）以及子查询的使用场景与语法。

## JOIN 操作

JOIN 是用来将两个或多个表中的数据结合起来，以便从多个表中提取相关信息。

### 内连接（INNER JOIN）

`INNER JOIN` 返回两个表中匹配的记录。

```sql
SELECT employees.name, departments.name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;
````

### 左外连接（LEFT JOIN）

`LEFT JOIN` 返回左表中的所有记录，以及右表中匹配的记录。如果右表没有匹配记录，则结果为 `NULL`。

```sql
SELECT employees.name, departments.name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id;
```

### 右外连接（RIGHT JOIN）

`RIGHT JOIN` 返回右表中的所有记录，以及左表中匹配的记录。如果左表没有匹配记录，则结果为 `NULL`。

```sql
SELECT employees.name, departments.name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.id;
```

### 全外连接（FULL OUTER JOIN）

`FULL OUTER JOIN` 返回左表和右表中的所有记录，左表和右表没有匹配时，结果为 `NULL`。

```sql
SELECT employees.name, departments.name
FROM employees
FULL OUTER JOIN departments ON employees.department_id = departments.id;
```

### 自连接（SELF JOIN）

自连接用于连接同一个表，通常用于查询与当前行有某种关系的其他行。

```sql
SELECT e1.name AS employee, e2.name AS manager
FROM employees e1
JOIN employees e2 ON e1.manager_id = e2.id;
```

## 子查询

子查询是嵌套在其他查询中的查询，通常用来处理复杂的查询条件。

### 简单子查询

子查询通常在 `WHERE` 子句中作为条件使用。

```sql
SELECT name, salary
FROM employees
WHERE department_id = (SELECT id FROM departments WHERE name = 'Sales');
```

### 子查询与 `IN` 语法

使用 `IN` 与子查询结合，检查某个字段是否在子查询的结果中。

```sql
SELECT name, salary
FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE name = 'Sales');
```

### 子查询与 `EXISTS` 语法

`EXISTS` 用于检查子查询是否返回结果。

```sql
SELECT name
FROM employees e
WHERE EXISTS (SELECT 1 FROM departments d WHERE d.id = e.department_id AND d.name = 'Sales');
```

### 聚合函数与子查询

子查询可以与聚合函数一起使用，用来返回分组后的数据。

```sql
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
```

## 小结

`JOIN` 操作和子查询是 PostgreSQL 查询中非常强大的功能。`JOIN` 适用于将多个表中的相关数据结合，而子查询则提供了更加灵活的查询方式，尤其是在复杂的查询需求下。
