多表查询就是从多张表中查询数据。
一、多表关系
- 一对一:多用于但表拆分,在任意一方加入外键来关联另一方的主键,并且该外键唯一
- 一对多:在多的一方建立外键,一的一方建立主键
- 多对多:建立中建表,中建表至少包含两个外键,分别关联两方主键
二、多表查询概述
2.1 基本概念及目的
- 笛卡尔积:两个集合所有的组合情况。
在多表查询时,要消除无效的笛卡尔积。
2.2 多表查询分类
-
连接查询
- 内连接:相当于查询集合 A、B 的交集
- 外连接:
- 左外连接:查询左表所有数据,以及两张表交集部分的数据
- 右外连接:查询右表所有数据,以及两张表交集部分的数据
- 自连接:当前表与自身的连接查询(必须使用表别名)
-
子查询
三、连接查询
3.1 内连接
内连接查询两张表的交集部分。
- 隐式内连接
SELECT 字段列表 FROM 表1, 表2 WHERE 条件...;
- 显示内连接
SELECT 字段列表 FROM 表1, [INNER] JOIN 表2 ON 连接条件;
3.2 外连接
- 左外连接
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件 ...;
查询 表1 点所有数据及包含 表1 和 表2 交集部分的数据。
- 右外连接
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件 ...;
查询 表2 点所有数据及包含 表1 和 表2 交集部分的数据。
3.3 自连接
SELECT 字段列表 FROM 表1 别名1 RIGHT JOIN 表1 别名2 ON 条件 ...;
可以是内连接查询,也可以是外连接查询。
四、联合查询
联合查询就是把多次查询的结果合并起来,形成一个新的查询结果集。
- all 没有去重,去掉 all 就会去重;
- 待合并的必报列数几字段类型必须保持一致;
SELECT 字段列表 FROM 表1 ...
UNION [ALL]
SELECT 字段列表 FROM 表2 ...;
五、子查询
SQL 语句中嵌套 SELECT 语句成为嵌套查询,又称子查询。
SELECT * FROM t1 WHERE column=(SELECT column1 FROM t2);
子查询外部的语句可以是 INSERT/UPDATE/DELETE/SELECT 的任何一个。
- 根据子查询结果不同分类
类型 | 常用操作符 |
---|---|
标量子查询(子查询结果为单个值) | = 、<>、 >、 >=、 <、 <= |
列子查询(子查询结果为一列) | IN、 NOT IN、 ANY、 SOME、 ALL |
行子查询(子查询结果为一行) | =、 <>、 IN、 NOT IN |
表子查询(子查询结果为多行多列) | IN |
操作符 | 描述 |
---|---|
IN | 在指定集合范围内,多选一 |
NOT IN | 不在指定集合范围内 |
ANY | 子查询返回列表中,有任一满足条件即可 |
SOME | 同 ANY |
ALL | 子查询返回列表的所有值都必须满足 |
行子查询可以用 (,…, ) = (,…, ) 负值
- 根据子查询位置,分为
- WHERE 之后
- FROM 之后
- SELECT 之后