任务八:多表操作
8.1外键
5.1.1 什么是外键
(1)、外键是指引用另一个表中的一列或多列,被引用的列应该具有主键约束或唯一性约束。
(2)、外键用于建立和加强两个表数据之间的链接。
5.1.2 为表添加外键约束
为表添加外键约束的语法格式如下:
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (外键字段名) REFERENCES 外表表名 (主键字段名);
在为表添加外键约束时,有些需要注意的地方,如下所示:
(1)、建立表必须是InnoDB型,不能是临时表。因为在MySQL中只有InnoDB类型的表才支持外键。
(2)、定义外键名时,不能加引号。如:constraint 'FK_ID' 或 constraint " FK_ID "都是错误的。
(3)、表名是从表,外表表名是主表。
5.1.2 添加外键约束的参数说明
MySQL可以在建立外键时添加ON DELETE或ON UPDATE子句来告诉数据库,怎样避免垃圾数据的产生。
具体语法格式如下:
8.1外键
5.1.1 什么是外键
(1)、外键是指引用另一个表中的一列或多列,被引用的列应该具有主键约束或唯一性约束。
(2)、外键用于建立和加强两个表数据之间的链接。
5.1.2 为表添加外键约束
为表添加外键约束的语法格式如下:
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (外键字段名) REFERENCES 外表表名 (主键字段名);
在为表添加外键约束时,有些需要注意的地方,如下所示:
(1)、建立表必须是InnoDB型,不能是临时表。因为在MySQL中只有InnoDB类型的表才支持外键。
(2)、定义外键名时,不能加引号。如:constraint 'FK_ID' 或 constraint " FK_ID "都是错误的。
(3)、表名是从表,外表表名是主表。
5.1.2 添加外键约束的参数说明
MySQL可以在建立外键时添加ON DELETE或ON UPDATE子句来告诉数据库,怎样避免垃圾数据的产生。
具体语法格式如下:
![](https://img2018.cnblogs.com/i-beta/1832434/202001/1832434-20200102223701429-932936076.png)
语句中各参数的具体说明如下表所示:
![](https://img2018.cnblogs.com/i-beta/1832434/202001/1832434-20200102223744934-1143616265.png)
5.1.3 删除外键约束
在实际开发中,根据业务逻辑的需求,需要解除两个表之间的关联关系时,就需要删除外键约束。
删除外键约束的语法格式如下:
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
注:表名是从表。
5.2 操作关联表
5.2.1 关联关系
MySQL中数据表的关联关系有三种,具体如下:
1、多对一
一:主表,建立主键。
多:从表,建立外键。
2、多对多
(1)、为了实现这种关系需要定义一张中间表(称为连接表),该表会存在两个外键。
(2)、需要注意的是,连接表的两个外键都是可以重复的,但是两个外键之间的关系是不能重复的,所以这两个外键又是连接表的联合主键。
3、一对一
主从关系。从表需要主表的存在才有意义。
5.2.2 添加数据
在实际开发中,最常见的关联关系就是多对一关系。
例如:为表student和表grade中添加外键约束来建立两个表的关联关系。具体语句如下:
在实际开发中,根据业务逻辑的需求,需要解除两个表之间的关联关系时,就需要删除外键约束。
删除外键约束的语法格式如下:
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
注:表名是从表。
5.2 操作关联表
5.2.1 关联关系
MySQL中数据表的关联关系有三种,具体如下:
1、多对一
一:主表,建立主键。
多:从表,建立外键。
2、多对多
(1)、为了实现这种关系需要定义一张中间表(称为连接表),该表会存在两个外键。
(2)、需要注意的是,连接表的两个外键都是可以重复的,但是两个外键之间的关系是不能重复的,所以这两个外键又是连接表的联合主键。
3、一对一
主从关系。从表需要主表的存在才有意义。
5.2.2 添加数据
在实际开发中,最常见的关联关系就是多对一关系。
例如:为表student和表grade中添加外键约束来建立两个表的关联关系。具体语句如下:
![](https://img2018.cnblogs.com/i-beta/1832434/202001/1832434-20200102224408229-1911482295.png)
外键列只能插入参照列存在的值。
5.2.3 删除数据
由于主表和从表之间具有关联关系。参照列被参照的值是不能被删除的。
5.2.3 删除数据
由于主表和从表之间具有关联关系。参照列被参照的值是不能被删除的。
例如:一定要先删除该班级的所有学生,然后再删除班级。
5.3 连接查询
5.3.1 交叉连接
交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积,也就是返回第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
交叉连接的语法格式如下:
SELECT * FROM 表1 CROSS JOIN 表2;
注:CROSS JOIN用于连接两个要查询的表,通过该语句可以查询两个表中所有的数据组合。
5.3.2 内连接
内连接(INNER JOIN)又称简单连接或自然连接,是一种常见的连接查询。
内连接使用比较运算符对两个表中的数据进行比较,并列出与连接条件匹配的数据行,组合成新的记录,也就是说在内连接查询中,只有满足条件的记录才能出现的查询结果中。
内连接查询的语法格式如下所示:
SELECT 查询字段 FROM 表1 [INNER] JOIN 表2 ON 表1.关系字段 = 表2.关系字段;
注:在上述语法格式中,INNER JOIN用于连接两个表,ON来指定连接条件,其中INNER可以省略。
5.3.3 外连接
外连接分为左连接和右连接。外连接的语法格式如下:
SELECT 所查字段 FROM 表1 LEFT|RIGHT [OUTER] JOIN 表2 ON 表1.关系字段 = 表2.关系字段 WHERE 条件;
注:外连接的语法格式和内连接类似,只不过使用的是LEFT JOIN、RIGHT JOIN关键字,其中关键字左边的表被称为左表,关键字右边的表被称为右表。
(1)、LEFT JOIN(左连接):返回包括左表中的所有记录和右表中符合连接条件的记录。如果左表的某条记录在右表中不存在,则在右表中显示为空(NULL)。
(2)、RIGHT JOIN(右连接):返回包括右表中的所有记录和左表中符合连接条件的记录。如果右表的某条记录在左表中不存在,则在左表中显示为空(NULL)。
5.3.4 复合条件连接查询
复合条件连接查询就是在连接查询的过程中,通过添加过滤条件来限制查询结果,使查询结果更加精确。
5.4 子查询
子查询又称为嵌套查询,子查询也是一个SELECT命令语句,它可以嵌套在一个SELECT语句、INSERT语句、UPDATE语句 或 DELETE语句中。
执行过程:首先执行子查询中的语句,并讲返回的结果作为外层查询的过滤条件,然后在执行外层查询。
在子查询中通常要使用比较运算符、[NOT] IN、ANY、ALL及EXISTS等关键字。
注:比较运算符,如“>”、“<”、“>=”、“=”、“!=”等。
注:ANY关键字它允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任意一个比较条件,就返回一个结果作为外层查询条件。
注:ALL关键字的子查询返回的结果需同时满足所有内层查询条件。
注:EXISTS关键字后面的参数可以是任意一个子查询,只返回TRUE或FALSE,当返回值为TRUE时,外层查询才会执行。
5.3.1 交叉连接
交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积,也就是返回第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
交叉连接的语法格式如下:
SELECT * FROM 表1 CROSS JOIN 表2;
注:CROSS JOIN用于连接两个要查询的表,通过该语句可以查询两个表中所有的数据组合。
5.3.2 内连接
内连接(INNER JOIN)又称简单连接或自然连接,是一种常见的连接查询。
内连接使用比较运算符对两个表中的数据进行比较,并列出与连接条件匹配的数据行,组合成新的记录,也就是说在内连接查询中,只有满足条件的记录才能出现的查询结果中。
内连接查询的语法格式如下所示:
SELECT 查询字段 FROM 表1 [INNER] JOIN 表2 ON 表1.关系字段 = 表2.关系字段;
注:在上述语法格式中,INNER JOIN用于连接两个表,ON来指定连接条件,其中INNER可以省略。
5.3.3 外连接
外连接分为左连接和右连接。外连接的语法格式如下:
SELECT 所查字段 FROM 表1 LEFT|RIGHT [OUTER] JOIN 表2 ON 表1.关系字段 = 表2.关系字段 WHERE 条件;
注:外连接的语法格式和内连接类似,只不过使用的是LEFT JOIN、RIGHT JOIN关键字,其中关键字左边的表被称为左表,关键字右边的表被称为右表。
(1)、LEFT JOIN(左连接):返回包括左表中的所有记录和右表中符合连接条件的记录。如果左表的某条记录在右表中不存在,则在右表中显示为空(NULL)。
(2)、RIGHT JOIN(右连接):返回包括右表中的所有记录和左表中符合连接条件的记录。如果右表的某条记录在左表中不存在,则在左表中显示为空(NULL)。
5.3.4 复合条件连接查询
复合条件连接查询就是在连接查询的过程中,通过添加过滤条件来限制查询结果,使查询结果更加精确。
5.4 子查询
子查询又称为嵌套查询,子查询也是一个SELECT命令语句,它可以嵌套在一个SELECT语句、INSERT语句、UPDATE语句 或 DELETE语句中。
执行过程:首先执行子查询中的语句,并讲返回的结果作为外层查询的过滤条件,然后在执行外层查询。
在子查询中通常要使用比较运算符、[NOT] IN、ANY、ALL及EXISTS等关键字。
注:比较运算符,如“>”、“<”、“>=”、“=”、“!=”等。
注:ANY关键字它允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任意一个比较条件,就返回一个结果作为外层查询条件。
注:ALL关键字的子查询返回的结果需同时满足所有内层查询条件。
注:EXISTS关键字后面的参数可以是任意一个子查询,只返回TRUE或FALSE,当返回值为TRUE时,外层查询才会执行。