MySQL学习笔记
数据库的基础知识
范式
为了设计结构良好的数据库,需要遵守一些专门的规则,称为数据库的设计范式
第一范式(1NF)的目标:确保每列的原子性
第二范式(2NF)的目标:确保表中的每列,都和主键相关
第三范式(3NF)的目标:确保每列都和主键列直接相关,而不是间接相关
第一范式
第一范式的目标是确保每列的原子性
如果每列都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式(1NF)
第二范式
如果一个关系满足1NF(第一范式),并且除了主键以外的其他列,都依赖与该主键,则满足第二范式(2NF)
第二范式要求每个表只描述一件事情
第三范式
如果一个关系满足2NF(第二范式),并且除了主键以外的其他列都不传递依赖于主键列,则满足第三范式(3NF)
应用第三范式规范化
单词的含义
1、
Create:创建2、
Insert:插入3、
Primary:主要的4、
Structured:结构化的5、
Log:日志6、
SQL:结构化查询语言7、
Alter:修改8、
Drop:删除 (使用drop database 数据库名;可删除此数据库 ;使用drop table 表名;可删除该表)9、
Character:字符10、
Engine:引擎
数据表的基础知识
长度
给列定义的大小部分指的是该列能接受多少个字符,比如 char 允许用户只输入一个字符,而另一些则不允许这些做,所以建议使列值尽可能小,显示列越小,表所占的空间也就越少。但是还有一个问题就是如果减少列的大小,MySQL将用截断数据以满足新的大小尺寸,所以很可能丢失有价值的信息数据
数据类型
数值类型 字符串类型 日期时间类型 enum类型和set类型 text类型和blob类型
数值类型
- 整数数据类型
- 浮点数据类型
浮点型也称近似类型。这种类型不能提供精确表示数据的精度,使用这种类型来存储某些数值时,有可能会损失一些精度
字符串类型
常用的字符串类型主要包括char、varchar、binary、 varbinary等类型
显示数据表信息命令
1 | select *from 表名; |
约束
概念:约束实际上就是表中数据的限制条件
作用:表在设计的时候加入约束的目的就是为了保证表中的记录完整性和有效性,比如用户表有些列的值 (手机号) 不能为空,有些列的值 (身份证) 不能重复
修改字符段
1 | create table stident |
分类
- 主键约束
(primary key)PK - 自增长约束
(auto_increment) - 非空约束
(not null) - 唯一性约束
(unique) - 默认约束
(default) - 零填充约束
(zerofill) - 外键约束
(foreign key)FK
主键约束
- MySQL主键约束是一个列或者多个列的组合,其值唯一地标识表中的每一行,方便在RDBMS中尽快的找到某一行
- 主键约束相当于
唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值 - 每个表最多只允许
一个主键 - 主键约束的关键字是:
primary key - 当创建主键约束时,系统默认会在所在的列和列组合上建立对应的唯一索引
操作
- 添加单列主键
- 添加多列联合主键
- 删除主键
单列主键
创建单列主键有两种方式,一种是在定义字段的同时指定主键,一种是定义完字段之后指定主键
方式一
1 | use student; //使用哪个数据库 |
方式二
1 | create table emp2 |
联合主键
所谓联合主键,就是这个主键是由一张表中多个字段组成的
-
当主键是由多个字段组成时,不能直接在字段名后面声明主键约束
-
一张表只能有一个主键,联合主键也是一个主键
1 | create table emp3 |
通过修改表结构添加主键
主键约束不仅可以在创建表的同时创建,也可以在修改表时添加(比如当创建了表后忘了加主键就可以使用这种方法)
1 | -- 提前创建好表emp4 |
删除主键
不需要指定哪个主键因为一个表就一个主键
1 | alter table emp4 drop primary key; //删除emp4的主键 |
非空约束
MySQL 非空约束(not null) 字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错
方式一
1 | create table t_use5 |
方式二
1 | create table t_user1 |
查看是否为非空约束
1 | desc t_user1; -- desc 后面的是你要查询的表名 |
删除非空约束
删除也是非常简单只需把 not null 去掉运行即可
1 | alter table t_user1 modify name varchar(20); |
唯一约束
唯一约束(Unique key) 是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况
方式一
1 | create table t_user2 |
方式二
1 | create table t_user3 |
删除唯一约束
1 | alter table t_user3 drop index unique_pn; -- 这是方式二的删除约束方式,unique_pn代表是这个唯一约束的名字 |
默认约束
MySQL 默认值约束用来指定某列的默认值
方式一
1 | create table t_user4 |
方式二
1 | create table t_user6 |
删除默认约束
1 | alter table t_user6 modify name varchar(20) null; |
自增长约束
在MySQL中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。
通过给字段添加 auto_increment 属性来实现主键自增长
1 | -- 创建表 |
特点
- 默认情况下,auto_increment 的初始值是 1 ,每新增一条记录,字段值自动加 1 。
- 一个表中只能有一个字段使用 suto_increment 约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)。
- auto_increment 约束的字段必须具备 NOT NULL 属性。
- auto_increment 约束的字段只能是整数类型 (tinyint,smallint,int,bigint 等)
指定自增字段初始值
如果第一条记录设置了该字段的初始值,那么新增加的记录就从这个初始值开始自增。例如,如果表中插入的第一条记录的 id 值设置为 5 ,那么再插入记录时,id 的值就会从 5 开始往上增加
方式一
1 | create table t_user2 |
方式二
1 | create table t_use3 |
delete 和 truncate 在删除后自增列的变化
- delete 数据之后自动增长从断点开始
- truncate 数据之后自动增长从默认起始值开始
1 | delete from t_use3; |
零填充约束
- 插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0
- zerofill 默认为 int(10)
- 当使用 zerofill 时,默认会自动加 unsigned(无符号)属性,使用 unsigned 属性后,数值范围是原来的2倍,例如,有符号为 -128~+127,无符号为 0~256
操作
1 | create table t_user7 |
删除零填充约束
1 | alter table t_user7 modify id int; |
总结
校园信息数据库
1 | create database studentinfo character set utf8; //创建校园信息数据库 |
数据库和数据表的创建
1 | create database staff character set utf8; |
运行结果
数据查询语句 select
示例数据库
这个就是前面的校园信息数据库
1 | create database stucourse default charset utf8; |
查询学生的姓名和年龄
查询属于计算机系的男生的信息
查询工资在 3000-4000之间的教师信息,并按工资排序
查询学生姓“张”的学号和姓名
查询有选修课的学生学号,每个学号显示一次
查询选修 C1或C2的学生的学号、课程号和成绩,并按成绩倒序排序
查询生物系的高级教师信息
聚合语句
示例代码
1 | create database stucourse default charset utf8; |
计算教师平均工资
计算计算机系的学生总人数
计算选课表的平均成绩
取得选课成绩的最高分和最低分
计算书本的平均价格

