MYSQL基础知识之多表查询
1、多表关系
在数据表中,各个表结构之间存在着各种关系(一对一、一对多、多对多)。
一对一关系:
示例:学生与学生详情的关系,一个学生对应一个详细情况,一个详细情况对应一个学生。
实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的UNIQUE。
一对多关系:
示例:学生与班级的关系,一个班级对应多个学生,一个学生对应一个班级。
实现:在一对多关系中,在多的一方建立外键,指向一的一方的主键。
多对多关系:
示例:学生与课程的关系,一个学生可以选修多门课程,一门课程也可以给多个学生选择。
实现:在多对多关系中,建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
2、多表查询
多表查询就是从多张表中去查询数据,在实际开发中大多数情况数据都是存储在多张中的,它们通过一个关联关系连接起来,这样就可以通过这个关联关系去查询到想要的数据。多表查询可以分为连接查询、联合查询和子查询。
3、连接查询
连接查询有:
内连接:相当于查询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 条件...;
# 右外连接
select 字段列表 FROM 表1 right [outer] join 表2 on 条件...;
3.3、自连接
语法:select 字段列表 from 表A 别名A join 表名A 别名B on 条件...;
4、联合查询
联合查询就是把多次查询的结果合并起来,形成一个新的查询结果集,使用union、union all关键字连接。注意:在联合查询中,多张表的列数、字段类型必须保持一致
语法:
select 字段列表 from 表A union [all] select 字段列表 from 表B;
5、子查询
在SQL语句中嵌套select语句,称为嵌套查询,又称子查询。
语法:select * from t1 where column1=(select column1 from t2);
子查询外部的语句可以是insert、update、delete、select的任何一个。
根据子查询结果不同,分为:
标量子查询(子查询结果为单个值);
列子查询(子查询结果为一列);
行子查询(子查询结果为一行);
表子查询(子查询结果为多行多列)。
根据子查询位置,可以分为:where之后,from之后,select之后。
5.1、标量子查询
子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询成为标量子查询。
常用的操作符:= 、<> 、 > 、 >= 、 < 、 <=。
5.2、列子查询
子查询返回的结果是一列或多列,这种子查询称为列子查询。
常用的操作符:
IN:在指定的集合范围之内,多选一;
NOT IN :不在指定的集合范围之内;
ANY:子查询返回列表中,有任意一个满足即可;
SOME:子查询返回列表中,有任意一个满足即可;
ALL:子查询返回列表的所有值都必须满足。
5.3、行子查询
子查询返回的结果是一行或多列,这种子查询称为行子查询。
常用的操作符:=、<>、IN 、NOT IN
5.4、表子查询
子查询返回的结果是多行多列,这种子查询称为表子查询。
常用的操作符为IN。
6、附7种SQL JOINS的实现