MySQL的多表查询

MySQL的多表查询

一、表的加法

关键词 union union all 用来合并表,其中,union 去重,union all 不去重。

例如:将course和course1两张表合并

两张表的数据分别如图所示:

course表的数据
course1表的数据

用union合并两张表:

course+course1(去重)

用union all合并两张表

course+course1(不去重)

注意:字段顺序应保持一致。

二,多表联结

联结就是以各表的公共列(关系列)为基础,把所有表合并为一张表。

联结方式具体分为以下五种:

  1. 交叉联结(cross join)
  2. 内联结(inner join)
  3. 左联结(left join)
  4. 右联结(right join)
  5. 全联结(full join)

1、交叉联结(cross join)

交叉联结(又称笛卡尔积)是将表1的每一行与表2的每一行都进行合并。

联结后的行数是表1行数与表2行数的乘积。

交叉联结

交叉联结日常工作用得较少,因为联结后行数较多,查询效率低。

交叉联结是其他联结方式的基础。

2、内联结(inner join)

内联结是只保留两张表的公共列都有的数据,然后以交叉联结的方式进行合并。

内联结
内联结的运行逻辑

第一步,先取出两张表的公共列都有的数据,案例中的公共列【学号】只有‘0001’是两表都有的。

第二步,将两表取出的数据进行交叉联结,得到最终效果。

内联结的SQL语句:

多表联结的SQL语句有两个关键点:

  1. 因为涉及多张表,为了便于辨认和阅读,建议给各表 转换别名
  2. 用关键字 on 指定各表的公共列

因为这里是内联结,所以需要用关键词 inner join 连接各表,即:from 表1 inner join 表2(如果是其他联结方式,则替换成对应的关键词)。

-- 内联结
selelct <列名1>,<列名2>...
from 1 inner join 2
on <1.公共列名> = <2.公共列名>


3、左联结(left join)

左联结是仅保留公共列左表的数据,然后以交叉联结的方式进行合并。

左联结
左联结的运行逻辑

第一步,先取出左表的数据,右表则取两张表的公共列都有的数据,案例中的公共列【学号】只有‘0001’是两表都有的。

第二步,将两表取出的数据进行交叉联结,得到最终效果。因为右表不存在学号‘0002’的数据,所有结果中‘0002’的其他数据是空值。

-- 左联结
selelct <列名1>,<列名2>...
from 1 left join 2
on <1.公共列名> = <2.公共列名>

4、右联结(right join)

右联结是仅保留公共列右表的数据,然后以交叉联结的方式进行合并。

右联结
右联结的运行逻辑

第一步,先取出右表都有的数据,左表则取两张表的公共列都有的数据,案例中的公共列【学号】只有‘0001’是两表都有的。

第二步,将两表取出的数据进行交叉联结,得到最终效果。因为左表不存在学号‘0005’的数据,所有结果中除了‘0005’对应的课程号‘0003’,其他数据是空值。

-- 右联结
selelct <列名1>,<列名2>... 
from 1 right join 2 
on <1.公共列名> = <2.公共列名>

5、全联结(full join)
全联结是保留两张表的数据,然后以交叉联结的方式进行合并。

全联结
全联结的运行逻辑

第一步,先将两边的数据都各自取出。

第二步,将两表取出的数据进行合并,得到最终效果。

注意:MySQL不支持全联结,仅作为了解概念。但可通过union合并左联结和右联结,达到全联结的效果。

-- 全联结
selelct <列名1>,<列名2>...
from 1 full join 2