MySQL连表查询是一把双刃剑,一方面通过连表查询可以简化SQL的数量;但另一方面如果连接的表数据量较大,或者连接的表较多,其产生的笛卡尔积会成指数级增长,所以有些公司会禁用连表查询。
连表查询即两张表或多张表联合查询,联合查询得到的结果称为笛卡尔积,假设A表中有n条记录,B表表中有m条记录,则它们联合查询得到的笛卡尔积为:n*m
大家可能听过很多种连接方式,比如内连接、外连接、自然连接、交叉连接、左连接以及右连接,但MySQL的连表查询其实只有3种:内连接、外连接、自然连接。 其中内连接等同于交叉连接,而外连接可以分为左外连接(左连接)和右外连接(右连接),仅此而已。
这是一张神图,可以辅助理解:
不管是哪种连接,本质上都是在总的笛卡尔积下进行筛选过滤而已。
内连接的关键字是 INNER JOIN
,INNER JOIN
等于CROSS JOIN
等于JOIN
。
内连接分为两种情况,一种没有筛选条件;另一种是有ON
或者WHERE
筛选条件,假设我们有两张这样的表:
create table `table_a` (
`aid` int(11) NOT NULL AUTO_INCREMENT,
`a_name` varchar(255) NOT NULL,
`age` smallint NOT NULL,
PRIMARY KEY(`aid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '测试表A';
create table `table_b` (
`bid` int(11) NOT NULL