Mysql 多表查询详解
Reference: https://blog.csdn.net/jintao_ma/article/details/51260458
一.前言
二.示例
三.注意事项
一.前言
上篇讲到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中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有 ...
 - mysql数据库表分区详解(数量过大的数据库表通过分区提高查询速度)
		
这篇文章主要介绍了MySQL的表分区,例如什么是表分区.为什么要对表进行分区.表分区的4种类型详解等,需要的朋友可以参考下 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysq ...
 - MySQL的表分区详解
		
这篇文章主要介绍了MySQL的表分区,例如什么是表分区.为什么要对表进行分区.表分区的4种类型详解等,需要的朋友可以参考下 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysq ...
 - MySQL的表分区详解 - 查看分区数据量,查看全库数据量----转http://blog.csdn.net/xj626852095/article/details/51245844
		
查看分区数据量,查看全库数据量 USE information_schema; SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PAR ...
 - 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详解
		
原文地址:mysql配置文件my.cnf详解 作者:gron basedir = path 使用给定目录作为根目录(安装目录). character-sets-dir = path 给出存放着字符集的 ...
 - MySQL 执行计划explain详解
		
MySQL 执行计划explain详解 2015-08-10 13:56:27 分类: MySQL explain命令是查看查询优化器如何决定执行查询的主要方法.这个功能有局限性,并不总会说出真相,但 ...
 
随机推荐
- Sentinel 简介与API订阅发布
			
Sentinel 简介 Redis 的 Sentinel 系统用于管理多个 redis 服务器(instance), 该系统执行以下三个任务: 监控(Monitoring): Sentinel 会不断 ...
 - 【Oracle】浅析Oracle中的事务
			
1. 什么是事务 在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个工作单元操作,要么一个也不 ...
 - ASP.NET车辆管理系统
			
原文地址:https://blog.csdn.net/lisenyang/article/details/46606181 系统开发环境为VS2010,采用ASP.NET框架,数据库采用SQL Ser ...
 - mvc 文件压缩  减少文件大小
			
using System; using System.Collections.Generic; using System.IO.Compression; using System.Linq; usin ...
 - jquery中页面Ajax方法$.load的功能
			
load语法 $(".selector").load("url", function(responseText, statusText, xmlhttprequ ...
 - Android自己定义view之measure、layout、draw三大流程
			
自己定义view之measure.layout.draw三大流程 一个view要显示出来.须要经过測量.布局和绘制这三个过程,本章就这三个流程具体探讨一下.View的三大流程具体分析起来比較复杂,本文 ...
 - matlab入门笔记(二):矩阵和数组
			
摘自<matlab从入门到精通>胡晓东 matlab最基本的数据结构就是矩阵,一个二维的.长方形形状的数据,可以用易于使用的矩阵形式来存储,这些数据可以是数字,字符.逻辑状态,甚至是mat ...
 - php分享二十六:支付系统设计
			
一个典型PHP支付系统的设计与实现 参考:blog.sina.com.cn/s/blog_81f6205801017ec8.html 微信支付开发: http://www.cnblogs.com/tx ...
 - Spring Security教程(八):用户认证流程源码详解
			
本篇文章主要围绕下面几个问题来深入源码: 用户认证流程 认证结果如何在多个请求之间共享 获取认证用户信息 一.用户认证流程 上节中提到Spring Security核心就是一系列的过滤器链,当一个请求 ...
 - 如何运行你的Android程序?
			
原文链接:http://android.eoe.cn/topic/android_sdk 本文中你将了解到: 1. 在真机上运行App 2. 在模拟器上运行App 你还应该阅读: 1. Using H ...