MySQL基础(三)多表查询(各种join连接详解)
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 内连接(只有一种场景,
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
结果如下,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 或者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
结果如下,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基础(三)多表查询(各种join连接详解)的更多相关文章
- mysql 基础入门 单表查询
单表查询 select 表头,表头 as 别名 ,表头(+-*/的运算) from table_a 1.条件查询 where + 条件 <> , != 不等于 = 等于,也可以表示字符串值 ...
- mysql基础(三)——中级查询
创建表 CREATE TABLE DEPT( DEPTNO ) PRIMARY KEY, DNAME ) , LOC ) ) ; ,'ACCOUNTING','NEW YORK'); ,'RESEAR ...
- mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化
先附上数据. CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) CHARACTER SET utf8 NOT NULL, `ctime` ) NO ...
- MySQL之表、列别名及各种JOIN连接详解
MySQL在SQL中,合理的别名可以让SQL更容易以及可读性更高.别名使用as来表示,可以分为表别名和列别名,别名应该是先定义后使用才对,所以首先要了解sql的执行顺序(1) from(2) on(3 ...
- MySql(三):MyISAM和InnoDB区别详解
MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一个缺点 ...
- 04 mysql 基础三 (进阶)
mysql 基础三 阶段一 mysql 单表查询 1.查询所有记录 select * from department; select * from student; select * from ...
- MySQL数据库语法-多表查询练习一
MySQL数据库语法-多表查询练习一 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要介绍的多表查询的外键约束,以及如何使用外链接和内连接查询数据信息. 一.数据表和测试 ...
- mysql 数据操作 单表查询 目录
mysql 数据操作 单表查询 mysql 数据操作 单表查询 简单查询 避免重复DISTINCT mysql 数据操作 单表查询 通过四则运算查询 mysql 数据操作 单表查询 concat()函 ...
- mysql 数据操作 多表查询 目录
mysql 数据操作 多表查询 准备 多表连接查询介绍 mysql 数据操作 多表查询 多表连接查询 笛卡尔积 mysql 数据操作 多表查询 多表连接查询 内连接 mysql 数据操作 多表查询 多 ...
随机推荐
- lambda表达式的一些学习
关于lambda表达式的一些学习,例举出来. 1.学生实体类 public class Student { private String name; private int age; public S ...
- 从零开始入门 K8s| K8s 的应用编排与管理
作者 | 张振 阿里巴巴高级技术专家 一.资源元信息 1. Kubernetes 资源对象 我们知道,Kubernetes 的资源对象组成:主要包括了 Spec.Status 两部分.其中 Spec ...
- 腾讯云和阿里云部署web 项目tomcat 日志 中文变成问号
在部署项目到云上的时候,遇到了tomcat logs 日志中文变问号的问题,今天终于得到解决了 这是中文变成问号的的截图 打开到tomcat bin 目录的文件夹 找到catalina.sh 文件 ...
- Linux 笔记 - 第六章 Linux 磁盘管理
博客地址:http://www.moonxy.com 一.前言 1.1 硬盘 硬盘一般分为 IDE 硬盘.SCSI 硬盘和 SATA 硬盘.在 Linux 中,IDE 接口的设备被称为 hd,SCSI ...
- jvm 内存溢出
堆内存溢出 堆内存中存在大量对象,这些对象都有被引用,当所有对象占用空间达到堆内存的最大值,就会出现内存溢出OutOfMemory:Java heap space 永久代溢出 类的一些信息,如类名.访 ...
- asp.net 导出excel带图片
protected void btgua_Click(object sender, EventArgs e) { DataTable dt = ds.Tables[0]; if (dt != null ...
- Java程序连接数据库
/** * 了解: 利用 Driver 接口的 connect 方法获取连接 */ // 第一种实现 /** * 了解: 利用 Driver 接口的 connect 方法获取连接 */ @Test p ...
- Docker常用命令小记
除了基本的docker pull.docker image.docker ps,还有一些命令及参数也很重要,在此记录下来避免遗忘. 环境信息 以下是本次操作的环境: 操作系统:CentOS Linux ...
- BOM之定时器
JavaScript中的时间是通过定时器控制的,他们分别是window.setInterval和window.setTimeout,我们当然可以省略window,直接使用方法名称调用. 一 s ...
- PacMan 04——道具生成吃下道具怪物的移动
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...