mysql中各种常见join连表查询实例总结
本文实例讲述了mysql中各种常见join连表查询。分享给大家供大家参考,具体如下:
通常我们需要连接多个表查询数据,以获取想要的结果。
一、连接可以分为三类:
(1)内连接:join,innerjoin
(2)外连接:leftjoin,leftouterjoin,rightjoin,rightouterjoin,union,unionall
(3)交叉连接:crossjoin
二、准备需要演示的表:
CREATETABLE`a`( `id`int(11)unsignedNOTNULLAUTO_INCREMENTCOMMENT'ID', `a_name`varchar(32)DEFAULT''COMMENT'a表名称', PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8mb4; CREATETABLE`b`( `id`int(11)unsignedNOTNULLAUTO_INCREMENTCOMMENT'ID', `a_id`int(11)DEFAULT'0'COMMENT'a表ID', `b_name`varchar(32)DEFAULT''COMMENT'b表名称', PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;
a表与b表的数据如图中所示:
三、内连接innerjoin或join
select*fromainnerjoinbona.id=b.a_id; select*fromajoinbona.id=b.a_id; select*froma,bwherea.id=b.a_id;
结果如下:
内连接可以理解为,两个表中同时满足某条件的数据记录组合。也就是表A和表B中满足条件a.id=b.a_id的所有记录。
当表A中的一条记录对应表B中的多条记录时,会以重复的方式对应多条表B记录出现在结果集中。
当表B中的一条记录对应表A中的多条记录时,会以重复的方式对应多条表A记录出现在结果集中。
四、外连接leftjoin或rightjoin
(1)左外连接
select*fromaleftjoinbona.id=b.a_id; select*fromaleftouterjoinbona.id=b.a_id;
左外连接,会以左边的表A为主表,返回所有行,即使右表B中没有匹配的行。
如果左边的表A在右表B中找不到一条记录,则返回表A所有记录并且表B相应的字段设为null。
如果左边的表A在右表B中找到多条记录,则以相同表A记录和不同表B记录多条显示在结果集中。
这种情况下,其实是把表A中所有记录都查询出来了,包括不满足条件的记录。
如果我们只想查出表A中满足条件的,或是不满足条件的,该怎么查?
select*fromaleftjoinbona.id=b.a_idwhereb.a_idisnotnull; select*fromaleftouterjoinbona.id=b.a_idwhereb.a_idisnotnull;
上面的语句查询的,就是表A中满足条件的。
select*fromaleftjoinbona.id=b.a_idwhereb.a_idisnull; select*fromaleftouterjoinbona.id=b.a_idwhereb.a_idisnull;
上面的语句查询的,就是表A中不满足条件的。
(2)右外连接
select*fromarightjoinbona.id=b.a_id; select*fromarightouterjoinbona.id=b.a_id;
右外连接其实跟左外连接一样,区别在于主表的确定,两者之间可以相互转换。
右外连接的描述基本与左外连接相同,这里就不过多描述了。
(3)全连接fulljoin
mysql并不支持全连接,不过有相应的替代方案,就是leftjoinunionrightjoin来代替。
select*fromaleftjoinbona.id=b.a_id union select*fromarightjoinbona.id=b.a_id;
全连接会从表A和表B中返回所有的行,如果表A中的行在表B中没有匹配,或是表B中的行在表A中没有匹配,这些行都会显示,不存在的字段以null补充。
union会把其中重复的行合并。
这种情况下,是把表A和表B中满足条件和不满足条件的记录都显示出来了。
如果只想显示所有不满足条件的记录,则通过如下语句:
select*fromaleftjoinbona.id=b.a_idwhereb.a_idisnull union select*fromarightjoinbona.id=b.a_idwherea.idisnull;
如果只想显示所有满足条件的记录,则通过如下语句:
select*fromaleftjoinbona.id=b.a_idwhereb.a_idisnotnull union select*fromarightjoinbona.id=b.a_idwherea.idisnotnull;
五、交叉连接
交叉连接实际上就是表A与表B的笛卡尔乘积。
select*fromacrossjoinb; select*froma,b;
更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL查询技巧大全》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》及《MySQL数据库锁相关技巧汇总》
希望本文所述对大家MySQL数据库计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。