MySQL知识点回顾
- 数据概念
- MySQL产品的介绍
- 数据库的设计
- ***主键外键的简单了解***
- ***多表之间的关系***
- 数据库设计的范式
数据概念
DB:数据库(database): 存储数据的库,保存了一系列有组织的数据。
DBMS:数据库管理系统(Database Management System): 上面的数据库就是通过DBMS进行创建的, DBMS就是一个数据库产品。
SQL结构化查询语言(Structure Query Language): 专门用来与数据库(DBMS)通信的语言。
优点:
- 所有的DBMS(数据库软件)都支持SQL
- 简单易学
- 语言灵活,可以完成很多复杂和高级的数据库操作
三者之关系:使用DBMS输入SQL来操作DB
MySQL产品的介绍
服务器的启动和停止: 用管理身份运行CMD窗口.
开启:net start 服务名.
关闭:net stop 服务名.
服务器可以在系统的服务中查看,并且MySQL也可以设置为自动和手动,我这里设置的是自动,电脑开启之后会自动开启MySQL,不用每次手动开启那么麻烦,当然相应的会拖延开机时间.
MySQL的登录与退出(这里只讲CMD命令下的开启方式):
// 在CMD窗口中输入,[]中的内容为可省略,端口号是自己设置的,mysql默认是3306
mysql [-h(主机名) localhost -P(端口号)] -uroot -p(密码)
// 一般我们可以直接缩写,最后一个root为密码
mysql -uroot -proot
// 示例:
mysql -h localhost -P3306 -uroot -proot
讲完了MySQL的前置需求,现在我们说一下SQL的四大分类.
DDL :操作数据库、表
DML:增删改表中的数据
DQL:查询表中的数据
DCL:管理用户/授权
接着我们再说下MySQL中的语法规范:
- MySQL中不区分大小写,建议关键字大写,表名、字段名小写
- 每条语句用分号结尾,在CMD窗口中,如果不加分号,那么系统会认为语句没有写完,不会执行,但是在软件中可以直接选择执行,不加分号也可以,这里建议是加上分号
// 这是一条SQL查询语句
SELECT
*
FROM
employees
WHERE
id = 1;
数据库的设计
主键外键的简单了解
主键: 用来确定一条记录的唯一标识,就像每个员工都有自己的编号,通过这个编号,就可以知道这个员工的所有信息.
外键: 用于与另一张表做关联.就像每个员工都有一个职位编号,职位编号对应了职工表中的主键. 用一句话描述就是:"表A中的字段,是表B中的主键,那么这个字段就是外键.
需要注意的是,一个表只能有一个主键,但是可以有多个外键
多表之间的关系
一对一:
人和身份证:一个人只有一个身份证号码,而一个身份证号码只能对应一个人,这就是一对一关系.
实现方式:
可以在任意一方设置唯一外键指向另一方的主键
一对多(多对一):
古代的门派和弟子:一个门派可以有多个弟子,但一个弟子只能加入一个门派,这就是一对多关系
实现方式:
在多的一方建立外键,指向"一"一方的主键
多对多:
江湖侠客和武林秘籍:江湖侠客可以学很多门武功,同样,一个武功可以被很多江湖侠客所学习.
实现方式:
多对多关系需要借助第三张中间表,中间表需要包含两个字段,分别指向两张需要实现多对多关系表的主键.
数据库设计的范式
概念: 设计数据库是,需要遵循的一些规范,要遵循后面的范式要求,必须先遵循前边的所有范式要求
关于范式前提的几个重要概念:
- 函数依赖:A–>B,如果通过A属性(属性组)的值,可以确定B属性的值,则称为B依赖于A
如:学号–>姓名 (学号、课程名)–>分数 - 完全函数依赖:A–>B.如果A是一个属性组,则B属性值的确定需要A属性组中的所有属性值.
如:(学号、课程名)–>分数 - 部门函数依赖:A–>B,如果A是一个属性组,则B属性值的确定只需要A属性组中的某些值
如:(学号、课程名)–>姓名 - 传递函数依赖:A–B.B–>C,如果通过A属性值(组)的值可以确定B属性的值,再通过B属性值确定C属性值,那么则称C传递依赖于A
如:学号–>系名,系命–>系主任 - 码:如果一张表中,一个属性或属性组,被其他属性所完全依赖,则称这个属性(属性组)为该表的码
主属性:码属性(组)的所有属性
非主属性:除主属性外的所有属性
第一范式(1NF):
每一列都是不可分割的原子数据项,就相当于一张表中的一条数据,是最基本的范式
第二范式(2NF):
在1NF的基础上,非码属性必须完全依赖于码(在1NF的基础上消除非主属性对主码的部分函数依赖)
第三范式(3NF):
在2NF的基础上,任何非主属性不依赖于其他非主属性(在2NF的基础上消除传递依赖)
例表:
(此表的主属性组为:ID、课程名)
首先分析一下此表存在的问题:
- 数据冗余
- 存在部分函数依赖,(姓名,系命,系主任依赖于ID),这样如果小明和小红毕业了,那么对应的系名,系主任也就消失了,这显然不合理
- 存在传递依赖:(系名依赖于ID,系主任依赖于系名)
下面将表设置为如下,则可以解决以上所有问题.
以上所有内容借鉴 尚硅谷与传智播客。