当前位置: 首页 > 编程笔记 >

mysql中各种常见join连表查询实例总结

尉迟默
2023-03-14
本文向大家介绍mysql中各种常见join连表查询实例总结,包括了mysql中各种常见join连表查询实例总结的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了mysql中各种常见join连表查询。分享给大家供大家参考,具体如下:

通常我们需要连接多个表查询数据,以获取想要的结果。

一、连接可以分为三类:

  (1) 内连接:join,inner join

  (2) 外连接:left join,left outer join,right join,right outer join,union,union all

  (3) 交叉连接:cross join

 

二、准备需要演示的表:

CREATE TABLE `a` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 `a_name` varchar(32) DEFAULT '' COMMENT 'a表名称',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `b` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 `a_id` int(11) DEFAULT '0' COMMENT 'a表ID',
 `b_name` varchar(32) DEFAULT '' COMMENT 'b表名称',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

a表与b表的数据如图中所示:

三、内连接inner join或join

select * from a inner join b on a.id = b.a_id;
select * from a join b on a.id = b.a_id;
select * from a, b where a.id = b.a_id;

结果如下:

内连接可以理解为,两个表中同时满足某条件的数据记录组合。也就是表A和表B中满足条件a.id = b.a_id的所有记录。

当表A中的一条记录对应表B中的多条记录时,会以重复的方式对应多条表B记录出现在结果集中。

当表B中的一条记录对应表A中的多条记录时,会以重复的方式对应多条表A记录出现在结果集中。

四、外连接left join或right join

  (1) 左外连接

select * from a left join b on a.id = b.a_id;
select * from a left outer join b on a.id = b.a_id;

左外连接,会以左边的表A为主表,返回所有行,即使右表B中没有匹配的行。

如果左边的表A在右表B中找不到一条记录,则返回表A所有记录并且表B相应的字段设为null。

如果左边的表A在右表B中找到多条记录,则以相同表A记录和不同表B记录多条显示在结果集中。

这种情况下,其实是把表A中所有记录都查询出来了,包括不满足条件的记录。

如果我们只想查出表A中满足条件的,或是不满足条件的,该怎么查?

select * from a left join b on a.id = b.a_id where b.a_id is not null;
select * from a left outer join b on a.id = b.a_id where b.a_id is not null;

上面的语句查询的,就是表A中满足条件的。

select * from a left join b on a.id = b.a_id where b.a_id is null;
select * from a left outer join b on a.id = b.a_id where b.a_id is null;

上面的语句查询的,就是表A中不满足条件的。

  (2) 右外连接

select * from a right join b on a.id = b.a_id;
select * from a right outer join b on a.id = b.a_id;

右外连接其实跟左外连接一样,区别在于 主表的确定,两者之间可以相互转换。

右外连接的描述基本与左外连接相同,这里就不过多描述了。

  (3) 全连接full join

mysql并不支持全连接,不过有相应的替代方案,就是left join union right join 来代替。

select * from a left join b on a.id = b.a_id
union
select * from a right join b on a.id = b.a_id;

全连接会从表A和表B中返回所有的行,如果表A中的行在表B中没有匹配,或是表B中的行在表A中没有匹配,这些行都会显示,不存在的字段以null补充。

union会把其中重复的行合并。

这种情况下,是把表A和表B中满足条件和不满足条件的记录都显示出来了。

如果只想显示所有不满足条件的记录,则通过如下语句:

select * from a left join b on a.id = b.a_id where b.a_id is null
union
select * from a right join b on a.id = b.a_id where a.id is null;

如果只想显示所有满足条件的记录,则通过如下语句:

select * from a left join b on a.id = b.a_id where b.a_id is not null
union
select * from a right join b on a.id = b.a_id where a.id is not null;

 五、交叉连接

交叉连接实际上就是表A与表B的笛卡尔乘积。

select * from a cross join b;
select * from a, b;

更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL查询技巧大全》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》及《MySQL数据库锁相关技巧汇总》

希望本文所述对大家MySQL数据库计有所帮助。

 类似资料:
  • 本文向大家介绍MySQL联表查询基本操作之left-join常见的坑,包括了MySQL联表查询基本操作之left-join常见的坑的使用技巧和注意事项,需要的朋友参考一下 概述 对于中小体量的项目而言,联表查询是再常见不过的操作了,尤其是在做报表的时候。然而校对数据的时候,您发现坑了吗?本篇文章就 mysql 常用联表查询复现常见的坑。 基础环境 建表语句 数据如下 基本业务 简单信息报表: 查询

  • 本文向大家介绍Mysql join连接查询的语法与示例,包括了Mysql join连接查询的语法与示例的使用技巧和注意事项,需要的朋友参考一下 连接查询: 是将两个查询(或表)的每一行,以“两两横同对接”的方式,所得到的所有行的结果,即一个表中的某行,跟另一个表中的某行。进行“横向对接”,得到一个新行。 连接查询包括以下这些不同形式,连接方式: 交叉连接、内连接、外连接(分:左外连接,右外连接)

  • 本文向大家介绍mysql使用from与join两表查询的区别总结,包括了mysql使用from与join两表查询的区别总结的使用技巧和注意事项,需要的朋友参考一下 前言 在mysql中,多表连接查询是很常见的需求,在使用多表查询时,可以from多个表,也可以使用join连接连个表 这两种查询有什么区别?哪种查询的效率更高呢? 带着这些疑问,决定动手试试 1.先在本地的mysql上先建两个表one和

  • 本文向大家介绍Flask框架各种常见装饰器示例,包括了Flask框架各种常见装饰器示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Flask框架各种常见装饰器。分享给大家供大家参考,具体如下: 效果类似django的process_request的装饰器 类似process_response flask中间件装饰器执行顺序。 如果多个app.before_request和app.aft

  • 本文向大家介绍MySQL表LEFT JOIN左连接与RIGHT JOIN右连接的实例教程,包括了MySQL表LEFT JOIN左连接与RIGHT JOIN右连接的实例教程的使用技巧和注意事项,需要的朋友参考一下 LEFT JOIN 语法用法与实例 MySQL LEFT JOIN 语法 SQL(MySQL) LEFT JOIN 会取得左表(table1)全部记录,即使右表(table2)并无对应匹配

  • 本文向大家介绍Mysql连接join查询原理知识点,包括了Mysql连接join查询原理知识点的使用技巧和注意事项,需要的朋友参考一下 Mysql连接(join)查询 1、基本概念 将两个表的每一行,以“两两横向对接”的方式,所得到的所有行的结果。 假设: 表A有n1行,m1列; 表B有n2行,m2列; 则表A和表B“对接”之后,就会有: n1*n2行; m1+m2列。 2、则他们对接(连接)之后