计网----数据库(一)
一.什么是数据库
数据库是”按照数据结构来组织、存储和管理数据的仓库“。是一个长期储存在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
二.数据库的特点
1.规范化的本地存储
2.加密
3.共享
三.数据库的好处
方便管理查找,查询数据快
四.数据库的分类
1.关系型数据库:其实就是二维表,典型代表mysql,oracle,SQL Server
如图
2.非关系型数据库:也叫NoSql,是一维映射key-value 典型代表redis,MongoDB
如图
五.数据库范式
1.什么是范式
要想设计一个好的关系,必须使关系满足一定的约束条件,此约束已经形成了规范,按照这种规范可以使设计简洁的、结构明晰,不会因为插入删除,更新数据导致异常
2.常见名词
属性->特征->表中的一列->字段
元组:表的一行就叫一个元组
码:表中唯一确定一个元组的属性,码不止一个,叫这些为候选码
主码:从候选码挑选出来一个主要确定这一行的属性
主属性:只要在任何一个候选码中出现过,这个属性就叫主属性
非主属性:没有在任何一个候选码中出现过
3.第一范式(1NF)属性不可分
下图符合第一范式
下图不符合第一范式
4.第二范式(2NF)不存在组合关键字中的某些字段决定非关键字段(组合关键字不可拆)
1.看下面的图判断是否符合第二范式
非主键列全部依赖于主键,符合第二范式
非主键列全部依赖于部分主键,不符合第二范式
非主键列部分依赖于主键,不符合第二范式
非主键列部分依赖于部分主键,不符合第二范式
1.解决不符合第二范式的表
初始表如下
选课课表为(学号,姓名,年龄,课程名称,成绩,学分)
先挑选出来主属性,这里的主属性是学号和课程名称,(学号,课程名)->(姓名,年龄,成绩,学分)
但是此时的姓名,年龄只由学号决定,学分只由课程名称决定,所以不符合第二范式,我们要进行修改
修改之后变为
学生:学号,姓名,年龄
课程:课程名称,学分
选课:学号,课程名称,成绩
2.不符合第二范式会出现的问题
1.数据冗余
2.更新异常
3.插入异常
5.第三范式(3NF)不存在依赖传递(关键字段 --> 非关键字段x --> 非关键字段y)
1.解决不符合第三范式的表
初始表如下
学生的关系表:(学号,姓名,年龄,所在学院,学院地点,学院电话)
先挑选出来主属性,这里的主属性是学号,(学号)->(姓名,年龄,所在学院,学院地点,学院电话)
但是知道学号就知道了所在学院,知道了所在学院就知道了学院地点,学院电话,这里存在依赖传递,所以不符合第三范式,我们要进行修改
修改之后变为
学生单独一个表(包括学院),学院单独一个表
6.BCNF(鲍依斯-科得范式):不存在关键字段决定关键字段
1.解决不符合鲍依斯-科得范式的表
初始表如下
仓库管理系统(仓库ID,存储物品ID,管理员ID,数量)
先挑选出来主属性,这里的主属性是仓库ID,管理员ID和存储物品ID
(仓库ID,存储物品ID)->(管理员ID,数量)
(管理员ID,存储物品ID)->(仓库ID,数量)
其中有两个主属性相互决定,所以不符合鲍依斯-科得范式
修改之后变为
仓库管理:仓库ID,管理员ID
仓库:仓库ID,存储物品ID,数量
六.学习mysql数据库
1.了解mysql相关知识
1.看第一张图进行了解
这里mysql是数据库(服务端)
这里mysql-workbench是客户端,用来登录到mysql(服务端)上,然后往数据库里写入数据
2.看第二张图进行了解
这里的root用户是权限最大的,也可以通过它来创建其他用户
3.看第三张图进行了解
![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=C%3A%5CUsers%5C%E5%86%89%E5%96%9C%E6%96%87%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-2023110
4.看第四张图进行了解
5.看第五张图进行了解
6.看第六张图进行了解
2.学习mysql数据库中的sql语句
1.创建一个写sql语句的文件
2.创建一个数据库
1.在此界面中右键,选择Create Schema
2.写数据库的名字,然后点击apply
3.到此页面继续点击apply
3.在写sql语句的文件里进行学习sql语句
1.写入sql语句的文件中时一些基本知识
#注释
#sql语句以分号为结束标志
#命名规则:数据库一般不区分大小写,一般用小写,最好不用用特殊字符
#表名:t_xxx
#列名:f_xxx
2.创建表的sql语句
#指定默认库
use rxwku;
#创建表的格式为:creat table 表名(列名 数据类型 建表约束);
#建表约束
#主键:primary key,值唯一,不 允许为空,每张表只能有一列是主键列
#唯一:unique,值唯一,但是可以为空,每张表可以有多个唯一列
#非空:not null,不能为空
#默认值:default
#自增:auto_increment
#外键约束:当前表的某一列和其他表有关系
create table studentinfo(
number int primary key auto_increment,
name varchar(10) not null,
#在数据库里单引号和双引号都能表示字符串,可以双引号里套单引号或者单引号套双引号,最多只能套一层
sex enum('男','女'),
age int default 18
);
#注意创建完之后需要手动刷新一下才能在schemas中看到
3.mysql中的数据类型
#数据类型:int,char()/varchar()/nvarchar(),enum
#char()/varchar()/nvarchar()的区别
#char(45):字符串长度为45,如果存"hello",实际上存的是"hello00000.....",长度固定,如果不足长度用用0补齐
#varchar(45):字符串长度最大为45,如果存"hello",实际上存的是"hello",这里的45是固定的最大长度,长度不足就按照实际长度存储
#nvarchar(45):字符串长度最大为45,如果存"hello",实际上存的是"hello",这里的45是固定的最大长度,这里的字符按照宽字节存储,也就是一个字符占2个字节
#数据库最大可以存储8千个字节,nvarchar只能存4千个字符,varchar可以存8千个字符
4.删除和修改表的sql语句
#删除表 drop table 表名
drop table studentinfo;
#修改表:alter table 表名...
#1.增加一列:alter table 表名 add column 列名 数据结构 建表约束;
alter table studentinfo add column school int;
#2.修改列的属性:alter table 表名 modify 列名 数据结构 建表约束;
alter table studentinfo modify school varchar(45);
#3.删除一列:alter table 表名 drop column 列名;
alter table studentinfo drop column school;
5.查询表的sql语句
#查询:select* from 表名; 查询某个表的所有列
select* from studentinfo;
#查询某几列:
select number, name from studentinfo;
#给查询的列起别名 (并没有修改表中的列名 )
#select number 学号,name 姓名 from studentinfo;
6.给表中插入数据的sql语句
#插入所有列的数据: insert into 表名 values (值1,值2,...);(要求数据的顺序和表中列的顺序一致)
insert into studentinfo values (1,'张三','男',20);
#插入指定列: insert into 表名 (列名1,列名2,...) values (值1,值2,...); (值的顺序和指定列的顺序一致)
insert into studentinfo (name,sex) values('李四','男');
insert into studentinfo (sex,name) values('女','小芳');
insert into studentinfo (name) values('王五');
7.删除表中数据的sql语句
#删除数据:delete from 表名 where 条件;
#删除王五同学的数据
delete from studentinfo where name="王五";