目录 1. 引言 2. 表连接概述 3. 内连接Inner Join3.1 什么是内连接3.2 案例显示 SMITH 的名字和部门名称➡️ 4. 左外连接Left Join4.1 什么是左外连接4.2 案例查询所有学生的成绩⬅️ 5. 右外连接Right Join5.1 什么是右外连接5.2 案例显示所有成绩及对应的学生️ 6. 综合练习 7. 实战 OJ 推荐 8. 总结❓ 9. 经典面试题 1. 引言在数据库查询中我们经常需要从多个表中获取数据。比如查询员工的名字和他所在的部门名称这些信息分别存储在EMP员工表和DEPT部门表中。这时就需要用到表的连接Join。表的连接是 SQL 查询的核心也是面试中的高频考点。本文将带你彻底搞懂内连接Inner Join和外连接Outer Join并通过丰富的案例和代码让你轻松掌握。 2. 表连接概述表的连接分为两种主要类型内连接Inner Join只返回两个表中匹配的行。外连接Outer Join返回一个表中的所有行即使另一个表中没有匹配的行。外连接又分为左外连接Left Join保留左表的所有数据。右外连接Right Join保留右表的所有数据。核心区别内连接只取交集外连接取并集并补上空值。 3. 内连接Inner Join3.1 什么是内连接内连接实际上就是利用WHERE子句对两种表形成的笛卡儿积进行筛选。我们前面学习的查询都是内连接也是在开发过程中使用的最多的连接查询。语法SELECT字段FROM表1INNERJOIN表2ON连接条件AND其他条件备注前面学习的FROM 表1, 表2 WHERE 条件这种写法本质上也是内连接。3.2 案例显示 SMITH 的名字和部门名称数据准备假设已有 EMP 和 DEPT 表EMP表包含员工信息ename,deptno等DEPT表包含部门信息dname,deptno等方法一使用传统的WHERE写法隐式内连接SELECTename,dnameFROMEMP,DEPTWHEREEMP.deptnoDEPT.deptnoANDenameSMITH;方法二使用标准的INNER JOIN写法显式内连接SELECTename,dnameFROMEMPINNERJOINDEPTONEMP.deptnoDEPT.deptnoANDenameSMITH;建议推荐使用显式的INNER JOIN语法可读性更好也更容易维护。INNER JOIN中的INNER可以省略直接写JOIN。➡️ 4. 左外连接Left Join4.1 什么是左外连接如果联合查询左侧的表完全显示我们就说是左外连接。也就是说左表的数据会全部出现在结果集中如果右表中没有匹配的行则对应的字段显示为NULL。语法SELECT字段名FROM表名1LEFTJOIN表名2ON连接条件4.2 案例查询所有学生的成绩场景查询所有学生的成绩如果这个学生没有成绩也要将学生的个人信息显示出来。数据准备-- 建两张表CREATETABLEstu(idINT,nameVARCHAR(30));-- 学生表INSERTINTOstuVALUES(1,jack),(2,tom),(3,kity),(4,nono);CREATETABLEexam(idINT,gradeINT);-- 成绩表INSERTINTOexamVALUES(1,56),(2,76),(11,8);执行左外连接查询-- 当左边表和右边表没有匹配时也会显示左边表的数据SELECT*FROMstuLEFTJOINexamONstu.idexam.id;结果分析idnameidgrade1jack1562tom2763kityNULLNULL4nonoNULLNULL解释stu表是左表它的所有数据jack, tom, kity, nono都显示出来了。学生kity和nono在exam表中没有成绩记录所以对应的grade字段显示为NULL。⬅️ 5. 右外连接Right Join5.1 什么是右外连接如果联合查询右侧的表完全显示我们就说是右外连接。右外连接与左外连接原理相同只是主表变成了右表。语法SELECT字段FROM表名1RIGHTJOIN表名2ON连接条件5.2 案例显示所有成绩及对应的学生场景对stu表和exam表联合查询把所有的成绩都显示出来即使这个成绩没有学生与它对应也要显示出来。SELECT*FROMstuRIGHTJOINexamONstu.idexam.id;结果分析idnameidgrade1jack1562tom276NULLNULL118解释exam表是右表它的所有数据56, 76, 8都显示出来了。成绩8对应的学生id11在stu表中不存在所以学生信息显示为NULL。️ 6. 综合练习题目列出部门名称和这些部门的员工信息同时列出没有员工的部门。方法一使用左外连接SELECTd.dname,e.*FROMdept dLEFTJOINemp eONd.deptnoe.deptno;方法二使用右外连接SELECTd.dname,e.*FROMemp eRIGHTJOINdept dONd.deptnoe.deptno;分析两种方法都能实现需求。方法一以dept表为左表方法二以dept表为右表。核心思想是哪个表的数据需要全部显示就把它作为主表左表或右表。 7. 实战 OJ 推荐理论学完一定要动手练习推荐 LeetCode 上的两道经典题目可以帮助你巩固表连接的知识LeetCode 178. 分数排名 (Rank Scores)LeetCode 626. 换座位 (Exchange Seats) 8. 总结连接类型关键字特点内连接INNER JOIN或JOIN只返回两个表中匹配的行不匹配的行不显示。左外连接LEFT JOIN返回左表的所有行右表无匹配则显示NULL。右外连接RIGHT JOIN返回右表的所有行左表无匹配则显示NULL。一句话记忆内连接取交集左外连接左表全保留右外连接右表全保留。❓ 9. 经典面试题1. 什么是内连接什么是外连接它们有什么区别内连接只返回两个表中满足连接条件的行。外连接返回一个表中的所有行即使另一个表中没有匹配的行。区别内连接只显示匹配的数据外连接会保留主表的所有数据未匹配的字段用NULL填充。2. 左外连接和右外连接有什么区别左外连接以左表为主表左表数据全部显示。右外连接以右表为主表右表数据全部显示。本质两者可以相互转换只需调整表的顺序即可。3. 写一个 SQL 查询列出所有部门及其员工信息包括没有员工的部门。-- 方法一左外连接SELECTd.dname,e.*FROMdept dLEFTJOINemp eONd.deptnoe.deptno;-- 方法二右外连接SELECTd.dname,e.*FROMemp eRIGHTJOINdept dONd.deptnoe.deptno;4. 假设有两个表Students学生和Scores成绩请查询所有学生的姓名及其成绩如果学生没有成绩也要显示其姓名。SELECTs.name,sc.scoreFROMStudents sLEFTJOINScores scONs.idsc.student_id;