多表操作
-
多表关系
MySQL多表之间的关系可以概括为:一对一、一对多/多对一,多对多
-
一对一关系
分析:一个学生只有一张身份证;一张身份证只能对应一个学生。
在任一表中添加唯一外键,指向另一方主键,确保一对一关系。
一般一对一关系很少见,遇到一对一关系的表最好是合并表。
-
一对多/多对一关系
如:部门和员工
分析:一个部门有多个员工,一个员工只能对应一个部门
实现原则:在多的一方建立外键,指向一方的主键
-
多对多关系
分析:一个学生可以选择很多们课程,一个课程也可以被很多学生选择。
原则:多对多关系实现需要借助第三方中间表。中间表至少包含两个字段,将多对多的关系,拆成一对多的关系,中间表至少要有两个外键,这两个外键分别指向原来的那两张表的主键。
-
-
外键约束
-
介绍
MySQL外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。
外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。
-
特点
定义一个外键时,需要遵守下列规则:
-
主表必须已经存在于数据库中,或者是当前正在创建的表。
-
必须为主表定义主键。
-
主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
-
在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。
-
外键中列的数目必须和主表中列的数目相同。
-
外键中列的数据类型必须和主表主键中对应列的数据类型相同。
-
-
操作-创建外键约束
-
方式一 在创建表时设置外键约束
在creat table语句中,通过foreign key关键字来指定外键
[constraint<外键名>] foreign key 字段名 [, 字段名2, ……] references <主表名> [, 主键列2, ……]
-
方式二 在创建表之后设置外键约束
外键约束也可以在修改表时添加,但是添加外键约束的前提是:从表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据。
alter table <数据表名> add constraint <外键名> foreign key(<列名>) references <主表名> (<列名>);
-
-
操作-在外键约束下的数据操作
-
数据插入
必须先给主表添加数据。
给从表添加数据时,外键列的值不能随便写,必须依赖主表的主键列。
-
删除数据
主表的数据被从表依赖时,不能删除,否则可以删除
从表的数据可以随便删除
-
-
操作-删除外键约束
格式
alter table <表名> drop foreign key <外键约束名>;
-
外键约束-多表关系
在多对多关系中,A表的一行对应B的多行,B表的一行对应A表的多行,我们要新增加一个中间表,来建立多对多关系。
修改和删除时,中间从表可以随便删除和修改,但是两边的主表收从表依赖的数据不能删除或者修改。
-
-
多表联合查询
-
介绍
多表查询就是同时查询两个或两个以上的表,因为有的时候用户在查看数据的时候,需要显示的数据来自多张表。
-
语法
-
交叉连接查询【产生笛卡尔积】
-
交叉连接查询返回被连接的两个表所有数据行的笛卡尔积;
-
笛卡尔积可以理解为一张表的每一行去和另外一张表的任意一行进行匹配;
-
假如A表有m行数据,B表有n行数据,则返回m*n行数据;
-
笛卡尔积会产生很多冗余的数据,后期的其他查询可以在该集合的基础上进行条件筛选。
select * from A, B;
-
-
内连接查询(使用的关键字inner join -- inner可以省略)
隐式内连接(SQL92标准):
select * from A,B where 条件;
显式内连接(SQL99标准):
select * from A inner join B on 条件;
-
外连接查询(使用的关键字outer join -- outer可以省略)
左外连接:left outer join
select * from A left outer join B on 条件;
右外连接:right outer join
select * from A right outer join B on 条件;
满外连接: full outer join
select * from A full outer join B on 条件;
注意:oracle里面有full join,可是在mysql对full join支持的不好。我们可以使用union来达到目的
-- 有去重 select * from A left outer join B on 条件 union select * from A right outer join B on 条件; -- 无去重 select * from A left outer join B on 条件 union all select * from A right outer join B on 条件;
-
子查询
-
介绍
子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式,通俗一点就是包含select嵌套的查询。
-
特点
子查询可以返回的数据类型一共分为四种:
-
单行单列:返回的是一个具体列的内容,可以理解为一个单值数据;
-
单行多列:返回一行数据中多个列的内容;
-
多行单列:返回多行记录之中同一列的内容,相当于给出了一个操作范围;
-
多行多列:查询返回的结果是一张临时表。
-
-
子查询关键字
在子查询中,有一些常用的逻辑关键字,这些关键字可以给我们提供更丰富的查询功能,主要关键字如下:
-
ALL关键字
select …from …where c > all(查询语句) --等价于: select ...from ... where c > result1 and c > result2 and c > result3
特点:
-
ALL: 与子查询返回的所有值比较为true 则返回true
-
ALL可以与=、>、>=、<、<=、<>结合是来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的所有数据。
-
ALL表示指定列中的值必须要大于子查询集的每一个值,即必须要大于子查询集的最大值;如果是小于号即小于子查询集的最小值。同理可以推出其它的比较运算符的情况。
-
-
ANY关键字 / SOME关键字
select …from …where c > any(查询语句) --等价于: select ...from ... where c > result1 or c > result2 or c > result3
特点:
-
ANY:与子查询返回的任何值比较为true 则返回true
-
ANY可以与=、>、>=、<、<=、<>结合是来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的任何一个数据。
-
表示制定列中的值要大于子查询中的任意一个值,即必须要大于子查询集中的最小值。同理可以推出其它的比较运算符的情况。
-
SOME和ANY的作用一样,SOME可以理解为ANY的别名
-
-
IN关键字
select …from …where c in(查询语句) --等价于: select ...from ... where c = result1 or c = result2 or c = result3
特点:
-
IN关键字,用于判断某个记录的值,是否在指定的集合中
-
在IN关键字前边加上not可以将条件反过来
-
-
EXISTS关键字
select …from …where exists(查询语句)
特点:
-
该子查询如果“有数据结果”(至少返回一行数据), 则该EXISTS() 的结果为“true”,外层查询执行
-
该子查询如果“没有数据结果”(没有任何数据返回),则该EXISTS()的结果为“false”,外层查询不执行
-
EXISTS后面的子查询不返回任何实际数据,只返回真或假,当返回真时 where条件成立
-
注意,EXISTS关键字,比IN关键字的运算效率高,因此,在实际开发中,特别是大数据量时,推荐使用EXISTS关键字
-
-
-
-
表自关联
-
介绍
MySQL有时在信息查询时需要进行对表自身进行关联查询,即一张表自己和自己关联,一张表当成多张表来用。注意自关联时表必须给表起别名。
-
格式
select 字段列表 from 表1 a , 表1 b where 条件; 或者 select 字段列表 from 表1 a [left] join 表1 b on 条件;
-
-
-