
本文介绍如何使用 inner join 联合 employees 和 users 表,精准筛选 practice_group_id 为 2 且对应用户 level 为 1 的员工记录,纠正误用 union 的常见误区。
本文介绍如何使用 inner join 联合 employees 和 users 表,精准筛选 practice_group_id 为 2 且对应用户 level 为 1 的员工记录,纠正误用 union 的常见误区。
在关系型数据库中,当查询逻辑依赖“一个表中的字段需关联另一张表的属性进行过滤”时(例如:员工所属实践组为 2,且其关联用户等级为 1),核心解法是表连接(JOIN),而非集合操作(如 UNION)。UNION 用于合并多个查询结果集的行,不建立表间逻辑关联,因此完全不适用于本场景。
正确的做法是使用 INNER JOIN 基于外键关系(employees.CMS_user_id ↔ users.id)连接两表,并在 WHERE 子句中同时施加业务条件:
SELECT e.* FROM employees e INNER JOIN users u ON u.id = e.CMS_user_id WHERE e.practice_group_id = 2 AND u.level = 1;
✅ 关键说明:
- e 和 u 是表别名,提升可读性与书写效率;
- INNER JOIN 确保只返回 CMS_user_id 在 users 表中真实存在的员工(即自动排除悬空引用);
- 条件 e.practice_group_id = 2 作用于 employees 表,u.level = 1 作用于 users 表,二者通过连接逻辑统一生效;
- 若需包含无匹配用户的员工(如 CMS_user_id 为空或无效),应改用 LEFT JOIN 并配合 u.level = 1 OR u.id IS NULL —— 但本需求明确要求“用户 level 必须为 1”,故 INNER JOIN 更准确、高效。
⚠️ 注意事项:
- 确保 employees.CMS_user_id 和 users.id 字段类型一致(如均为 INT),否则连接可能意外失败或性能下降;
- 建议为 employees.CMS_user_id 和 users.id 分别建立索引,尤其当数据量较大时,可显著加速连接与过滤过程;
- 若存在多对一关系(如一个 user 对应多个 employees),该查询会自然返回所有符合条件的员工记录,符合预期语义。
综上,掌握 JOIN + WHERE 的组合是处理跨表条件查询的基石。理解其“先关联、后过滤”的执行逻辑,远比记忆语法更重要。

















