02年世界杯韩国黑哨_曲棍球世界杯 - guanchafang.com

MySQL基础——多表查询(各种join连接详解)
2025-09-06 23:22:16

Mysql 多表查询详解

目录

Mysql 多表查询详解

一.前言

二.下面以实例进行分析

三 注意事项

案例1、三张表使用left join连接

一.前言

上篇讲到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:TableB:

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

select * from tab_a,tab_b where ...

等价于

select * from tab_a

inner join tab_b

推荐使用inner join这种写法

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

结果如下:

应用场景:

这种场景下得到的是满足某一条件的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

表a 表b

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

应用场景:

这种场景下得到的是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

表a 表b

left join表a的数据全部显示,匹配表b的数据也显示,而b.id再次过滤掉 表b的id为空的。

结果如下:

应用场景:

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

2.2.3 right join 或者right 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

表a 表b

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

a right join b:表b的数据全部显示,表a匹配的数据显示,不匹配的为空

应用场景:

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

2.2.4 [ right join 或者right outer join(等同于right 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

表a 表b

结果如下:

应用场景:

这种场景下得到的是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

表a 表b

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

应用场景:

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

2.2.6 full join + is null(mysql不支持,但是可以用 (left join + is null) union (right join+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

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

结果如下:

应用场景:

这种场景下得到的是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

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

表a 表b

结果如下;

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

三 注意事项

上面仍然存在遗漏,那就是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所有连接方法,其中有一些是之前没有注意到的问题,平时开发也都不外乎这些。

案例1、三张表使用left join连接

A表:姓名,学号,班级编号

B表:学号,成绩

C表:班级编号,班级名称

最后想显示为 姓名,学号,成绩,班级名称

A、B表用where a.学号=b.学号查出之后再和C表左连接sql语句如下:

select a.姓名,a.学号, b.成绩, c.班级名称

from A表 a

left join B表 b on a.学号=b.学号

left join C表 c on a.班级编号=c.班级编号

网上有说:A表和B表连接形成临时表,再和C表连接。

这里有执行顺序,自己还未检验,先备份,有时间再来深究:mysql多个join在一句先后执行顺序_mysql join的执行顺序??_湖水是你的眼神的博客-CSDN博客

如何批量复制文件并重命名(带中文版)
谁在靠世界杯搞钱?
最新文章
  • 《造化之门》手游评测:开启异世界的修仙之旅《造化之门》手游还原小说剧情,描述天才少年宁城,因为机缘巧合,穿越到了一个名为奕星大陆的修真世界,并在这个异世界中不断的磨砺成...
  • 期海星球:智慧型知识分享平台,开启用户认知提升之路随着科技的飞速发展和信息时代的到来,投资者对于期权理论、财富认知的学习需求日益增长。在这样的背景下,一家名为“期海星球(OptionSea...
  • 鹿晗踮脚合影技是什么意思?女友关晓彤偷踮脚是怎么回事?关于我们 - 联系我们 - 用户协议 - 用户隐私权 - 法律声明 - 用户帮助 - 网站律师 忒有料 版权所有 Copyright © 2018 52FuQing.com All Rights Reserved. 备案:...
  • 中华人民共和国主席特使中華人民共和國主席特使,又稱国家主席特使,簡稱主席特使,是中華人民共和國設立的临时外交代表,為一種臨時性職務,在中華人民共和國...
  • 动漫游戏哪些值得玩 十大经典动漫游戏推荐探寻动漫游戏世界里的瑰宝,这篇文章带你领略十大经典动漫改编的游戏作品。无论是深入人心的角色、扣人心弦的剧情,还是精美的视觉体验...
  • 青花瓷碗阿里巴巴为您找到14,296条青花瓷碗产品的厂家、货源、报价、批发、采购等信息,您还可以找更多青花瓷碗、、的产品货源、厂家等信息 移动版...
  • 韩国明星男排行榜前50名1. 李钟硕:李钟硕是目前韩国颜值最高的男明星之一,不仅五官精致,气质非常出众,更有一身独特的魅力。 2. 郑少秋:郑少秋已经60多岁了,...
  • 天音移动卡怎么查话费?很多小伙伴还不太了解天音移动的查话费方式,在这里集号吧小编就告诉大家天音移动卡怎么查话费。 1.登录天音移动官网www.170.com,在登录框...
  • 《内经》解证 | 《黄帝内经》任督二脉循行解析(上)这里指出任脉和冲脉皆起于胞中,胞中在女子就是子宫,子宫是一个脏器,在腹腔内而非体表。 另一处描述任脉循行的地方是《素问·骨空论》...
  • 为什么要使用 JSON?以下是使用JSON的几个优点:简单易用JSON的语法简单,易于理解和编写,可以快速地进行数据交换。 跨平台支持JSON可以被多种编程语言解析和生...