网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
投影状SQL语句
选择转SQL语句
笛卡尔积转SQL语句
自然连接转SQL语句
- 先把它的关系代数变形为上面等价的笛卡尔积表达式,然后在转
SQL
SQL语句
SQL语句的分类
数据定义语句(DDL)
- 1、 建立数据库
create datebase 数据库名
- 2、建立基本表
3、 修改基本表结构
alter table test modify f3 float ;
- 修改不是指的修改列的表名,而是指的修改列的类型,一般用上面
modify
来进行修改
primary key
是主键约束(功能和not null unique
一样)foreign key
是外键约束(上面的外键约束语句意思是对sid设置外键约束并且参照S表中的sid)check
是用户自定义完整性约束(上面语句意思是检查成绩是否在0-100
范围内,也就是在表中插入数据的时候成绩这一列会有一个自动检查成绩范围的约束,不在这个范围就会报错)
数据操纵语言(DML)
数据查询语言(DQL)
投影查询
选择查询
排序查询
- 注意上面红色画出来的语句不是说课程号和分数都是降序排列,这里课程号没有指明是什么排序,那就是默认的升序,分数指明了是降序排序,但是这里是多条件排序,所以是先按课程号进行升序排序,如果课程号相同,那就按分数降序排序
聚合函数查询(注意聚合函数只会返回一个结果值)
- 上面这句是验证分数的平均值,也就是
AVG
集合函数
- 指的一提的是上面这样写是没问题的,可以进行加减乘除运算(这是我的知识漏洞)
同时要注意count(*)
和count(列表名)
的区别,区别就是count(*)
会把null
也算作一个值,会把null
这条记录进行统计,而count(列表名)
就直接忽视null
的记录,不会把这条记录进行统计。
- 指的一提的是上面这样写是没问题的,可以进行加减乘除运算(这是我的知识漏洞)
- 这是查询课程号的数量并且去重
- 数据分组
分组后
- 所谓的分组就是把属性值相同的分为一组,例如上面是按课程号分组的,那么课程号中相同的值就会被分作一组,分组主要用于聚合函数查询只能返回一个值,如果想看具体的情况就使用分组
- 这里要注意
having
和where
的使用区别,区别就是如果拼接的条件里用到了聚合函数,那就只能用having
,不能用where
!
内连接
非等值连接
自连接
外连接
子查询(先子查询再主查询)
数据控制语言 (DCL)
- SQL访问控制
视图
视图的创建与删除
- 如果插入的不满足条件的话, 那么就会插入失败 不显示 。
- with check option 就是用来判断是否操作成功的 , 如果去修改原视图的判断(where) 语句的内容 就会报错, 如果加了with check option的话就意味着这个视图的增改删操作必须要满足where 后面的条件才可以进行操作,不然就会报错
索引
关系模式
- 因为通过单个关系 是没办法确定一个元组 , 因为内容不唯一性 。
- 这里的箭头可以理解为决定的意思,例如学号—>姓名,可以理解为学号决定姓名
关系数据库的规范化
函数依赖
- 真子集
完整函数依赖就是一个组合里的任何真子集不能够决定依赖关系,例如(学号,课程号)----->成绩这是一个组合关系的函数依赖,表示学号和课程号两个一起决定成绩,这其中任何子集不能单独来确定这个依赖关系,例如学号不能单独决定成绩,课程号也是不能单独决定成绩,这就是完整函数依赖,如果不是一个组合,就是一一对应的函数依赖关系那一定是完整函数依赖
,例如学号---->姓名这样的就是完整函数依赖,它不是一个组合,(学号,课程号)----->成绩这样的才是一个组合,这里还要理解真子集的含义,例如(A,B,C)的真子集有(A),(B),©,(A,B),(A,C),(B,C)跟数学里的概念是一样的部分函数依赖就是一个组合里任意真子集能够决定依赖关系,例如(学号,课程号)---->姓名这个组合关系的函数依赖中,单一个学号就能够决定姓名了,也跟就不需要课程号,所以这就是部分函数依赖。
码和推理规则
- 如果只有一个候选键那就是主键,有多个候选键那就挑一个做主键
属性的闭包运算 (求主键)
- 如果包含 u 里面的全部元素, 则为闭包
- 技巧 直接看 F中箭头右边 所有存在的字母 一般不存在的就为主键 然后就是各种尝试
- 做题技巧:但凡出现在箭头右边的都不可能是候选键,例如上面这题箭头右边有B和C,那直接排除,剩下一个A,也就是这个A一定是候选键或者候选键中一定要有A,然后发现A不能单独推出U,所以就试一下AC和AB能不能推出
然后主属性是指候选键包含的属性那就是主属性,例如上面的AC和AB为候选键,那主属性就有ABC
- 上图 蓝色就为主键
红色
为推出来的内容
范式
第一范式
上面这个是不符合第一范式,因为它的工资可以再进行细分,要符合第一范式那就变成下面这样就可以了
- 第一范式说白了就是看属性列表能不能在继续分,能继续分那就不符合第一范式
然后第一范式会有数据冗余和 更新异常(包括修改,删除,插入异常)这些问题并存在部分函数依赖
数据冗余容易理解,例如上图画出来的可以看出是内容是一样的,那就重复了很多次这就是数据冗余 - 更新异常中的修改异常,好比修改红色框中的张三为张四,那就必须把所有的张三都改成张四,如果只改一条就会出现问题,查询学号为001的数据的时候那姓名可能是张三也可能是张四,这就是修改异常
- 更新异常中的删除异常,好比删除高等数学这个课程名,但是上面这个表中要删除高等数学这个课程名那整一条数据都会被删除掉,也就是孙七这条记录都删除了,而我只是想删除这个课程,这就是删除异常
- 更新异常中的插入异常,好比我只是想要插入一个学生的信息是插入不成功的,因为上面这个表中主键是学号和课程号,由于主键的完整性约束,不能为空或部分为空,无论是单独插入学生信息还是单独插入课表信息都是插入失败,必须两个都插入才能成功,这就是插入异常
第二范式
第二范式是在第一范式的基础上解决了部分函数依赖的问题得来的,第二范式要求每个非主属性都完全依赖于候选键,上面的例子中候选键是学号和课程号,所以学号和课程号都是主属性,其他的都是非主属性,例如姓名是非主属性,由于姓名是由学号决定的,跟课程号毫无关系,所以姓名只是部分依赖于候选键,因此不符合第二范式的要求,但是符合第一范式。
前面说的那个例子符合第一范式不符合第二范式,只要消除了部分函数依赖就能够转为第二范式,往往都是通过分解关系来实现消除部分函数依赖的,例如上面的把前面的关系分解成三个关系后就都满足于完全函数依赖(也就是把一个表分解为三个表),所以它是符合第二范式的.
第二范式只是解决了第一范式的部分函数依赖问题,但是数据冗余和更新异常没有完全解决,因为存在传递函数依赖,例如上面的 学号–>学院,学院–>院长,得出学号–>院长
第三范式
- **第三范式是在第二范式的基础上,并且消除了非主属性的传递依赖问题得到的,**原来学号–>学院,学院–>院长,得出学号–>院长这是传递依赖,一般把后面的那个关系直接给拿出来单独作为一个关系,例如这个传递依赖中把后面的学院–>院长从原来的关系中抽离出来作为一个新的关系就可以解决传递依赖这个问题了 (把学院设置为主键) 第三范式只是解决了第二范式的传递函数依赖问题,但是数据冗余和更新异常没有完全解决,因为存在主属性对候选码的部分依赖和传递依赖
- 例如上图就是存在主属性对候选码的部分依赖这个问题,在F函数关系依赖中,红色画出的就是存在主属性对候选码的部分依赖的问题,因为候选码是(书店和图书)。而它书店就能够推出店长,跟图书没啥关系,所以存在部分依赖
总结
- 2、判断非主属性是否对候选键存在部分函数依赖,说白了就是看非主属性能不能只靠候选键的一部分就可以推理出来(靠候选键组合中任意一个主属性就可以推出那个非主属性的就不是第二范式,但是如果是组合中其中一个和其他非主属性组合在一起推出非主属性的那就没问题)
- 3、看有没有传递依赖,存在传递依赖不符合第三范式
- 4、看主属性对候选码有没有传递依赖或部分依赖,也就是主属性可以由候选码中任意一个就推出来那就不符合BCNF范式
- 5、看有没有多值依赖,并且多值依赖的左边是码,例如
A->B,A->C
,并且A
是码,那就符合第四范式
做题技巧
- 判断是否存在 部分依赖
- 真题 https://www.yuque.com/saodai/ss8tp9/ged114#jwRpK
例题
- 选择题 54 做法 划去箭头右边的 看看剩下的即为主键
55
第一范式肯定满足 往后排除即可 如果有 非主属性推出主属性 (主键) 即不满足第二范式 (挎号组合) 不需要看的-
第三题不看了 !!
![在这里插入图片描述](https://img-blog.csdnimg.cn/ed2e03521633406e8151c92210931ef3.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/80cebdcfdbbd4f43ba4a44111253d0f4.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/3e3efdf867f44e7b84a080081749b5fd.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/1eccc45c4a0549ac8a75cba0f1e3172b.png)
### 关系分解
![在这里插入图片描述](https://img-blog.csdnimg.cn/91437cdda0a64377bef4a449c1b6f387.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/a895e746d2be41908130dc24c93be69f.png)
* **52题 选法 存在唯一性 即为主键 就是找不重复的 兄弟姐妹有多个 不符合 !**
![在这里插入图片描述](https://img-blog.csdnimg.cn/52d99e9b370f4cf899fc6be176395567.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/a5d4f6c646aa4e80b6489cedd0cce634.png)
* 下面这个题目 对比函数依赖F 就可以看出
![在这里插入图片描述](https://img-blog.csdnimg.cn/c13ccf82a7b044639af66727efadf8c4.png)
## 数据库设计
![在这里插入图片描述](https://img-blog.csdnimg.cn/5aa5464db3594b3fbc879d758b17bff0.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/c18619e67bba4bc6830520f71cd21033.png)
### 需求分析
![在这里插入图片描述](https://img-blog.csdnimg.cn/b0b1e44c3f7844659448e626261e2c0b.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/cfd00b36740646b4b44683ef2728cc4c.png)
### E-R图 (实体 - 联系 - 属性)
![在这里插入图片描述](https://img-blog.csdnimg.cn/76d883c8f7c4470cafc7375cb4b78071.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/bcd8b9cb70264377bf8ca78ac26155bd.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/91736cc931d746149bea435fb3c7119e.png)
* 椭圆 里面属性如果有下划线的话 那么该属性为主键
![在这里插入图片描述](https://img-blog.csdnimg.cn/7ae9867376424b3980d9f7f150ed6e1d.png)
### 习题
![在这里插入图片描述](https://img-blog.csdnimg.cn/ea31e50727ba4565accd96f49f1a7637.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/dfbb1045bd644e0c955d0ea3c011b890.png)
### 逻辑结构设计
![在这里插入图片描述](https://img-blog.csdnimg.cn/63a9a3f67e044c37bfe7e53af05f4eb1.png)
#### 一对多转换
* 一对一转换就是把联系对应的属性随便放到一个实体里面(注意联系本身不放),然后把另外的实体的主键也放到该实体里
![在这里插入图片描述](https://img-blog.csdnimg.cn/900d6b69c84346c295ddaa284c22f74e.png)
#### 一对多装换
* 一对多转换就是把联系对应的属性放到多方实体类中(注意联系本身不放),并且把其他实体的主键也放到该多方实体类中
![在这里插入图片描述](https://img-blog.csdnimg.cn/ea42e6e49df449f18ed1b3735762776a.png)
#### 多对多转换
m to m: 把联系单独作为一个新的关系,把对应联系的实体的主键的组合作为这个新关系的主键
![](https://img-blog.csdnimg.cn/1f07feec5eb443709bd7f22ec419be17.png)
#### 关系模式的规范化
![在这里插入图片描述](https://img-blog.csdnimg.cn/0c94556feb7c49f791d189a80f3f4b2d.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/f1728332423d4879a6cb10382797f5d4.png)
## 控制功能
### 事务管理
![在这里插入图片描述](https://img-blog.csdnimg.cn/3ed1fb3682494efeaf10b09ba2fa940a.png)
### 数据库的备份与恢复
![在这里插入图片描述](https://img-blog.csdnimg.cn/6bd0198d428c405c99ce4b66d72e0344.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/55cbc057c2a24e129803d23eeb94bc2d.png)
![img](https://img-blog.csdnimg.cn/img_convert/6b25fda2166105086f4236f3357e8802.png)
![img](https://img-blog.csdnimg.cn/img_convert/5659ba00885cc6c4b8670c7542159927.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
/6bd0198d428c405c99ce4b66d72e0344.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/55cbc057c2a24e129803d23eeb94bc2d.png)
[外链图片转存中...(img-0GCBYEsi-1715823938493)]
[外链图片转存中...(img-Ux6JMkSp-1715823938493)]
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**