3_MySQL数据库二(约束与设计详解)

数据库(二)

第一大块

一、DQL 查询语句补充

  • a.排序查询

格式:order by 字段名 排序方式,字段名 排序方式… asc升序 desc降序

  • b.分组查询

格式:group by 字段名 having 条件判断 //比如说性别字段就可以自动被分为两个组
注意点:1.group by后边的字段通常只写一个;
2.group by后边跟的是分组字段或者聚合函数;
3.where和having两个条件判断关键字的区别,where后边不能写聚合函数,where条件
先行判断进行过滤;having后边可以跟聚合函数,并且having是在分组后对每个分组
进行条件过滤。
理解:分组查询的话通常是对某个字段进行分组,通常分组后显示的数据信息是关于每一个组的
信息进行整合,处理,通常是需要通过配合聚合函数来使用。

  • c.分页查询

格式:limit 当前页开始的索引,当前页的信息数
公式:当前页的起始索引号=(当前页码-1)*每一页的信息条数 前提:每一页的信息数是固定的
理解:索引是从0开始的,而页码是从1开始的,这样的话我们就可以写公式。

  • d.聚合函数

1.count() 注意:1.不会将字段值为null的字段记入总数;2.为了避免注意点1的情况
发生,我们通常选择没有null值的字段;或者我们可以用ifnull()
函数判断。
2.min() max() avg() sum()

第二大块 约束

一、非空约束添加方式(not null)

  • a.三种方式:1.直接在创建表时设置约束;2.创建表后,添加约束字段;3.删除字段,然后添加约束字段。
  • b.示例:

create table stu(name varchar(8) not null);-- 方式一:定义时创建非空约束字段
create table stu(name varchar(8),age int);
ALTER TABLE stu MODIFY NAME VARCHAR(8) NOT NULL;-- 方式二:字段中没有null时可以使用
ALTER TABLE stu MODIFY NAME VARCHAR(8);-- 可以改变非空修饰符
alter table stu drop name;-- 方式三:删除字段后再创建该字段
alter table stu add name varchar(8) not null;-- 方式三

二、唯一约束(unique)

  • a.三种方式:同非空约束(注意:就是删除被非空约束修饰的字段需要在删除语句后面加上 unique 关键字,但是非空约束的删除则不需要)

  • b.示例:

create table stu(name varchar(8) unique);-- 方式一:定义时创建唯一约束字段
create table stu(name varchar(8),age int);
ALTER TABLE stu MODIFY NAME VARCHAR(8) unique;-- 方式二:字段中没有相同字段时可以使用
ALTER TABLE stu MODIFY NAME VARCHAR(8); – modify改变不了被唯一约束修饰的字段
alter table stu drop name;-- 方式三:删除字段后再创建该字段
alter table stu add name varchar(8) unique;-- 方式三

三、主键约束

  • a.特性:一张表只能有一个字段被主键约束修饰;

并且modify改变不了被主键修饰的字段。
由于主键在一张表中是唯一的,所以主键的删除操作可以简化:alter table 表名 drop primary key;

  • b.三种约束字段创建方式:同非空约束。
  • c.示例:

create table stu(name varchar(8) primary key);-- 方式一:定义时创建主键约束字段
create table stu(name varchar(8),age int);
ALTER TABLE stu MODIFY NAME VARCHAR(8) primary key;-- 方式二:字段中没有相同且非空字段值时可以使用
ALTER TABLE stu MODIFY NAME VARCHAR(8); – modify改变不了被主键约束修饰的字段
alter table stu drop name;-- 方式三:删除字段后再创建该字段
alter table stu add name varchar(8) primary key;-- 方式三

四、主键补充知识点,自动增长

  • a.特性:一般情况下和主键配合使用;可以修饰数值字段,赋予相关字段null值时会自动一上一行数据为基准加1;
  • b.示例:

create table stu(name varchar(8),age int);-- 方式一:定义时创建主键约束的自动增长字段
create table stu(name varchar(8),age int PRIMARY KEY auto_increment);
ALTER TABLE stu MODIFY age int auto_increment ;-- 方式二:可以通过modify改变自动增长属性
ALTER TABLE stu MODIFY age int; –
alter table stu drop age;-- 方式三:删除字段后再创建该字段
alter table stu add age int primary key auto_increment;-- 方式三

五、外键约束

  • a.格式:constraint 外键名称 foreign key (外键列名) references 主表名称(主表列名称) 外键

格式说明:主表:是指处理冗余数据的那个表,也就是内容比较少的那张表,也是外键需要去关联的那张表;
外键名称:是指你这一列的字段名之外的额外名称,可以任意取名字,但是不要重名即可;作用主要在于删除时需要使用外键名而不是外键列名;
外键列名:其实就是字段名,就是外键的一个名称,但是我们要分清楚和外键名称的区别。

  • b.注意点:1.外键表需要优先于与之关联的表,否则与之关联的表搜索不到需要关联的外键表;

2.与外键表关联的表需要关联的外键表的字段通常是含有唯一约束或者主键约束的。
3.外键表与与之关联的表环环相扣;

  • c.添加删除外键示例:

– 删除外键:外键的添加删删除操作都是比较特殊的 reference 参考
alter table employee drop foreign key emp_depid_fk;
alter table employee drop dep_id;-- 不能通过直接删除含有外键的列字段,必须要先删除外键才可以删除这个字段
– 添加外键:这里说明一下,如果需要额外添加一列外键字段,那么需要先创建这个字段,再添加外键
alter table employee add [constraint emp_depid_fk] foreign key (dep_id) references department(id);

  • d.额外内容:级联操作
  • e.级联意义:可以在外键和主表的一方的数据发生改变时,另一方的表的数据作出相应的改变。
  • f.定义:在表定义时在后面添加 级联更新—on update cascade 级联删除—on delete cascade cascade 级联

第三大块 数据库的设计

一、数据库多表之间关系

  • a.多表之间的关系:一对一;一对多;多对多。
  • b.一对多实现方式:用外键直接可以实现。
  • c.多对多实现方式:用中间表作为主表可以实现,核心还是外键。
  • d.一对一实现方式:在任意一方添加外键指向另一张表作为主表;但是要在相应字段添加约束。其实基本用不上。
  • e.实例
  • f.语法补充:char()数据类型 constraint 外键名 可以省略,系统为其自动赋值 default 关键字 为字段设置默认值

二、数据库设计的范式

  • a.范式概述:
  1. 第一范式(1NF):每一列都是不可分割的原子数据项
  2. 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于码(在1NF基础上消除非主属性对主码的部分函数依赖)
  • 几个概念:
  1. 函数依赖:A–>B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A
    例如:学号–>姓名。 (学号,课程名称) --> 分数
  2. 完全函数依赖:A–>B, 如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。
    例如:(学号,课程名称) --> 分数
  3. 部分函数依赖:A–>B, 如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。
    例如:(学号,课程名称) – > 姓名
  4. 传递函数依赖:A–>B, B – >C . 如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称 C 传递函数依赖于A
    例如:学号–>系名,系名–>系主任
  5. 码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
    例如:该表中码为:(学号,课程名称)
  • 主属性:码属性组中的所有属性
  • 非主属性:除过码属性组的属性
  1. 第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
    4.表格优化为第三范式可以解决的3大问题:
    1.存在非常严重的数据冗余;
    2.数据添加存在问题;
    3.数据删除存在问题;
  • b.这里我写一下我归纳的步骤:第一范式->第二范式->第三范式

1.我们找出码和非码(码是标志度比较高德字段)
2.我们将码字段的所有组合情况列出来,遍历这些组合找出每一个组合的完全依赖部分,把每一个完全依赖部分单独拉出来
单独构成一张表。
3.将我们单独拿出来的表的数据冗余部分删除掉。 第一范式->第二范式 完成
4.遍历第二范式的每一张表,筛选出其中非码字段数量大于等于2的表进行处理,找出其中含有传递函数依赖的部分。
5.对含有传递函数依赖的部分我们进行拆分,将传递部分的大头(可以理解为传递函数部分的2级码字段)保留在原先第二
范式的表格中,然后将大头以及其从属部分拆分为另外一张表,重复类似于步骤5的操作。 第二范式->第三范式 完成

三、数据库的备份和还原

  • a.cmd 命令:备份 mysqldump -u用户名 -p密码 数据库名称 > 保存路径

还原 source 文件路径

  • b.图形化界面:鼠标右击 选择即可

PRI主键约束;

UNI唯一约束;

MUL可以重复。

发布了21 篇原创文章 · 获赞 9 · 访问量 1492

猜你喜欢

转载自blog.csdn.net/qq_43230007/article/details/104155642