MySQL 之多表查询

交叉连接

交叉连接(cross join)如下所示:

select * from t1 cross join t2;
OR
select * from t1,t2;

t1 表中的每一行记录都与 t2 表中的任一行记录相关联,反之亦然。这个结果与“笛卡尔乘积”一样。

内连接

内连接(inner join)的查询结果是两张表中同时满足某个条件的组合,若不添加查询条件,那么内连接的查询结果和交叉连接的查询结果是相同的。

select * from t1 inner join t2 on t1.id = t2.id;
OR
select * from t1 join t2 on t1.id = t2.id;
OR
select * from t1 inner join t2 where t1.id = t2.id;
OR
select * from t1,t2 where t1.id = t2.id;

使用 on 或 where 指明查询条件,相当于两张表符合某个条件的交集。

若给交叉连接添加查询条件,得出的结果和内连接是相同的,但在通用 SQL 标准中,这二者是不同的。

内连接可分为等值连接和不等连接,前例展示的是等值连接,不等连接的形式如下:

select * from t1 inner join t2 on t1.id > t2.id;

查询出的结果比“等值连接”更多一些。

内连接还有一种自连接,它连接的表是它自身,如下所示:

select * from t1 t11 inner join t1 t12 on t11.id = t12._id;
OR
select * from t1 t11, t1 t12 where t11.id = t12._id;

通过指定不同的字段,把一张表作为两张表来查询。

外连接

外连接分为左外连接(left outer join)和右外连接(right outer join)。左外连接查询出的数据在同等条件下比内连接更多一些。

select * from t1 t11 left outer join t1 t12 on t11.id = t12._id;
OR
select * from t1 t11 left join t1 t12 on t11.id = t12._id;

左外连接不仅会查询出两个表中同时符合条件的记录组合,还会将 “left outer join” 左侧的表中不符合条件的记录展示出来。由于左侧表中的这部分记录不符合连接条件,因此这部分记录使用空记录进行连接。

扫描二维码关注公众号,回复: 110126 查看本文章

即在左外连接中左侧表中的所有记录都会被查询出来,符合条件的记录会与右侧表中符合条件的记录相互连接组合,不符合条件的记录则与右侧表中的空记录连接。

与左外连接类似,右外连接则是将右侧表中的所有记录都展示出来,符合条件的记录会与左侧表中符合条件的记录相互连接组合,不符合条件的记录则与左侧表中的空记录连接。

select * from t1 t11 right outer join t1 t12 on t11.id = t12._id;
OR
select * from t1 t11 right join t1 t12 on t11.id = t12._id;

使用外连接查询出数据后,还可使用 where 子句对查询出的结果进行过滤,如下所示:

select * from t1 t11 right join t1 t12 on t11.id = t12._id where t11.id is not null;

过滤掉 t11.id 为 null 的记录。

联合查询

联合查询(union)是把多个查询语句的查询结果集中在一起展示。

select * from t1 union select * from t2;

t2 表中的数据会接在 t1 表后显示,因此两个 select 语句查询出的字段数量必须相同。

若两个表中有重复的数据,那么会被合并为一条记录。

使用 union all 进行查询时,重复的记录全部都会被展示出来。

全连接

在全连接(full join)中,只要某个表匹配条件,就会返回记录,并使用 null 作为缺失匹配的结果。MySQL 并直接不支持 “full join” 关键字,但可通过 “left join”、“union” 以及 “right join” 的组合来实现 “full join”。

select * from t1 t11 left join t1 t12 on t11.id = t12._id;
union
select * from t1 t11 right join t1 t12 on t11.id = t12._id;

查询出的数据包含 t1 和 t2 表中匹配条件的任一行。

对于查询出的数据,也可使用 where 子句进一步的过滤。

猜你喜欢

转载自www.cnblogs.com/reghao/p/8991008.html