MySQL 学习笔记 基础(约束,多表查询 上)
约束
约束-概述
- 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
- 目的:保证数据库中数据的正确、有效性和完整性。
- 分类:
注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。
例子:
create table user( id int primary key auto_increment comment '主键', name varchar(10) not null unique comment '姓名', age int check ( age > 0 && age <= 120 ) comment '年龄', status char(1) default '1' comment '状态', gender char(1) comment '性别' ) comment '用户表'; insert into user(name, age, status, gender) values ('Tom1', 19, '1', '男'), ('Tom2', 25, '0', '男'); insert into user(name, age, status, gender) values ('Tom3' , 19, '1', '男'); insert into user(name, age, status, gender) values (null , 19, '1', '男'); insert into user(name, age, status, gender) values ('Tom3', 19, '1', '男'); insert into user(name, age, status, gender) values ('Tom4', 80, '1', '男'); insert into user(name, age, status, gender) values ('Tom5', -1, '1', '男'); insert into user(name, age, status, gender) values ('Tom5', 121, '1', '男'); insert into user(name, age, gender) values ('Tom5', 120, '男');
约束-外键约束
- 概念:外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。
注意:目前上述的两张表,在数据库层面,并未建立外键关联,所以是无法保证数据的一致性和完整性的。
- 语法
· 添加外键
CREATE TABLE 表名 ( 字段名 数据类型, ... [CONSTRANT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名) );
ALTER TABLE 表名 ADD CONSTRANT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名);
· 删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
- 删除/更新行为
ALTER TABLE 表名 ADD CONSTRANT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;
多表查询
多表查询-多表关系介绍
- 概述:项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种关系,基本上分为三种:一对多(多对一),多对多,一对一。
- 一对多(多对一)
· 案例:部门与员工的关系
· 关系:一个部门对应多个员工,一个员工对应一个部门
· 实现:在多的一方建立外键,指向一的一方的主键
- 多对多
· 案例:学生与课程的关系
· 关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择
· 实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
- 一对一
· 案例:用户与用户详情的关系
· 关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率
· 实现:在任意一方加入外键,关联另一方的主键,并且设置外键为唯一的(UNIQUE)
多表查询-概述
- 概述:指从多张表中查询数据
- 笛卡尔积:笛卡尔乘积是指在数学中,两个集合 A 集合和 B 集合的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)
- 多表查询分类
· 连接查询
内连接:相当于查询 A、B交集部分数据
外连接:
左外连接:查询左表所有数据,以及两张表交集部分数据
右外连接:查询右表所有数据,以及两张表交集部分数据
自连接:当前表与自身的连接查询,自连接必须使用表别名。
· 子查询
多表查询-连接查询-内连接
- 隐式内连接
SELECT 字段列表 FROM 表1, 表2 WHERE 条件 ... ;
- 显式内连接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件 ... ;
多表查询-连接查询-外连接
- 左外连接
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件 ... ;
相当于查询表1(左表)的所有数据,包含表1和表2交集部分的数据
- 右外连接
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件 ... ;
相当于查询表2(右表)的所有数据,包含表1和表2交集部分的数据
多表查询-连接查询-自连接
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ... ;
自连接查询,可以是内连接查询,也可以是外连接查询。
多表查询-连接查询-联合查询
对于 union 查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。
SELECT 字段列表 FROM 表A ... UNION [ALL] SELECT 字段列表 FROM 表B ... ;
对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
union all 会将全部的数据直接合并在一起,union 会对合并之后的数据去重。