四、多表查询
4.1 外键
-
什么是外键?
-
− 外键是指引用另一个表中的一列或多列,被引用的列应该具有主键约束或唯一性约束。
-
− 外键用于建立和加强两个表数据之间的链接。
-
-
使用外键的目的:保证数据的完整性。
-
注意事项:
- 从表外键不能添加主表中不存在的记录;
- 主表不能删除从表中已经引用的记录。
-
为表添加外键约束
alter table 表名 add constraint FK_ID foreign key(外键字段名) REFERENCES 外表表名(主键字段名); [ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT}] [ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
注意:
- 引入外键后,外键列只能插入参照列存在的值,参照列被参照的值不能被删除,这就保证了数据的参照完整性;
- 建立外键的表必须是InnoDB型不能是临时表。因为MySQL中只有InnoDB型的表才支持外键;
- 定义外键名时,不能加引号。如:constraint ‘FK_ID’ 或 constraint " FK_ID "都是错误的。
各个参数的具体说明如下:
参数名称 功能描述 CASCADE 删除包含与已删除键值有参照关系的所有记录 SET NULL 修改包含与已删除键值有参照关系的所有记录,使用NULL值替换(不能用于已标记为NOT NULL的字段) NO ACTION 不能进行任何操作 RESTRICT 拒绝主表删除或修改外键关联列。(在不定义ON DELETE和ON UPDATE子句是,这是默认设置,也是最安全的设置) -
删除外键约束
在实际开发中,根据业务逻辑的需求,需要解除两个表之间的关联关系时,就需要删除外键约束。
alter table表名 drop foreign key 外键名;
4.2 操作关联表
-
关联关系(三个)
- 一对一:一对一的对应关系中,需要分清主从关系,通常在从表中建立外键;
- 多对一:在多对一的表关系中,应该将外键建在多的一方;
- 多对多:为了实现数据表多对多的关系,需要定义一张第三方中间表,该表保存两个关系表的外键。
-
一对一关系
两种建表原则:
1. 外键唯一:主表的主键和从简的外键唯一,形成主外键关系,外键唯一 unique;
2. 外键是主键:主表的主键和从表的主键,形成主外键关系。
-
多对一关系
alter table 从表 add [constraint][外键名称] foreign key(从表外键所在字段名) references 主表(主表的主键);
-
多对多关系
alter table 中间表 add foreign key(表1的字段名) references 表1的主键; alter table 中间表 add foreign key(表2的字段名) references 表2的主键;
4.3 连接查询
-
交叉连接
交叉连接返回的结果是被连接的两个表中所有数据行的笛卡尔积即行数的乘积。
SELECT * from 表1 CROSS JOIN 表2;
小贴士:
需要注意的是,在实际开发中这种业务需求是很少见,一般不会使用交叉连接,而是使用具体的条件对数据进行有目的的查询!
-
内连接
内连接(INNER JOIN)又称简单连接或自然连接,内连接使用比较运算符对两个表中的数据进行比较,列出与连接条件匹配的数据行,组合成新的记录。
SELECT 查询字段 FROM 表1 [INNER] JOIN 表2 ON 表1.关系字段 = 表2.关系字段;
-
外连接
-
左连接:左连接的结果包括LEFT JOIN子句中指定的左表的所有记录,和所有满足连接条件的记录。如果左表的某条记录在右表中不存在,则在右表中显示为空。
SELECT 所查字段 FROM 表1 LEFT [OUTER] JOIN 表2 ON 表1.关系字段 = 表2.关系字段 WHERE 条件;
-
右连接:右连接与左连接正好相反,返回右表中所有指定的记录和所有满足连接条件的记录。如果右表的某条记录在左表中没有匹配,则左表将返回空值。
SELECT 所查字段 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 表1.关系字段 = 表2.关系字段 WHERE 条件;
-
- 复合条件连接查询:复合条件连接查询就是在连接查询的过程中,通过添加过滤条件来限制查询结果,使查询结果更加精确。
4.4 子查询
子查询:将一条 select 语句查询的结果作为另一条 select 语法的一部分(查询条件,查询结果,表等)。
- 带IN关键字的子查询
- 带EXISTS关键字的子查询
- 带ANY关键字的子查询
- 带ALL关键字的子查询
确。