数据库原理
什么是数据库?
数据库是一个以某种有组织的方式存储的数据集合。也就是:保存有组织数据的容器(一个文件或一组文件)
为什么我们需要数据库?
毫无疑问,数据库是用来存储数据的。我们对excel肯定不会陌生,excel也是用来存储数据。那既然有excel这样非常好用的软件了,为什么需要数据库呢??
excel存储的数据量太少了。由于我们网络发展,excel的存储量远远不能支撑我们的需求。
excel数据无法多人共享。excel只是一个单一的文件,只能是当前的用户使用并修改。
数据安全性。对excle数据的修改是很随意的。
数据库就解决了上面的问题,并且数据库以特殊的机制管理数据文件,对数据有极高的读写速度,大大超过了操作系统对常规文件的读写速度。
数据库系统的组成
数据库系统由三个层次组成:
数据库(dataBase)
存放数据的仓库,按照一定的格式(有组织的方式)进行储存
数据库管理系统(dataBase Manager System)
建立、管理、维护数据库的系统软件
数据库应用系统(dataBase Application System)
使用到数据库技术的应用软件
数据描述与数据模型
理解数据描述
我们在现实生活中描述一个事物是非常简单的,看到“一棵树”,就说是“一棵树”。
但怎么把“一棵树“在计算机描述起来呢??计算机只识别0和1,”一棵树“是不能直接存储到计算机上的!
于是乎,我们就把”一棵树“抽象出来,形成信息世界的概念模型。然后将概念模型的形式化成是DBMS支持的数据模型,存储在计算机中。
简单来说:数据描述就是将现实世界中的实物抽象出来,形成概念模型。把概念模型的形式转换成是DBMS支持的类型,然后存储到计算机中!
理解数据模型
数据模型主要用来描述数据!上边已经说了,当我们想在计算机上存储现实事物的数据时,需要先抽象成概念模型。将概念模型转换成DBMS支持的数据模型,就可以把事物存储到计算机中!
数据模型一般由三个部分组成:
数据结构(对象与对象之间的关系)
数据操作(增删改查)
完整性约束(限定数据是有一定规则的,比如:年龄不能为负数)
数据模型也经历了一个发展阶段:
①:层次模型,是一种树型(层次)结构来组织数据的数据模型。
优点:
节点之间联系可以通过指针来实现,查询效率高
√结构清晰,容易理解
缺点:
对于非层次结构的数据,表示起来非常麻烦,不直观!
②:网状模型, 是用有向图结构来组织数据的数据模型
优点:
非常灵活,更能直接地描述现实世界的事物
缺点:
结构复杂,非常难维护
③:关系模型,是一种用二维表格结构表示数据及数据之间联系的数据模型。
关系模型是我们现在用得最多的数据模型。
优点:
数据结构简单、清晰。无论实体还是实体集,都用相对应的二维表来表示!
有严格的数学理论根据。各种关系运算(后面会讲到)
缺点:
查询效率比非关系模型查,尤其是多表查询的时候!
术语(基本概念)
我们对照着课程关系表来讲解吧:
实体(Entity)
客观存在并可相互区别的事物称之为实体。可以看成是Java类
例子:(课程关系表)就是一个实体。
属性(Attribute)
实体所具有的某一特性称之为属性。可以看成是Java类的成员变量。属性在数据库中又称为字段(或者是列)
例子:(课程名),(课程号)、(学时)就是属性名。
元组
除含有属性名所在的行之外的其他行称之为元组。
下面的每一行数据都称之为元组
(C401001 数据结构 70)
(C401002 操作系统 80)
(C402001 计算机原理 60)
码(Key)
码也被称作是关键字。它可以唯一标识一个实体。
候选码和主码:
候选码:如果一组属性集能唯一地标识一个关系中的元组而又不含有多余的属性,则称该属性集为该关系的候选码 。(候选码可能不止有一个)
主码:用户选定的那个候选键称为主键
例子:邮寄地址(城市名,街道名,邮政编码,单位名,收件人)
它有两个候选键:{城市名,街道名} 和 {街道名,邮政编码}
如果我选取{城市名,街道名}作为唯一标识实体的属性,那么{城市名,街道名} 就是主码
关系模式
关系名和其属性集合的组合称之为关系模式。
关系模式例子:课程关系表(课程号,课程名,学时)
提示:关系模型就是关系模式组成的集合
域
关系模型要求元组的每一个分量都是原子性的,也就是说,它必须属于某种元素类型,如Integer、String等等,不能是列,集合,记录,数组!
域就代表着该元组中每个分量的类型,从上面的图我们可以看出,它的域是这样的:课程号:string,课程名:string,学时:int
数据库体系内部结构
数据库的体系内部结构我们可以分为三层:
外模式
逻辑模式
内模式
三级模式的位置:
三级模式的作用:
逻辑模式
逻辑模式是对数据库全部数据的整体逻辑结构的描述。
例子:现在我有一个数据库,操作权限、角色、用户之间的关系
于是有了以下的关系模式
权限关系(权限编号,权限名称,权限描述)
角色关系(角色编号,角色名称,角色描述)
用户关系(用户编号,用户名称,用户密码)
在数据库中所有关系模式的集合就组成了逻辑模式!
外模式
外模式是对数据库用户能看见和使用的局部数据逻辑结构的描述,是与某一应用有关的数据的逻辑表示。
外模式是可以有多个的,外模式是用户和DBAS的接口,是对局部逻辑结构的描述!
当用户应用程序只需要显示用户名称和密码时:
用户关系(用户名称,用户密码)
在数据库中操作局部逻辑结构就称作为外模式!
内模式
内模式是对数据库表物理存储结构的描述。它定义了数据的内部记录类型、记录寻址技术、索引和文件的组织方式及数据控制方面的内容
DB内部体系结构的两级映像
两级映像分别是:
外模式和逻辑模式的映像
逻辑模式和内模式的映像
提出两级映射的概念有什么用呢?为什么需要有这两级映像呢??
当数据库的逻辑模式结构因某种原因修改时,只要没有改变逻辑模式中与外模式定义有关的属性及与其关系模式名的隶属关系,就可使外模式保持不变,从而不需修改应用程序。
当数据库的内模式由于某种原因要修改时,可通过对逻辑模式与内模式之间的映象的修改,使逻辑模式尽可能地保持不变,实现内模式的改变尽可能地不修改应用程序。
也就说:在改变内部结构的时候,只要不会触及外部的数据时,外部的数据并不需要做改变。两级映像概念的提出也就是程序中耦合的问题!
为什么我们要学习数据库关系运算?
学习和理解关系运算的机理,对于理解关系数据库中的数据查询机制有十分重要的意义。
我们可能知道多表查询的时候要消除重复多余的数据,那重复多余的数据怎么产生的呢??WHERE字句又是怎么筛选数据的呢??这些问题我们在关系运算中可以找到答案的。
学习数据库的关系运算,会让我们明白SQL语句是怎么执行的,是通过什么手段让我们得到想要的结果。
学习大纲
笛卡尔积
什么是笛卡尔积?
笛卡尔积简单来说就是两个集合相乘的结果。
为什么查询数据库会出现笛卡尔积
前面的博文已经说了,关系模型是关系模式的集合。
数据库中的两张表就相当于两个集合,当我们使用SELECT语句查询数据的时候,DBMS内部就是以集合相乘的运算得出结果
笛卡尔积的产生过程
我们发现:笛卡尔积的基数是每个集合的元组相乘!
得出来的数据内容是难以符合现实中的实际情况的
为了更好地看见效果,我都会以实际的SQL语句来看效果,然后说明问题的。
emp表的记录有14条:
dept表有4条记录:
我们来看看SMITH,在emp表中,他只在20部门。
但在两张表查询后,10、20、30、40部门他都在了!!我们再观察56条数据,发现每个人都有4个部门,这样的数据是不合理的!!
再回到初衷,我们查询两张表的目的是什么??在查询员工信息的同时,也能知道员工的部门名称是什么!!!所以,我们查询的记录数是不应该有56条这么多的。。我们查询的记录数应该是员工表的记录数,也就是14条而已!
我们再来分析:emp表中有deptno字段,dept表中也有deptno字段!而且发现,emp表中的deptno字段的取值范围是由dept表中deptno字段来决定的!!!
所以,我们可以使用等值连接(emp.deptno=dept.deptno)来消除笛卡尔积,这样就达到我们的目的了!
基于传统集合理论的关系运算
在Oracle上,操作集合的语法提供了4个关键字:
UNION(并集,重复的元组不显示)
UNION ALL(并集,重复的元组也会显示)
MINUS(差集)
INTERSECT(交集)
并
显示查询结果的全部信息,消除重复的元组
查询所有办事员和经理的信息
SELECT *
FROM emp
WHERE job = 'MANAGER'
UNION
SELECT *
FROM emp
WHERE job = 'CLERK';
注意:使用UNION并操作,比使用关键字OR的性能要好!
交
返回查询结果相同的部分
查询10部门的信息
SELECT *
FROM dept
INTERSECT
SELECT *
FROM dept
WHERE deptno = 10;
(全部部门和部门10只有部门10是相同的,所以最后返回的是部门10的结果)
差
返回的查询结果是
SELECT *
FROM dept
MINUS
SELECT *
FROM dept
WHERE deptno = 10;
关系代数特有的关系运算
投影
投影的运算过程:
首先按照j1,j2,…,jk的顺序,从关系R 中取出列序号为j1,j2,…,jk(或属性名序列为Aj1,Aj2,…,Ajk )的k 列,然后除去结果中的重复元组,构成一个以Aj1,Aj2,…,Ajk为属性顺序的k 目关系。
简单来说:取出一个查询结果中某某列,并消除重复的数据,这就是投影!
投影是从列的角度进行的运算
投影的下标可是列序号,也可是列属性名
查询出所有部门的编号
SELECT deptno
FROM dept;
查询时的过程:先查询得出dept表的所有结果,再通过投影运算只提取"deptno"的列数据,如果 SELECT 后边跟的是"*",那么就是投影全部数据!
选择
使用比较运算符、逻辑运算符,挑出满足条件的元组,运算出结果!
查询出工资大于2000的员工的姓名
SELECT ename
FROM emp
WHERE sal > 2000;
过程:首先查询出emp表的所有结果,使用选择运算筛选得出工资大于2000的结果,最后使用投影运算得出工资大于2000员工的名字!
除运算
除运算的实际应用我还没想明白~~~如果有朋友知道除运算能够用在数据库的哪处,请告诉我一声哈。。
我们也了解一下除运算的过程吧:关系R有ABCD,关系S有CD,首先投影出AB(因为S有CD),再用投影出来AB的结果和关系S做笛卡尔积运算。如果做的笛卡尔积运算记录在R关系中找到相对应的记录,那么投影的AB就是结果了!
连接运算
连接运算其实就在笛卡尔积运算的基础上限定了条件(某列大于、小于、等于某列),只匹配和条件相符合的,从而得出结果!
自然连接
自然连接就是一种特殊的连接运算,它限定的条件是【某列等于某列】。自然连接我们经常使用到。消除笛卡尔积其实就是自然连接了!
SELECT *
FROM emp, dept
WHERE dept.deptno = emp.deptno;
设定将dept表的deptno列和emp的deptno列为相同【这就是自然连接】
如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y