一、MySQL介绍
- 属于数据库的一种
- 目前属于Oracle甲骨文公司
- MYSQL称之为关系型数据库
- MySQL数据库是一种C/S模型,即客户端和服务端模型,客户端通过账号、密码连接服务器,连接成功后才可以进行数据库的操作(增加、删除、变更、查询 CRUD)
- MySQL的服务端采用的是IO复用+可伸缩的线程池,实现了网络高并发的经典模型。
二、SQL语句类别划分
1、DDL(Data Definition Language):数据库定义语言
- 定义了不同的数据库、数据库表、列、索引等数据对象的定义
- 常用的SQL:crate(创建)、drop(删除)、alter(更新)
2、DML(Date Manipulation Language):数据操控语言
- 用于添加、删除、变更和查询数据库记录
- 常用的SQL:insert(添加)、delete(删除)、update(更新)和 select(查询)
3、DCL(Data Control Language):数据控制语言
- 控制不同数据库段直接访问和访问级别的语句
- 常用SQL:grant、remove
三、数据库范式
名词 | 概念 |
---|---|
实体 | 现实世界中客观存在并可以被区别的事物。比如“一个学生”、“一本书”、“一门课”等。注意:这里所说的“事物”不仅仅是看得见摸得着的“东西”,也可以是虚拟的,比如说“老师与学校的关系”。 |
属性 | 教科书上解释为:“实体所具有的某一特性”,由此可见,属性一开始是个逻辑概念,比如说,“性别”是“人”的一个属性。在关系数据库中,属性又是个物理概念,属性可以看作是“表的一列”。 |
元组 | 表中的一行就是一个元组。 |
分量 | 元组的某个属性值。在一个关系数据库中,它是一个操作原子,即关系数据库在做任何操作的时候,属性是“不可分的”,否则就不是关系数据库了。 |
码(键) | 表中可以唯一确定一个元组的某个属性(或者属性组),如果这样的码有不止一个,那么大家都叫候选码(候选键),从候选码中挑一个出来做老大,它就叫主码(主键)。 |
全码 | 如果一个码包含了所有的属性,这个码就是全码。 |
主属性 | 一个属性只要在任何一个候选码中出现过,这个属性就是主属性。 |
非主属性 | 与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。 |
外码 | 一个属性(或属性组),它不是码,但是它别的表的码,它就是外码。 |
我们首先来了解下面几个概念
- 部分函数依赖
- 设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。
- 例子:学生信息表R(学号,身份证号,姓名),学号属性取值唯一,在R关系中,(学号,身份证号)→(姓名),(学号)→(姓名),(身份证号)→(姓名);所以姓名部分函数依赖与(学号,身份证号)
- 完全函数依赖
- 设X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X。
- 例子:学生基本信息表R(学号,班级,姓名)假设不同的班级学号有相同的,班级内学号不能相同,在R关系中,(学号,班级)→(姓名),但是(学号)→ 姓名)不成立,(班级)→(姓名)不成立,所以姓名完全函数依赖与(学号,班级)
- 传递函数依赖
- 设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。
- 例子:在关系R(学号 ,宿舍, 费用)中,(学号)→(宿舍),宿舍 != 学号,(宿舍)→(费用),费用!=宿舍,所以符合传递函数的要求
1、第一范式(1NF)
在任何一个关系数据库中,第一范式是对关系模式的基本要求,不满足第一范式的数据库就不是关系数据库。
所谓第一范式(1NF)是指数据库表的每一列(即每个属性)都是不可分割的基本数据项(每一列保持原子特征),同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
简而言之,第一范式就是无重复的列。
学生表
学号 | 姓名 | 年龄 | 地址 |
---|---|---|---|
01 | 张三 | 18 | XX省XX市XX区XX大学 |
因为上表中地址信息还包含省市区可以拆分,所以不属于第一范式
拆分改造后:
学生表(学号、用户名、性别、年龄、地址ID)
地址表(地址ID、省、市、区)
拆成上述学生表和地址表就变成第一范式咯
2、第二范式(2NF)
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
属性完要全依赖于主键(针对联合主键 -> 消除部分依赖)
在1NF基础上,非主属性完全依赖于主键,如果不是依赖主键,应该拆分成新的主体,拆分成一对多的关系。
也就是说第二范式需要确保数据库表中每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。
例子
学生选课表(学生ID、学生姓名、学生性别、课程名称、课程成绩)
主键(学生ID、课程名称)
学生姓名→学生ID (部分依赖)
学生性别→学生ID (部分依赖)
课程成绩→(学生ID、课程名称)(完全依赖)
拆分改造后:
学生表(学生ID、学生姓名、学生性别) 主键:学生ID
课程成绩表(课程ID、课程名字、学生ID、成绩) 主键:课程ID
3、第三范式(3NF)
在2NF基础上,属性不依赖于其他非主属性(消除传递依赖)
例子
学生表(学生ID、学生姓名、学生性别、学院名称、学院电话)
主键:学生ID
学生姓名-》学生ID
学生性别-》学生ID
学院名称-》学生ID
学院电话 -》 学生ID -》查询学院-》查询学院电话
拆分改造后:
学生表:(学生ID、学生姓名、学生性别、学院ID)主键:学生ID
学院表:(学院ID、学院名称、学院电话) 主键:学院ID
4、总结
1NF:确保每列保持原子性
2NF:确保表中的每列都和主键相关
3NF:确保每列都和主键列直接相关,而不是间接相关
- 数据库范式的作用:
- 进行数据库设计时字段、库表划分的依据
- 数据库范式的优点:
- 减少数据冗余(最主要的好处、其他好处因此而附带)
- 消除异常(插入异常、更新异常、删除异常)
- 让数据组织的更加和谐
- 数据库范式的缺点:
- 应用范式越高、表越多、表越多带来的问题:
- 查询时需要连接多个表,增加了查询的复杂性
- 查询时需要连接多个表,降低了数据库查询的性能
- 应用范式越高、表越多、表越多带来的问题:
ps:范式不是越高越好,一般满足3NF即可!
四、启动和退出
1、启动
连接前服务端必须要启动
mysql -u XXX -p XXX
mysql:代表客户端命令
-u 后面跟用户名
-p 后面跟用户密码
2、退出
退出用户端登录: exit