-
多表关系
- 一对多(多对一)
- 案例:一个部门对应多个员工,一个员工对应一个部门
- 实现方式:在多的一方建立外键,指向一的一方的主键
- 多对多
- 案例:一个学生可以选择多门课程,一门课程也可供多个学生选择
- 实现方式:建立第三张中间表,中间表至少包含两个外键,分别关联两方的主键
- 一对一
- 案例:将用户的基础信息放在一张表中,用户的其它详情信息放在另一张表中。该关系多用于单表拆分
- 实现方式:在任意一方加入外键,关联另外一方的外键,并设置外键为唯一的(UNIQUE)
- 一对多(多对一)
-
多表查询
-
概述:即从多张表中查询数据,需要用到笛卡尔积。在查询时又需要消除无效的笛卡尔积
-
分类
-
连接查询
-
内连接
- 介绍:相当于查询表A和表B交集部分的数据
- 语法:
SELECT 字段列表 FROM 表1,表2 WHERE 条件...; #隐式内连接 SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件...; #显式内连接
-
外连接
-
左外连接
- 介绍:相当于查询表1(左表)的所有的数据 包含 表1和表2交集部分的数据
- 注意:此连接方式看起来和直接查询表1貌似没有区别,但其实这里的交集部分的数据指的是两张表中关联起来的数据,也就是说此连接方式是在内连接的基础上把表1中没有和表2关联的数据一同显示出来了。详细演示参考《MySQL-多表查询演示》。
- 语法:
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件...;
-
右外连接
- 介绍:相当于查询表2(右表)的所有的数据 包含 表1和表2交集部分的数据
- 语法:
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件...;
-
-
自连接
- 介绍:自连接查询,可以使用内连接查询语句实现,也可以是使用外连接查询语句实现,因为自连接的本质只是将一张表当成两张表使用,与使用什么查询语句无关。
- 语法:
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件...;
-
联合查询
- 介绍:
- 对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集
- 联合查询涉及的多张表的结构必须相同(字段数量和类型需相同)
- union all 会将全部的数据直接合并在一起,union会对合并之后的数据去重
- 语法:
SELECT 字段列表 FROM 表A ... UNION[ALL] SELECT 字段列表 FROM 表B ...;
- 介绍:
-
-
子查询
- 介绍:
- SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询
- 子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个
- 语法:
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
-
分类(根据查询结果的不同):
-
标量子查询
- 介绍:子查询返回的结果是单个值(数字、字符串、日期等)
- 常用操作符:=,<>,>,>=,<,<=
-
列子查询
- 介绍:子查询返回的结果是一列(可以是多行)
- 常用操作符:
操作符 描述 IN 在指定的集合范围之内,多选一 NOT IN 不在指定的集合范围内 ANY 子查询返回列表中,有任意一个满足即可 SOME 与ANY等同,使用SOME的地方都可以使用ANY ALL 子查询返回列表的所有值都必须满足 -
行子查询
- 介绍:子查询返回的结果是一行(可以是多列)
- 常用操作符:=,<>,IN,NOT IN
-
表子查询
- 介绍:子查询返回的结果是多行多列
- 常用操作符:IN
-
- 介绍:
-
-
MySQL-多表查询
于 2022-03-18 17:47:31 首次发布