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 多表查询详解相关推荐

  1. mysql慢查询设置无线_深入mysql慢查询设置的详解

    在web开发中,我们经常会写出一些SQL语句,一条糟糕的SQL语句可能让你的整个程序都非常慢,超过10秒一般用户就会选择关闭网页,如何优化SQL语句将那些运行时间 比较长的SQL语句找出呢?MySQL ...

  2. mysql explain详解_数据库mysql(1)——B+TREE索引原理

    一.B+Tree索引详解 1.什么是索引? 索引:加速查询的数据结构. 2.索引常见数据结构: #1.顺序查找: 最基本的查询算法-复杂度O(n),大数据量此算法效率糟糕. #2.二叉树查找(bina ...

  3. mysql两个查询结果差集_【Mysql】求两个表(查询结果)的差集

    求两个查询结果的差集,Mysql直接提供了关键字not in,但是not in的效率极其低下,出现例如求一个上千查询结果在上万查询结果的差集,那么使用not in来查询的查询速度极其缓慢,这是必须使用 ...

  4. mysql自然连接的例题详解_基于 MySQL 的数据库实践(自然连接)

    在基本查询一节的示例中,我们有从 instructor 和 teaches 表组合信息,匹配条件是 instructor.ID 等于 teaches.ID 的查询,ID 属性是两个表中具有相同名称的所 ...

  5. mysql数据库约束详解_基于MySQL数据库的数据约束实例及五种完整性约束介绍

    为了防止不符合规范的数据进入数据库,在用户对数据进行插入.修改.删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确.有效.相容. ...

  6. mysql 分组查出来横向展示_实战MySql查询

    一.mysql查询的五种子句 where子句(条件查询):按照"条件表达式"指定的条件进行查询. group by子句(分组):按照"属性名"指定的字段进行分组 ...

  7. mysql为什么表大了要重建_为什么MySQL分库分表后总存储大小变大了?

    [MySQL系列相关] 1.聊一聊关于MySQL的count(*) 1.背景 在完成一个分表项目后,发现分表的数据迁移后,新库所需的存储容量远大于原本两张表的大小.在做了一番查询了解后,完成了优化. ...

  8. sqlliet 创建多表查询的视图_第4关 复杂查询

    (是什么,如何用,有什么用,注意事项) 一.视图: (1)是什么:数据库存储数据,视图存储SQL语句,不存数据 (2)如何创建视图 CREATE VIEW 视图名称(<视图列名1,<视图列 ...

  9. mysql 查询执行过程_深入浅出Mysql(一)——sql查询执行过程

    一.sql查询执行过程概括 下面给出的mysql基本架构示意图,从中你可以清楚的mysql的各个模块和执行过程. 大体来说可以分为两部分Server层和储存引擎层.Server层包括连接器.查询缓存. ...

  10. MySQL如何修改表的储存方式_修改mysql默认存储引擎的方法

    修改mysql默认存储引擎的方法,供大家学习参考. 先来了解一下mysql存储引擎: mysql服务器采用了模块化风格,各部分之间保持相对独立,尤其体现在存储架构上.存储引擎负责管理数据存储,以及my ...

最新文章

  1. 入门 打印出“hello, world”
  2. [转]微信的一道前端面试题
  3. ITK:将不断变化的密集2D水平集可视化为高程图
  4. python 有序字典_(Python基础教程之十七)Python OrderedDict –有序字典
  5. linux命令怎么查看dat格式的文件,Linux 查看 elf可执行文件格式的两个命令
  6. Appointment get entity debug
  7. 用代理技术实现简单的AOP框架
  8. 告毕业生书——七剑送你下天山
  9. python的实例属性和静态属性_Python面向对象之静态属性、类方法与静态方法分析...
  10. github上传文件
  11. (转):GOF设计模式趣解(23种设计模式)
  12. html中文字空心如何设置,css 中字体文本小诀窍
  13. 485. Max Consecutive Ones \ 118. Pascal's Triangle
  14. 有道单词本添加js实现自动阅读单词
  15. Javaweb常见面试题
  16. 【matlab笔记】寻找极小值
  17. ftl模板导出excel_ftl方式导出excel
  18. sqlite3用法详解
  19. mac使用vscode
  20. obs 推流编码在哪设置_OBS Studio基本设置

热门文章

  1. Unity用GUI绘制Debug/print窗口/控制台-打包后测试
  2. [Hdu3555] Bomb(数位DP)
  3. Java 8中的Optional 类型与 Kotlin 中的可空类型
  4. python爬虫学习研究
  5. spring cloud config-server 高可用配置中心
  6. torch 深度学习(5)
  7. mysql查询条件中使用 或 !-的问题
  8. 《Node Web开发》((美)David Herron)【摘要 书评 试读】- 京东图书
  9. 基于海思IVE实现绊线/区域入侵的基本算法流程
  10. 漫画:Dijkstra 算法的优化