数据库的一些理论概念

来源:互联网 发布:淘宝高级搜索 编辑:程序博客网 时间:2024/05/16 09:41

(01)oracle服务器由哪二部份组成?
两个主要的组成部分是:数据库和实例
Oracle数据库用于存储和检索信息,是数据的集合。包括逻辑结构和物理结构。
Oracle实例是指数据库服务器的内存及相关处理程序。

(02)SQL92/99标准有哪四大分类?
(A)DML(数据操纵语言):select,insert,update,delete  
(B)DDL(数据定义语言):create table,alter table,drop table,truncate table 
(C)DCL(数据控制语言):grant 权限 to scott,revoke 权限 from scott 
(D)TCL(事务控制语言):commit,rollback,rollback to savepoint

(03)SQL语句和SQL PLUS语句的区别:

SQL语句的特点
1)是SQL92/99的ANSI官方标准,只要按照该标准来写,在任何的关系型数据库中都可以直接执行
2)SQL语句的关健字不能简写,例如:select,where,from
3)大小写不敏感,提倡大写
4)能够对表数据进行增删改查操作
5)必须以分号结束
6)通常称做语句

SQLPLUS命令的特点
1)是oracle自带的一款工具,在该工具中执行的命令叫SQLPLUS命令
2)SQLPLUS工具的命令中的关健字可以简写,也可以不简写,例如:col ename for a10;
3)大小写不敏感,提倡大写
4)不能够对表数据进行增删改查操作,只能完成显示格式控制,例如:设置显示列宽,清屏,记录执行结果
5)可以不用分号结束,也可以用分号结束,个人提倡不管SQL或SQLPLUS,都以分号结束
6)通常称做命令,是SQLPLUS工具中的命令
注意:SQLPLUS命令是SQLPLUS工具中特有的语句

单引号出现的地方如下:
1)字符串型,例如:'hello' || ' world'
2)日期型,例如'25-4月-15'

双引号出现的地方如下:
1)列别名,例如:sal*12 "年 薪",或 sal*12 年薪,个人提倡用""双引号作列别名

1)列别名,例如:sal*12 "年 薪",或 sal*12 年薪,个人提倡用""双引号作列别名

(04)数据库设计原则

【1】数据库设计唯一原则:数据库表的关联查询越少越好,SQL语句的复杂度越低越好。
【2】为减少数据查询的麻烦,可以允许一定的冗余。
【3】数据完整性=可靠性+准确性
【4】范式原则(减少数据库中数据冗余的过程)

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。

一般说来,数据库只需满足第三范式(3NF)就行了。
第一范式(1NF):无重复的域。数据库的每一列都是不可分割的。
第二范式(2NF):在第一范式的基础上属性完全依赖于主键;在1NF基础上消除非主属性对主码的部分函数依赖。
第三范式(3NF):任何非主属性不得传递依赖于主属性;在2NF基础上消除传递依赖。
巴斯-科德范式(BCNF):在3NF基础上消除对主码子集的依赖
第四范式(4NF):
第五范式(5NF,又称完美范式):

【范式应用实例编辑】

下面以一个学校的学生系统为例分析说明,这几个范式的应用。
①第一范式(1NF)

数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。
首先我们确定一下要设计的内容包括那些。学号、学生姓名、年龄、性别、课程名称、课程学分、系别、学科成绩,系办地址、系办电话等信息。为了简单我们暂时只考虑这些字段信息。我们对于这些信息,所关心的问题有如下几个方面。
学生有那些基本信息?
学生选了那些课,成绩是什么?
每个课的学分是多少?
学生属于那个系,系的基本信息是什么?
-------------------------------------------------

②第二范式(2NF)
首先我们考虑,把所有这些信息放到一个表中(学号,学生姓名、年龄、性别、课程、课程学分、系别、学科成绩,系办地址、系办电话)下面存在如下的依赖关系。
(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)
问题分析
因此不满足第二范式的要求,会产生如下问题:
数据冗余:同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。
更新异常:
1)若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。
2)假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。
删除异常 :假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。
解决方案
把选课关系表SelectCourse改为如下三个表:
学生:Student(学号,姓名,年龄,性别,系别,系办地址、系办电话);
课程:Course(课程名称,学分);
选课关系:SelectCourse(学号,课程名称,成绩)。
-------------------------------------------------

③第三范式(3NF)
接着看上面的学生表Student(学号,姓名,年龄,性别,系别,系办地址、系办电话),关键字为单一关键字"学号",因为存在如下决定关系:
(学号)→ (姓名,年龄,性别,系别,系办地址、系办电话
但是还存在下面的决定关系:
(学号) → (系别)→(系办地点,系办电话)
即存在非关键字段"系办地点"、"系办电话"对关键字段"学号"的传递函数依赖。
它也会存在数据冗余、更新异常、插入异常和删除异常的情况。(数据的更新,删除异常这里就不分析了,可以参照2.1.1进行分析)
根据第三范式把学生关系表分为如下两个表就可以满足第三范式了:
学生:(学号,姓名,年龄,性别,系别);
系别:(系别,系办地址、系办电话)。
上面的数据库表就是符合I,Ⅱ,Ⅲ范式的,消除了数据冗余、更新异常、插入异常和删除异常。

1 0