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

作者:怀素真 时间:2024-01-19 05:31:52 

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

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

一、连接可以分为三类:

(1) 内连接:join,inner join

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

(3) 交叉连接:cross join

 mysql中各种常见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表的数据如图中所示:

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

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

结果如下:

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

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

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

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

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

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

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

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

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

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

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

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

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

全连接会从表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中各种常见join连表查询实例总结

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

来源:https://www.cnblogs.com/jkko123/p/10129154.html

标签:mysql,join,连表查询
0
投稿

猜你喜欢

  • Python使用Selenium、PhantomJS爬取动态渲染页面

    2023-12-20 22:24:55
  • 彻底搞懂python 迭代器和生成器

    2021-09-14 05:00:26
  • JavaScript实现简易轮播图最全代码解析(ES5)

    2024-04-16 10:40:22
  • Oracle常见错误代码的分析与解决

    2024-01-14 20:28:51
  • Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】 <font color=red>原创</font>

    2021-08-21 17:17:21
  • python 如何对logging日志封装

    2023-07-06 11:27:36
  • mysql 8.0.28 安装配置方法图文教程

    2024-01-16 16:40:26
  • web前端页面性能优化

    2009-08-15 12:31:00
  • 浅谈JS原生Ajax,GET和POST

    2024-04-16 08:52:41
  • Keras搭建孪生神经网络Siamese network比较图片相似性

    2023-01-27 04:16:28
  • Python入门教程(三十一)Python的Try和Except

    2022-02-26 01:21:14
  • Python3 集合set入门基础

    2021-04-25 10:20:46
  • MySQL5.7更改密码时出现ERROR 1054 (42S22)的解决方法

    2024-01-23 12:12:47
  • Python定时爬取微博热搜示例介绍

    2022-09-18 21:59:18
  • Mac OS下PHP环境搭建及PHP操作MySQL常用方法小结

    2024-05-08 10:16:31
  • Html中 IFrame的用法及注意点

    2023-07-02 05:30:16
  • 24式加速你的Python(小结)

    2023-09-25 10:25:24
  • 使用keras实现BiLSTM+CNN+CRF文字标记NER

    2022-05-01 04:46:22
  • 不用mod_rewrite直接用php实现伪静态化页面代码

    2023-11-01 07:07:45
  • 发现一个不错的11px字体:PMingLiu

    2008-09-06 12:49:00
  • asp之家 网络编程 m.aspxhome.com