mysql 多表查询详解_(转)Mysql 多表查询详解

MySQL 多表查询详解

一.前言

二.示例

三.注意事项

一.前言

上篇讲到mysql中关键字执行的顺序,只涉及了一张表;实际应用大部分情况下,查询语句都会涉及到多张表格 :

1.1 多表连接有哪些分类?

1.2 针对这些分类有哪些连接方法?

1.3 这些连接方法分别作用于哪些应用场景?

这篇针对这三个点通过实例来讲述,目的是穷尽所有的场景和所有的方法,并且对每个方法的使用做实例。

首先先列举本篇用到的分类(内连接,外连接,交叉连接)和连接方法(如下):

A)内连接:join,inner join

B)外连接:left join,left outer join,right join,right outer join,union

C)交叉连接:cross join

二.下面以实例进行分析

两张假设有两张表格A和B,把表格当作一个集合,那么表格中的记录就是集合中的一个元素。

两张表格如下:

TableA:

0474938a0847d08fdd5d2d1240552714.pngTableB:

1b36fdc4853ae7828cbcb3aa8d8b65b1.png

2.1 内连接(只有一种场景)

inner join 或者join(等同于inner join)

select a.*, b.* from tablea a

inner join tableb b

on a.id = b.id

select a.*, b.* from tablea a

join tableb b

on a.id = b.id

结果如下:

60d20be1b0e5259763ca9d99a6583a5d.png

应用场景:

fd4fdab30bc201b18698a99654b3c0a6.png

这种场景下得到的是满足某一条件的A,B内部的数据;正因为得到的是内部共有数据,所以连接方式称为内连接。

2.2 外连接(六种场景)

2.2.1 left join 或者left outer join(等同于left join)

select a.*, b.* from tablea a

left join tableb b

on a.id = b.id

或者

select a.*, b.* from tablea a

left outer join tableb b

on a.id = b.id

结果如下,TableB中更不存在的记录填充Null:

4a7e3c37dfa07bd629b3b617a3516d47.png

应用场景:

81162a33d59ac174628be3cf758581ca.png

这种场景下得到的是A的所有数据,和满足某一条件的B的数据;

2.2.2  [left   join 或者left outer join(等同于left join)]  +  [where B.column is null]

select a.id aid,a.age,b.id bid,b.name from tablea a

left join tableb b

on a.id = b.id

Where b.id is null

结果如下:

2429eb2a53b94e83bd572eb773f73edb.png

应用场景:

29bb147ae82e73fc05090f8093eacafd.png

这种场景下得到的是A中的所有数据减去"与B满足同一条件 的数据",然后得到的A剩余数据;

2.2.3  right join 或者fight outer join(等同于right join)

select a.id aid,a.age,b.id bid,b.name from tablea a

right join tableb b

on a.id = b.id

结果如下,TableB中更不存在的记录填充Null:

8bea7582b209325b2b0097b38af2f6b5.png

应用场景:

ea7e84e3b466c876aa49df979ed26f36.png

这种场景下得到的是B的所有数据,和满足某一条件的A的数据;

2.2.4 [left   join 或者left outer join(等同于left join)]  +  [where A.column is null]

select a.id aid,a.age,b.id bid,b.name from tablea a

right join tableb b

on a.id = b.id

where a.id is null

结果如下:

76cd10fe18e9379b9be59eb31a637818.png

应用场景:

19f9bebd13c73d759c85d3cc22def0ce.png

这种场景下得到的是B中的所有数据减去 "与A满足同一条件 的数据“,然后得到的B剩余数据;

2.2.5 full join (mysql不支持,但是可以用 left join  union right join代替)

select a.id aid,a.age,b.id bid,b.name from tablea a

left join tableb b

on a.id = b.id

union

select a.id aid,a.age,b.id bid,b.name from tablea a

right join tableb b

on a.id = b.id

union过后,重复的记录会合并(id为2,3,4的三条记录),所以结果如下:

755f53d4a6e7f860f673f3a6093487ef.png

应用场景:

9b040bf45172ad6e48b2b3fe3177544b.png

这种场景下得到的是满足某一条件的公共记录,和独有的记录

2.2.6 full join + is null(mysql不支持,但是可以用 (left join + is null) union (right join+isnull代替)

select a.id aid,a.age,b.id bid,b.name from tablea a

left join tableb b

on a.id = b.id

where b.id is null

union

select a.id aid,a.age,b.id bid,b.name from tablea a

right join tableb b

on a.id = b.id

where a.id is null

结果如下:

5869e5e39343f5cd45416bf194cb58b1.png

应用场景:

232b7ec28445bde8876bd40a2f8768e6.png

这种场景下得到的是A,B中不满足某一条件的记录之和

注:上面共有其中七(2^3-1)种应用场景,还有一种是全空白,那就是什么都不查,七种情形包含了实际应用所有可能的场景

2.3 交叉连接 (cross join)

2.3.1 实际应用中还有这样一种情形,想得到A,B记录的排列组合,即笛卡儿积,这个就不好用集合和元素来表示了。需要用到cross join:

select a.id aid,a.age,b.id bid,b.name from tablea a

cross join tableb b

aea209b0cf8ea90a0c60b3e21c2f5afc.png

2.3.2 还可以为cross  join指定条件 (where):

select a.id aid,a.age,b.id bid,b.name from tablea a

cross join tableb b

where a.id = b.id

结果如下;

38ef4b4d7666f6a0262b40f01a95d59e.png

注:这种情况下实际上实现了内连接的效果

三 注意事项

上面仍然存在遗漏,那就是mysql对sql语句的容错问题,即在sql语句不完全符合书写建议的情况,mysql会允许这种情况,尽可能地解释它:

3.1 一般cross join后面加上where条件,但是用cross join+on也是被解释为cross join+where;

3.2 一般内连接都需要加上on限定条件,如上面场景2.1;如果不加会被解释为交叉连接;

3.3 如果连接表格使用的是逗号,会被解释为交叉连接;

注:sql标准中还有union join和natural  inner join,mysql不支持,而且本身也没有多大意义,其结果可以用上面的几种连接方式得到

总结:总结了mysql所有连接方法,其中有一些是之前没有注意到的问题,平时开发也都不外乎这些。

PS-1: 鉴于之前排版不够美观,现本文已重新整理,以便更好为大家学习交流

Mysql 多表查询详解

Reference:  https://blog.csdn.net/jintao_ma/article/details/51260458 一.前言 二.示例 三.注意事项 一.前言 上篇讲到Mysql ...

mysql数据库表分区详解(数量过大的数据库表通过分区提高查询速度)

这篇文章主要介绍了MySQL的表分区,例如什么是表分区.为什么要对表进行分区.表分区的4种类型详解等,需要的朋友可以参考下 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysq ...

MySQL的表分区详解

这篇文章主要介绍了MySQL的表分区,例如什么是表分区.为什么要对表进行分区.表分区的4种类型详解等,需要的朋友可以参考下 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysq ...

Mysql修改表结构详解

添加字段: alter table `user_movement_log`Add column GatewayId int not null default 0 AFTER `Regionid` (在 ...

MySQL简单查询详解-单表查询

MySQL简单查询详解-单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询的执行路径 一条SQL查询语句的执行过程大致如下图所示: 1>.客户端和服务端通过my ...

Mysql高手系列 - 第12篇:子查询详解

这是Mysql系列第12篇. 环境:mysql5.7.25,cmd命令中进行演示. 本章节非常重要. 子查询 出现在select语句中的select语句,称为子查询或内查询. 外部的select查询语 ...

mysql配置文件my.cnf详解

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值