前言 在日常开发工作中,数据通常分散存储于多个数据库表中,因此多表联合查询成为必不可少的操作技能。多表查询的核心机制,是对多张表的数据取笛卡尔积——通俗来说,就是将不同表中的所有记录进行排列组合,列出所有可能的匹配结果。 单看概念可能不够直观,下面通过一个具体实例进行演示。 经过排列组合后得到的结果
在日常开发工作中,数据通常分散存储于多个数据库表中,因此多表联合查询成为必不可少的操作技能。多表查询的核心机制,是对多张表的数据取笛卡尔积——通俗来说,就是将不同表中的所有记录进行排列组合,列出所有可能的匹配结果。
单看概念可能不够直观,下面通过一个具体实例进行演示。
长期稳定更新的攒劲资源: >>>点此立即查看<<<

经过排列组合后得到的结果如下:

从结果中可以清晰看出:笛卡尔积的列数等于两表列数之和(3 + 2 = 5),而行数则等于两表行数之积(2 × 4 = 8)。
这里需要特别注意:在执行多表查询(即计算笛卡尔积)时,如果两个表的数据量较大,该操作会变得非常低效,甚至可能构成危险操作——因为组合数量呈现指数级增长趋势。
下面直接通过代码进行演示:

提示(多表场景):若涉及三个或更多表,则先对前两张表执行笛卡尔积运算,再将结果与第三张表进行同样的操作,以此类推。
既然笛卡尔积只是机械地进行排列组合,并未自动筛选有效数据,那么如何从中提取出真正有用的信息呢?这就需要借助连接条件,例如 student.classId = classes.classId。简单来说,连接条件用于指定两张表之间的数据对应关系。

归纳而言,多表查询(即联合查询)的本质可以概括为一句话——笛卡尔积 + 连接条件 + 具体业务需求。首先执行笛卡尔积运算,然后通过连接条件剔除无效数据,最后根据业务需要添加筛选或排序逻辑。

使用 join ... on 语法也能达到相同的查询效果:

编码时需要注意一个常见问题:若两个表中存在同名字段(例如 classId),必须采用 表名.列名 的形式进行明确指定,否则会引发错误。

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