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数据库计有所帮助。
编程语言
- 宿迁百度关键词排名指南:实现精准营销的关键
- 四川SEO优化怎么做网络推广
- 立昂技术备案老域名收购:如何为您的业务赋能
- 安徽百度关键词seo贵不贵,一般需要多少钱
- 吉林百度快照排名怎么做电话营销
- 多伦新手做SEO怎么做
- 甘肃优化关键词排名推广怎么做论坛营销
- 沙雅SEO网站推广:提升您的在线可见性
- 四川SEO优化如何提升销售额和销售量
- 聂荣网站排名优化:提升网站可见性的全方位指
- 涞水SEO:提升地方企业在线可见性的策略
- 辽宁百度seo排名怎样做网站排名
- 临湘哪有关键词排名优化:提升网站可见度的关
- 黑龙江百度网站优化有没有优惠
- 凉城优化关键词排名推广:提升您的网络可见性
- 萝北整站优化:提升您网站流量和排名的全面指