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:
TableB:
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
结果如下:
应用场景:
这种场景下得到的是满足某一条件的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:
应用场景:
这种场景下得到的是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满足同一条件 的数据",然后得到的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:
应用场景:
这种场景下得到的是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
结果如下:
应用场景:
这种场景下得到的是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的三条记录),所以结果如下:
应用场景:
这种场景下得到的是满足某一条件的公共记录,和独有的记录
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
结果如下:
应用场景:
这种场景下得到的是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
结果如下;
注:这种情况下实际上实现了内连接的效果
三 注意事项
上面仍然存在遗漏,那就是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 多表查询详解_(转)Mysql 多表查询详解相关推荐
- mysql慢查询设置无线_深入mysql慢查询设置的详解
在web开发中,我们经常会写出一些SQL语句,一条糟糕的SQL语句可能让你的整个程序都非常慢,超过10秒一般用户就会选择关闭网页,如何优化SQL语句将那些运行时间 比较长的SQL语句找出呢?MySQL ...
- mysql explain详解_数据库mysql(1)——B+TREE索引原理
一.B+Tree索引详解 1.什么是索引? 索引:加速查询的数据结构. 2.索引常见数据结构: #1.顺序查找: 最基本的查询算法-复杂度O(n),大数据量此算法效率糟糕. #2.二叉树查找(bina ...
- mysql两个查询结果差集_【Mysql】求两个表(查询结果)的差集
求两个查询结果的差集,Mysql直接提供了关键字not in,但是not in的效率极其低下,出现例如求一个上千查询结果在上万查询结果的差集,那么使用not in来查询的查询速度极其缓慢,这是必须使用 ...
- mysql自然连接的例题详解_基于 MySQL 的数据库实践(自然连接)
在基本查询一节的示例中,我们有从 instructor 和 teaches 表组合信息,匹配条件是 instructor.ID 等于 teaches.ID 的查询,ID 属性是两个表中具有相同名称的所 ...
- mysql数据库约束详解_基于MySQL数据库的数据约束实例及五种完整性约束介绍
为了防止不符合规范的数据进入数据库,在用户对数据进行插入.修改.删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确.有效.相容. ...
- mysql 分组查出来横向展示_实战MySql查询
一.mysql查询的五种子句 where子句(条件查询):按照"条件表达式"指定的条件进行查询. group by子句(分组):按照"属性名"指定的字段进行分组 ...
- mysql为什么表大了要重建_为什么MySQL分库分表后总存储大小变大了?
[MySQL系列相关] 1.聊一聊关于MySQL的count(*) 1.背景 在完成一个分表项目后,发现分表的数据迁移后,新库所需的存储容量远大于原本两张表的大小.在做了一番查询了解后,完成了优化. ...
- sqlliet 创建多表查询的视图_第4关 复杂查询
(是什么,如何用,有什么用,注意事项) 一.视图: (1)是什么:数据库存储数据,视图存储SQL语句,不存数据 (2)如何创建视图 CREATE VIEW 视图名称(<视图列名1,<视图列 ...
- mysql 查询执行过程_深入浅出Mysql(一)——sql查询执行过程
一.sql查询执行过程概括 下面给出的mysql基本架构示意图,从中你可以清楚的mysql的各个模块和执行过程. 大体来说可以分为两部分Server层和储存引擎层.Server层包括连接器.查询缓存. ...
- MySQL如何修改表的储存方式_修改mysql默认存储引擎的方法
修改mysql默认存储引擎的方法,供大家学习参考. 先来了解一下mysql存储引擎: mysql服务器采用了模块化风格,各部分之间保持相对独立,尤其体现在存储架构上.存储引擎负责管理数据存储,以及my ...
最新文章
- 入门 打印出“hello, world”
- [转]微信的一道前端面试题
- ITK:将不断变化的密集2D水平集可视化为高程图
- python 有序字典_(Python基础教程之十七)Python OrderedDict –有序字典
- linux命令怎么查看dat格式的文件,Linux 查看 elf可执行文件格式的两个命令
- Appointment get entity debug
- 用代理技术实现简单的AOP框架
- 告毕业生书——七剑送你下天山
- python的实例属性和静态属性_Python面向对象之静态属性、类方法与静态方法分析...
- github上传文件
- (转):GOF设计模式趣解(23种设计模式)
- html中文字空心如何设置,css 中字体文本小诀窍
- 485. Max Consecutive Ones \ 118. Pascal's Triangle
- 有道单词本添加js实现自动阅读单词
- Javaweb常见面试题
- 【matlab笔记】寻找极小值
- ftl模板导出excel_ftl方式导出excel
- sqlite3用法详解
- mac使用vscode
- obs 推流编码在哪设置_OBS Studio基本设置
热门文章
- Unity用GUI绘制Debug/print窗口/控制台-打包后测试
- [Hdu3555] Bomb(数位DP)
- Java 8中的Optional 类型与 Kotlin 中的可空类型
- python爬虫学习研究
- spring cloud config-server 高可用配置中心
- torch 深度学习(5)
- mysql查询条件中使用 或 !-的问题
- 《Node Web开发》((美)David Herron)【摘要 书评 试读】- 京东图书
- 基于海思IVE实现绊线/区域入侵的基本算法流程
- 漫画:Dijkstra 算法的优化