表连接 (JOIN) — 从零开始掌握SQL联合查询
表连接 (JOIN) — 从零开始掌握SQL联合查询定义与作用在SQL中表连接是将两张或多张表的数据横向拼接为一个临时大表的操作。其核心作用在于当业务需求所需的数据分布在多个表中时通过连接查询将它们汇总呈现。连接方式的分类表连接主要分为以下几类内连接、外连接、交叉连接以及一些特殊连接。1. 内连接 (INNER JOIN)语法结构SELECT *|列名|计算|常量|函数|(子查询) -- 选择要展示的列 FROM 表名1 | (子查询) INNER JOIN 表名2 | (子查询) ON 关联条件 (可附加 AND/OR 条件) [INNER JOIN 表名3 | (子查询) ON 关联条件...] ... -- 可连接多张表 [WHERE 分组前的过滤条件] -- 不可使用聚合函数 [GROUP BY 分组内容] [HAVING 分组后的过滤条件] -- 可使用聚合函数 [ORDER BY 排序内容 ASC|DESC];核心特点仅显示符合关联条件即匹配成功的数据行不匹配的数据将被忽略不显示。示例连接emp员工表和dept部门表。SELECT * FROM emp INNER JOIN dept ON emp.deptno dept.deptno;2. 外连接 (OUTER JOIN)外连接根据保留主表的不同分为三种左外连接、右外连接和全外连接。左外连接 (LEFT [OUTER] JOIN)语法FROM 左表 LEFT JOIN 右表 ON 关联条件核心特点以左表为主。左表数据全部显示若右表无匹配数据则右表字段以NULL值填充。示例查询所有员工及其部门信息即使某些员工没有分配部门。SELECT * FROM emp LEFT JOIN dept ON emp.deptno dept.deptno;右外连接 (RIGHT JOIN)语法FROM 左表 RIGHT JOIN 右表 ON 关联条件核心特点以右表为主。右表数据全部显示若左表无匹配数据则左表字段以NULL值填充。示例查询所有部门信息以及部门下的员工即使某部门暂无员工。SELECT * FROM emp RIGHT JOIN dept ON emp.deptno dept.deptno;全外连接 (FULL JOIN)语法FROM 表1 FULL JOIN 表2 ON 关联条件核心特点两张表的数据全部显示。任何一边缺少匹配时另一侧对应字段均以NULL值填充。示例展示emp表和dept表的所有关联可能性。SELECT * FROM emp FULL JOIN dept ON emp.deptno dept.deptno;3. 交叉连接 (CROSS JOIN)定义其结果是两张表的笛卡尔积Cartesian Product即表1行数 × 表2行数。语法FROM 表1 CROSS JOIN 表2无关联条件。特点与风险会产生大量无意义的组合形成错误数据。工作中应尽量避免直接使用笛卡尔积。示例等同于笛卡尔积SELECT * FROM emp CROSS JOIN dept; -- 等效于旧式语法SELECT * FROM emp, dept;4. 特殊连接方式自然连接 (NATURAL JOIN)语法FROM 表1 NATURAL JOIN 表2无ON条件。特点自动寻找两表中所有同名列进行等值连接。仅显示匹配成功的行并且会去除重复的关联列。示例SELECT * FROM emp NATURAL JOIN dept;不等值连接说明这不是一种独立的连接类型而是指关联条件不是等号而是大于、小于、BETWEEN等。示例查询员工信息及其对应的工资等级salgrade表。SELECT * FROM salgrade LEFT JOIN emp ON emp.sal BETWEEN salgrade.losal AND salgrade.hisal;自连接 (SELF JOIN)说明同一张表与自己进行连接是一种应用场景而非特定关键字。关键在于为表使用别名来区分角色。示例查询员工信息及其对应的领导信息领导也在同一张emp表中。SELECT * FROM emp a -- 员工表别名a LEFT JOIN emp b -- 领导表别名b ON a.mgr b.empno;核心对比内连接 vs. 左连接内连接只保留两张表都匹配的数据交集。左连接保留左表的全部数据右表不匹配则填充NULL。区分应用当需要找出“左表有但右表没有”的记录时如没有部门的员工可使用左连接配合WHERE 右表.主键 IS NULL的过滤条件。