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
二、准备需要演示的表:
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数据库计有所帮助。
来源:https://www.cnblogs.com/jkko123/p/10129154.html


猜你喜欢
- 遇到mysql ERROR 1045 这个问题搞了很久,自己记下来。方法是百度的,亲测有效。ERROR 1045 (28000): Acce
- 今儿继续再看老师给推荐的深入浅出mysql数据库开发这本书,看到innodb数据库的外键关联问题时,遇到了一个问题,书上写的是可以对父表进行
- 一、RPM版安装查看是否有其他版本的数据库,若有,删除干净非root用户必须要有sudo权限1.下载mysql相关安装包https://mi
- 前文: 之前一直用Elemet-UI的upload组件,但是ui给出的样式Element-UI满足不了,所以决定自己写一个玩玩总体分三步:1
- 总结常用基本点如下: 1、触发器有两种类型:数据定义语言触发器(DDL触发器)和数据操纵语言触发器(DML触发器)。 DDL触发器:在用户对
- 背景:这个库的安装不是像其他的一样的直接使用 pip install XXX的形式,而是使用原始的Git方式1、apex这是NVIDIA开发
- java后台相关问题一,程序包lombok不存在通常报这个错误,是因为,我们的开发者工具idea没有安装lombok库导致的解决办法如下:提
- 一、修改 sonar 配置 conf/sonar.properties修改 sonar 配置文件 conf/sonar.properties
- GIT安装访问: https://git-scm.com/downloads ,进入git'下载页面,根据个人操作系统下载对应软件版
- 使用mysql5.5,突然root密码忘记,怎么也登录不了,很急人,该怎么解决呢?下面通过本文给大家介绍mysql5.5忘记root密码的解
- WSGI(Web Server Gateway Interface):Web服务网关接口,是Python中定义的服务器程序和应用程序之间的接
- 本文实例为大家分享了python修改装饰器中参数的具体代码,供大家参考,具体内容如下案例: &
- 在做分类模型时候,需要在DataFrame中按照行获取数据以便于进行训练和测试。import pandas as pddict=[[1,2,
- 前言本文主要给大家介绍了关于linux/mac安装mysql忘记密码的相关解决办法,分享出来供大家参考借鉴,下面话不多说了,来一起看看详细的
- 现在假如要写一个按照"标题",'内容','作者'等等进行针对性的选择,这时需要涉及到使用
- 这篇文章主要介绍了python实现括号匹配方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- 通过Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案。主要原因是有些论文打印出是黑白色的,不同类别
- 科学设计你的网站网页:来自 Eye-Tracking研究的23节必修课 ——Christina Laun在网络设计领域关于Eye-
- Web技术的发展速度太快了,如果你不与时俱进,就会被淘汰。因此,为了应对即将到来的HTML5,本文总结了22个HTML5的初级技巧,希望能对
- 为了庆祝自己的博客重新开放,我在这里放一个自己刚刚写的jquery日期插件, 也许人们会说:日期选取插件已