多表关系
- 一对多(多对一)
- 实现:在多的一方建立外键,指向一的一方的主键
- 多对多
- 实现:: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
- 一对一
- 实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)
多表查询概述
- 分类
- 连接查询
- 内连接:相当于查询 A、B 交集部分数据
- 外连接
- 左外连接:查询左表所有数据,以及两张表交集部分数据
- 右外连接:查询右表所有数据,以及两张表交集部分数据
- 自连接:当前表与自身的连接查询,自连接必须使用表别名
- 子查询
- 连接查询
内连接
- 隐式内连接:
SELECT 字段列表 FROM 表1 , 表2 WHERE 条件 ... ;
- 显式内连接:
SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ... ;
- 一旦为表起了别名,就不能再使用表名来指定对应的字段了,此时只能够使用别名来指定字段
外连接
- 左外连接:
SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ... ;
- 右外连接:
SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ... ;
- 左外连接和右外连接是可以相互替换的,只需要在连接查询时 SQL 中调节表结构的先后顺序
自连接
- 语法:
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ... ;
- 在自连接查询中,必须要为表起别名
联合查询
- union all 查询出来的结果,仅仅进行简单的合并,并未去重
- union 联合查询,会对查询出来的结果进行去重处理
- 字段列表数量和类型要一致
sql
SELECT 字段列表 FROM 表A ...
UNION [ ALL ]
SELECT 字段列表 FROM 表B ....;
子查询
-
语法:
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );
-
分类
- 根据子查询结果分类
- 标量子查询(子查询结果为单个值)
- 列子查询(子查询结果为一列)
- 行子查询(子查询结果为一行)
- 表子查询(子查询结果为多行多列)
- 根据子查询位置分类
- where 之后
- from 之后
- select 之后
- 根据子查询结果分类
-
标量子查询
- 子查询返回的结果是单个值(数字、字符串、日期等)
- 常用的操作符:= <> > >= < <=
-
列子查询
-
子查询返回的结果是一列(可以是多行)
-
常用操作符
操作符 描述 IN 在指定的集合范围之内,多选一 NOT IN 不在指定的集合范围之内 ANY 子查询返回列表中,有任意一个满足即可 SOME 与 ANY 等同,使用 SOME 的地方都可以使用 ANY ALL 子查询返回列表的所有值都必须满足
-
-
行子查询
- 子查询返回的结果是一行(可以是多列)
- 常用的操作符:= 、<> 、IN 、NOT IN
-
表子查询
- 子查询返回的结果是多行多列
- 常用的操作符:IN