首页 > 数据库 >MySQL表的内外连接使用详解

MySQL表的内外连接使用详解

来源:互联网 2026-03-26 12:06:34

目录内连接外连接内连接内连接实际上就是利用where子句对两种表形成的笛卡尔积进行筛选,前面所说过的查询都是内连接,也是在开发过程中使用的最多的连接查询。select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;inner join : 将两个表按照指定条件关联匹配,只返回两个表中满足连接条件的行。可简写为joinon : 用来指定join的关联条件为连接两个表的核心规则,也可附加筛选条件显示SMITH的名字和部门名称用上一篇的写法为内连接的写法为select en

目录
  • 内连接
  • 外连接

内连接

搞数据库查询,绕不开的一个基础概念就是内连接。它干的事情其实挺简单:把两张表放到一起,做一个所有可能的组合(也就是笛卡尔积),然后用一个条件,只挑出那些匹配得上的行留下。

说白了,咱们之前用过的那些查询,多半都属于内连接。在真实的开发场景里,这也是用得最频繁的一种连接方式。

它的标准语法长这样:

select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;

这里面有几个关键点:

inner join:这个词组就是执行内连接操作的核心,它负责把两张表按照你给的条件关联起来。不过,在实际写的时候,很多人会直接简写成 join,效果一样。

on:这个关键字后面跟的,就是匹配两张表的核心规则。它决定了哪些行能被“连接”上。有趣的是,这里不仅可以放连接条件,还能加一些额外的筛选条件。

光说理论有点抽象,来看个具体例子吧。比如我们要“显示SMITH的名字和他所在的部门名称”。

如果用传统一点的写法,大概是这样的: MySQL表的内外连接使用详解

但如果换成内连接的写法,思路就清晰多了:

select ename,dname from EMP inner join DEPT on EMP.deptno=DEPT.deptno where ename='SMITH';
-- 或者,把筛选条件直接放到on后面也行
select ename,dname from EMP inner join EMP.deptno=DEPT.deptno and ename='SMITH';

这两种写法都能得到正确结果。关键区别在于思路:on子句先把两张表关联起来,形成一个临时的“大表”(即满足连接条件的部分);然后where子句再从这个临时表里,精准地过滤出我们最终想要的那一行。

MySQL表的内外连接使用详解

是不是感觉逻辑层次分明了许多?这种写法在处理复杂关联时,优势会更明显。

外连接

左外连接

说完了内连接,咱们再来看看它的“兄弟”——外连接。首先登场的是左外连接

它的核心原则就一句话:无论如何,我要确保左边这张表的每一行数据都完整地显示出来。就算右边的表里找不到能匹配的行,左边表的记录也照样会出现在结果集里,只是右边表对应的字段会以NULL值填充。

语法是这样的:

select 字段名 from 表名1 left join 表名2 on 连接条件

举个例子就容易理解了。假设有四名学生,但只有其中两人有考试成绩。如果我们使用内连接(inner join),结果只会显示那两名有成绩的学生。

但如果我们的需求是:“查询所有学生的成绩,就算学生没有成绩,也要把他的个人信息显示出来”。这时候,左外连接就派上用场了。

MySQL表的内外连接使用详解

看,左边学生表的数据全部展示了,右边成绩表有匹配的就显示分数,没匹配的就用NULL占位,完美解决了问题。

右外连接

理解了左外连接,右外连接就很好类推了。它的原则和左外连接正好镜像:确保右边这张表的每一行数据都完整显示。

语法也如出一辙:

select 字段 from 表名1 right join 表名2 on 连接条件;

比如,我们换一个需求:“显示所有的考试成绩,即使这个成绩没有对应的学生信息(比如可能是系统测试数据)”。

直接用右外连接就能搞定。不过话说回来,你完全可以把这个需求里的两张表交换一下位置,然后用左外连接来实现,效果一模一样。所以,左连接和右连接在功能上是等价的,只是看问题的角度不同。

MySQL表的内外连接使用详解

一个经典的综合案例

最后,来看一个稍微综合点的例子,它能帮你彻底理解外连接的用途:“列出所有部门的名称和该部门员工的信息,同时,那些还没有任何员工的部门也要列出来”。

这个需求的关键点在于“所有部门”。显然,我们必须以部门表(DEPT)为基准,确保它完全显示。员工表(EMP)的信息则是可选的,有就关联上,没有就用NULL。这不正是左外连接的典型场景吗?

所以,写法很直接:

select * from DEPT left join EMP on EMP.deptno=DEPT.deptno;

MySQL表的内外连接使用详解

结果一目了然:所有部门都列出来了,有员工的部门后面跟着员工信息,没员工的部门(比如图中的OPERATIONS),后面的员工字段全是NULL。任务完成。

希望以上的讲解,能帮助你清晰地掌握MySQL中这两种最核心的连接方式。理解它们的本质区别,在写复杂查询时就能游刃有余了。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。