每个实体,一个表
当一个业务需要多个实体的数据,显然需要多张表在一起使用,即将多张表的记录连接起来。
1. 总体思路:
先将所有数据按照某种条件,连接起来,再进行筛选处理。
2. 分类方式:
根据连接的条件不同,分为一下几类:
① 内连接(Inner):要求连接的多个数据都必须存在,才能进行连接。
【举个栗子】如下三张表,分别记录了老师的信息,班级信息,以及老师们的代课情况。
此时,若想获得所有老师的代课信息,‘韩信’在表3中有与之配对的记录(内连接)
但发现孙武没有带过课,即表1中的‘孙武’在表3中没有与之配对的记录(外连接)。
表1. 所有老师的信息 表2. 所有班级的信息
表3. 老师们的代课情况
【语法】tbl_left inner join tbl_right on 连接条件;
【举个栗子】求表1中的所有老师的开始代课时间、代课天数。
tip : 内连接可以省略连接条件,意味着所有左表的数据都要与右表的记录做一次连接(交叉连接or笛卡尔积连接)。
此时可以使用cross join代替inner join。
实际上,可以使用多表查询的方式,不实用where,做到笛卡尔积。
在MySQL中,inner join是默认的连接方式,可以省略inner。
【写法】1) on(写法如上一个例子)。
2) where(只需把on替换成where即可)。
结果一样,但是逻辑关系不同:where会先形成包含所有连接的笛卡尔积,再在这些数据中进行过滤;
on 会先进行满足条件的数据过滤,在对过滤后的数据进行连接。
【using】当有同名字段时,可以使用 using (字段名),进行条件约束。
【as】给表、字段起别名,可以把比较长的表名改成比较短的别名,保证简洁、清晰。
② 外连接(outer):负责连接的数据有一个或多个不存在
【语法】tbl_name left outer join tbl_name on 连接条件;(也可以使用using,不使用where!!)
tip : 必须要有连接条件!!(内连接没有条件=笛卡尔积,但是外连接必须有)
1) 左外连接;(left outer join)
左连接时,若左表的数据连接不到右表的情况,则左表的数据在最终结果中被保留
(如上图,左表中的‘孙武’没有连接到右表的数据,但是‘孙武’在最终数据中保留了下来);
若右表数据连接不到左表,则最终结果中,右表数据被丢弃(如下图,交换两表的左右顺序,发现右表的‘孙武’被丢弃)。
2) 右外连接;
3) 全外连接(MySQL不支持);
(左连接)union(右连接);
③ 自然连接(natural):通过 MySQL 自己的判断完成连接过程,无需指明连接条件。
MySQL 使用多表内相同的字段,作为连接条件。
【语法】 (表1) natural join (表2); ----内
natural left join ----- 左外
natural right join --- 右外
3. 多表连接