在 MySQL 中进行多表联合查询时,主要使用 `JOIN` 语句将多个表通过公共字段关联起来。以下是具体说明和示例:
一、基本语法结构
```sql
SELECT 列1, 列2, ...
FROM 表1
JOIN 表2 ON 表1.字段号 = 表2.字段号
[JOIN 类型]
[WHERE 条件]
```
SELECT 子句:指定需要返回的列,可使用 `*` 指代所有列。
FROM 子句:指定主表。
JOIN 类型:根据需求选择不同连接方式:
`INNER JOIN`(内连接):返回两个表中匹配的记录;
`LEFT JOIN`(左连接):返回左表所有记录,右表无匹配时结果为 NULL;
`RIGHT JOIN`(右连接):返回右表所有记录,左表无匹配时结果为 NULL;
`FULL JOIN`(全连接):返回两个表所有记录,无匹配时对应列为 NULL。
ON 子句:定义表间关联条件;
WHERE 子句:过滤查询结果。
二、多表联合查询示例
假设有以下三个表:
employees(员工表):`id`, `name`, `department_id`
departments(部门表):`id`, `department_name`
salaries(薪资表):`id`, `salary`
1. 内连接(INNER JOIN)
查询属于特定部门的员工薪资信息:
```sql
SELECT e.name, d.department_name, s.salary
FROM employees e
INNER JOIN departments d ON e.department_id = d.id
INNER JOIN salaries s ON e.id = s.id
WHERE d.department_name = '销售部';
```
说明:仅返回部门为“销售部”的员工记录。
2. 左连接(LEFT JOIN)
查询所有员工及其所属部门薪资,若无对应部门则显示 NULL:
```sql
SELECT e.name, d.department_name, s.salary
FROM employees e
LEFT JOIN departments d ON e.department_id = d.id
LEFT JOIN salaries s ON e.id = s.id;
```
说明:即使员工不属于任何部门,仍会显示员工信息,部门名称和薪资为 NULL。
3. 全连接(FULL JOIN)
查询所有员工及所有部门信息,缺失部分填充 NULL:
```sql
SELECT e.name, d.department_name, s.salary
FROM employees e
FULL JOIN departments d ON e.department_id = d.id
FULL JOIN salaries s ON e.id = s.id;
```
说明:包含所有员工和部门,未匹配的记录对应字段为 NULL。
三、注意事项
多表连接顺序:
可链式使用 `JOIN`,例如连接三个表:
```sql
SELECT * FROM employees
JOIN departments ON employees.department_id = departments.id
JOIN salaries ON employees.id = salaries.id;
```
性能优化:
- 确保关联字段有索引;
- 避免在 `WHERE` 子句中使用函数或计算表达式。
特殊场景:
- 使用 `UNION` 合并多个独立查询结果,需注意去重:
```sql
SELECT * FROM students
UNION ALL
SELECT * FROM courses;
```
默认 `UNION` 会去重,使用 `UNION ALL` 可保留重复记录。
通过合理使用 `JOIN` 类型和优化查询条件,可高效实现多表数据关联与分析。