(6)多表查询
6.1 表与表之间的关系
在讲解多表查询之前,首先了解表与表之间的关系以及如何设计这种关系,这对以后多表操作的学习有很大帮助。表与表之间的关系主要包括一对一、一对多(多对一)和多对多,其中,一对多和多对一实际上是一样的,只是角度不同。接下来详细讲解表与表之间的关系。
1. 一对一
在一对一关系中,关系表的每一边都只能存在一条记录,每个数据表中的关键字在对应的关系表中只能存在一条记录或者没有对应的的记录。
2. 一对多和多对一
在一对多关系中,主键数据表中只能含有一个记录,而在其关系表中这条记录可以与一个或者多个记录相关,也可以没有记录与之相关。
3. 多对多
在多对多关系中,两个数据表里的每条记录都可以和另一个数据表里任意数量的记录相关。
6.2 合并结果集
使用union 和union all关键字合并。
6.3 连接查询
在关系型数据库中建立数据表时不必确定各个数据之间的关系,通常将每个实体的所有信息存放在一个表中。当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查询。
1. 笛卡儿积
笛卡儿积在SQL中的实现方式是交叉连接(cross join),所有连接方式都会先生成临时笛卡尔积表。其语法格式如下。
select 查询字段 from 表1 cross join 表2;
2. 内连接
内连接的连接查询结果集中仅包含满足条件的行,在MySQL中默认的连接方式就是内连接。SQL标准中的内连接的语法格式如下。
select 查询字段 from 表1 [inner] join 表2
on 表1.关系字段 = 表2.关系字段 where 查询条件;
在以上语法格式中,inner join用于连接两个表,其中inner可以省略,因为MySQL默认的连接方式就是内连接,on用来指定连接条件,类似于where关键字。
3. 外连接
内连接的查询,返回的结果只包含符合查询条件和连接条件的数据,然而有时还需要包含没有关联的数据,返回的查询结果中不仅包含符合条件的数据,还包含左表或右表或两个表中的所有数据,此时就需要用到外连接查询。外连接查询包括左外连接和右外连接两种查询类型。
- 左外连接
左外连接是以左表中的数据为基准,若左表中有数据且右表中没有数据,则显示左表中的数据,右表中的数据显示为空。左外连接的语法格式如下。
select 查询字段 from 表1 left [outer] join 表2
on 表1.关系字段 = 表2.关系字段 where 查询条件;
在以上语法中,left join 表示返回左表中的所有记录以及右表中符合连接条件的记录,outer可以省略不写,on后面是两张表的连接条件,在where关键字后面可以添加查询条件。
- 右外连接
右外连接是以右表中的的数据为基准,若右表中有数据且左表中没有数据,则显示右表中的数据,左表中的数据显示为空。右外连接的语法格式如下。
select 查询字段 from 表1 right [outer] join 表2
on 表1.关系字段 = 表2.关系字段 where 查询条件;
在以上语法格式中,right join 表示返回右表中的所有记录以及左表中符合连接条件的记录,outer可以省略不写,on后面是两张表的连接条件,在where关键字后面可以加查询条件。
4. 多表连接
内连接和外连接都是两张表之间的连接查询。实际随着业务的复杂,可能需要连接多张表,但表连接过多会严重影响查询效率。因此连接查询一般不超出7张表的连接。多表连接的语法格式如下。
select 查询字段 from 表1 [表名]
join 表2 [别名] on 表1.关系字段 = 表2.关系字段
join 表m on·····;
在以上语法格式中,为了方便书写,通常会给表起别名,当然也可以不起别名。多个表通过join关键字连接,on关键字后面是表与表之间的关系字段。
6.4 子查询
子查询就是嵌套查询,即在select中包含select。子查询可以在where关键字后面作为查询条件,也可以在from关键字后面作为表来使用。