连表查询 mysql实例_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

cb324c09b71f576e65a73fa66950a757.png

二、准备需要演示的表:

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表的数据如图中所示:

d4c862c09037a8a28e5c4332a1eccc97.png

三、内连接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;

结果如下:

a272e3d8c2acb2a02e468871c0cf2679.png

内连接可以理解为,两个表中同时满足某条件的数据记录组合。也就是表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;

e5afbe17f8a5db8c2fc430fda2f34bf6.png

左外连接,会以左边的表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;

ce75674aeca047c4ccb5eb0a4db2ff84.png

上面的语句查询的,就是表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;

2ef7ac85eb7414a5c77b498d3caa3578.png

上面的语句查询的,就是表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;

51421b01f43aa39846eb35d267e575be.png

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

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

(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;

3f7176993499e7ccaf5fe7fd8045395a.png

全连接会从表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;

17c21fdb5590855147ee2073cbd5c9f6.png

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

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

本文标题: mysql中各种常见join连表查询实例总结

本文地址: http://www.cppcns.com/shujuku/mysql/300859.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值