不论使用哪个平台,数据库基础理论知识还是要了解和掌握的,本文内容列为必学内容。
作为 SQL Server 初学者,理解表的联合查询(JOIN)是非常重要的基础。下面我会用通俗易懂的方式,从定义到示例,一步步带你掌握 内连接、左连接、右连接、全外连接,并展示两个以上表的多表联合查询。
本文目录
显示
一、什么是“联合查询”?
在数据库中,数据通常分散在多个表中。联合查询(JOIN) 就是把多个表的数据“拼接”在一起,根据某些共同字段(通常是主键和外键)进行匹配,从而获取更完整的信息。
二、常见的 JOIN 类型
| 类型 | 中文名称 | 说明 |
|---|---|---|
INNER JOIN | 内连接 | 只返回两个表中都有匹配的记录 |
LEFT JOIN(或 LEFT OUTER JOIN) | 左连接 | 返回左表全部记录,右表没有匹配的用 NULL 填充 |
RIGHT JOIN(或 RIGHT OUTER JOIN) | 右连接 | 返回右表全部记录,左表没有匹配的用 NULL 填充 |
FULL JOIN(或 FULL OUTER JOIN) | 全外连接 | 返回左右表所有记录,没有匹配的地方用 NULL 填充 |
💡 在 SQL Server 中,
LEFT JOIN是最常用的,因为通常我们关心“主表”的所有数据,即使关联表没有对应信息。
三、准备示例表结构
我们假设以下三个表:
表1:员工表(员工信息)
-- 员工表
CREATE TABLE 员工表 (
员工编号 INT PRIMARY KEY,
员工姓名 NVARCHAR(50),
部门编号 INT
);
表2:部门表(部门信息)
-- 部门表
CREATE TABLE 部门表 (
部门编号 INT PRIMARY KEY,
部门名称 NVARCHAR(50)
);
表3:薪资表(员工薪资)
-- 薪资表
CREATE TABLE 薪资表 (
员工编号 INT PRIMARY KEY,
月薪 DECIMAL(10,2)
);
插入一些测试数据(可选):
INSERT INTO 员工表 VALUES (1, '张三', 101), (2, '李四', 102), (3, '王五', NULL);
INSERT INTO 部门表 VALUES (101, '技术部'), (102, '市场部'), (103, '人事部');
INSERT INTO 薪资表 VALUES (1, 8000.00), (2, 7500.00); -- 注意:王五没有薪资记录
四、各种 JOIN 示例
1️⃣ 内连接(INNER JOIN)——只查有匹配的员工和部门
-- 查询员工姓名及其所属部门名称(仅当员工有对应部门时才显示)
SELECT
员工表.员工姓名 AS 员工姓名,
部门表.部门名称 AS 所属部门
FROM 员工表
INNER JOIN 部门表 ON 员工表.部门编号 = 部门表.部门编号;
-- 结果:张三(技术部)、李四(市场部);王五因部门编号为NULL,不显示

2️⃣ 左连接(LEFT JOIN)——查所有员工,即使没部门也显示
-- 查询所有员工,包括没有分配部门的(如王五)
SELECT
员工表.员工姓名 AS 员工姓名,
部门表.部门名称 AS 所属部门
FROM 员工表
LEFT JOIN 部门表 ON 员工表.部门编号 = 部门表.部门编号;
-- 结果:张三、李四、王五(王五的“所属部门”为 NULL)

3️⃣ 右连接(RIGHT JOIN)——查所有部门,即使没人也显示
-- 查询所有部门,包括没有员工的部门(如人事部)
SELECT
员工表.员工姓名 AS 员工姓名,
部门表.部门名称 AS 所属部门
FROM 员工表
RIGHT JOIN 部门表 ON 员工表.部门编号 = 部门表.部门编号;
-- 结果:张三、李四、以及人事部(员工姓名为 NULL)

4️⃣ 全外连接(FULL JOIN)——查所有员工 + 所有部门
-- 显示所有员工和所有部门,不管有没有匹配
SELECT
员工表.员工姓名 AS 员工姓名,
部门表.部门名称 AS 所属部门
FROM 员工表
FULL JOIN 部门表 ON 员工表.部门编号 = 部门表.部门编号;
-- 结果:张三、李四、王五(部门NULL)、人事部(员工NULL)

⚠️ 注意:SQL Server 支持
FULL JOIN,但有些数据库(如 MySQL)不支持。
五、多表联合查询(超过两个表)
现在我们把 员工表、部门表、薪资表 三张表联合起来,查询:员工姓名、所属部门、月薪
-- 查询员工姓名、所属部门、月薪(只显示有薪资的员工)
SELECT
员工表.员工姓名 AS 员工姓名,
部门表.部门名称 AS 所属部门,
薪资表.月薪 AS 月薪
FROM 员工表
-- 先左连部门表(确保所有员工都出现)
LEFT JOIN 部门表 ON 员工表.部门编号 = 部门表.部门编号
-- 再左连薪资表(确保即使没薪资也显示员工)
LEFT JOIN 薪资表 ON 员工表.员工编号 = 薪资表.员工编号;

结果示例:
| 员工姓名 | 所属部门 | 月薪 |
|---|---|---|
| 张三 | 技术部 | 8000.00 |
| 李四 | 市场部 | 7500.00 |
| 王五 | NULL | NULL |
✅ 使用多个
LEFT JOIN是处理“主表+多个附属信息”的常用方式。
六、小贴士(初学者注意)
- ON 子句 是连接条件,必须写清楚两个表如何关联(通常是主外键)。
- 别名(AS) 可以让字段名更清晰,尤其在多表时避免歧义。
- 如果不用
JOIN而用逗号(如FROM A, B WHERE ...),那是老式写法,不推荐。 - 多表连接时,顺序很重要:通常从“主表”开始,再逐步 LEFT JOIN 其他表。
希望这份讲解能帮你轻松入门 SQL Server 的联合查询!😊
在WorkFine中使用
只要有数据源的地方,都能看到联合的身影,这里随意列出几个位置





WorkFine内完整教程可查阅:数据集成丨视图的详细教程和示例-数据表关联
搜索词:联合、左联合、左联合、左联接、左联接
© 版权声明
THE END




![SQL错误[156][S0001]:关键字key附近有语法错误(数据库保留字段查询方法)-本牛千智丨专注WorkFine开发](https://www.bn1000.com/wp-content/uploads/2025/05/20250530165142712-SQL语句.jpg)










