数据库基础学习----基础概念篇1

(本文章只是充作本人学习笔记,如有侵权,请告知,将立即删除。如因此给版权人带来困扰,在此致以诚挚的歉意)

转载自:http://www.360doc.com/content/13/0418/21/11971201_279313765.shtml    收藏人:eskimo888 

一. 数据抽象:物理抽象、概念抽象、视图级抽象,内模式、模式、外模式

模型是对现实世界的抽象,在数据库技术中,我们用数据模型的概念描述数据库的结构和语义,对现实世界的数据进行抽象。从现实世界的信息到数据库存储的数据以及用户使用的数据是一个逐步抽象的过程,有如下四种:概念数据模型、逻辑数据模型、外部数据模型、和内部数据模型。

1、 概念模型

a)        定义:表达用户需求观点的数据全局逻辑结构的模型

b)        特点:

                        i.             概念模型表达了数据的整体逻辑结构,它是系统用户对整个应用项目涉及的数据的全面描述;

                      ii.             概念模型是从用户需求观点出发,对数据建模;

                     iii.             概念模型独立于硬件和软件;

                     iv.             概念模型是数据库设计人员与用户之间进行交流的工具。

c)        主要方法:概念模型主要采用的是实体联系(ER)模型,ER模型主要用ER图来表示。

d)        ER图:ER图中把研究的对象分成实体和联系两大类,用矩形表示实体类型,菱形表示联系类型,椭圆形表示属性,实体标识符用属性下的一根下划线表示。

e)        优点:

                        i.             简单,容易理解,真实地反应用户的需求;

                      ii.             是与计算机无关,用户容易接受。

2、 逻辑模型

a)        定义:表达计算机实现观点的DB全局逻辑结构的模型,选定DBMS后,根据选定的DBMS的特点从概念模型转换成逻辑模型。

b)        特点:

                        i.             逻辑模型表达了DB的整体逻辑结构,它是设计人员对整个应用项目数据库的全面描述;

                      ii.             逻辑模型是从数据库实现的观点出发,对数据建模;

                     iii.             逻辑模型独立于硬件,依赖于软件;

                     iv.             逻辑模型是数据库设计人员与应用程序员之间交流的工具。

c)        分类:

                        i.             层次模型(Hierarchical model)

1.        定义:用树形结构表示实体类型及实体间联系的数据模型。

2.        数据联系:指针

3.        数据结构:树结构

4.        优点:记录之间通过指针来实现,查询效率较高

5.        缺点:只能表示1:N联系;由于层次顺序的严格和复杂,引起数据的查询和更新操作很复杂,因此编写程序也很复杂

6.        代表:IMS

7.        盛行:20世纪70年代

                      ii.             网状模型(Network model)

1.        定义:用有向图结构表示实体类型及实体间联系的数据模型

2.        数据联系:指针

3.        数据结构:有向图结构

4.        优点:记录之间的联系通过指针实现,M:N也较容易实现,查询效率较高

5.        缺点:数据结构复杂和编程复杂

6.        代表:IDS,IMAGE/3000,IDMS,TOTAL

7.        盛行:20世纪70-80年代中期

                     iii.             关系模型(Relational Model)

1.        定义:用二维表结构表示实体类型及实体间联系的数据模型

2.        数据联系:通过二维表间的公共属性

3.        数据结构:二维表

4.        优点:记录之间的联系采用关键码实现,表格简单,用户易懂;用查询语句就可以实现对数据库操作,不设计存储结构和访问技术

5.        缺点:更复杂的数据结构,如多媒体数据、多维表格数据显得力不从心

6.        代表:Oracle,Sybase,DB2,SQL Server,Infomix

7.        盛行:20世纪80年代到现在

3、 外部模型

a)        定义:表达用户使用观点的DB局部逻辑结构的模型。根据业务的特点划分成若干业务单位,每个业务单位都有特定的约束和需求

b)        特点:

                        i.             外部模型是逻辑模型的一个逻辑子集;

                      ii.             外部模型独立于硬件,依赖于软件;

                     iii.             外部模型反映了用户使用数据库的观点。

c)        优点:

                        i.             简化了用户的观点;

                      ii.             有助于数据库的安全性保护;

                     iii.             外部模型是对概念模型的支持。

4、 内部模型

a)        定义:表达DB物理结构的模型。又称为物理模型,是数据库最底层的抽象,它描述数据在磁盘或磁带上的存储方式,存取设备和存取方法。

b)        特点:

                        i.             内部模型是与硬件和软件紧密相连的;

                      ii.             内部模型反映了数据库的底层实现细节。

5、 三层模式和两级映射

a)        三层模式的定义:在用户到数据库之间,DB的数据结构有三个层次外部模型、逻辑模型和内部模型,这个三个层次使用数据定义语言(Data Definition Language,DDL)定义以后就称为模式(Schema),即外模式逻辑模式内模式。数据库的数据结构描述有三个层次:

                        i.             外模式是用户与数据库系统的接口,是用户用到的那部分数据的描述

                      ii.             逻辑模式是数据库中全部数据的整体逻辑结构的描述

                     iii.             内模式是数据库在物理存储方面的描述。

b)        三层模式体系结构的特点:

                        i.             用户使用数据库的数据操纵语言(Data Manipulation Language,DML)语句对数据库进行操作,实际上是对外模式的外部记录进行操作;

                      ii.             逻辑模式必须不涉及到存储结构、访问技术等细节;

                     iii.             内模式并不涉及到物理设备的约束。

c)        两级映射的定义:由于三层模式的数据结构可能不一致,即记录类型、字段类型的命名和组成可能不一样,因此需要三层模式之间的映像来说明外部记录、逻辑记录、内部记录之间的对应性。三层模式之间存在两级映像:

                        i.             外模式/逻辑模式映像存在于外模式和逻辑模式之间,用于定义外模式和逻辑模式之间的对应性,这个映像一般放在外模式中描述

                      ii.             逻辑模式/内模式映像存在于逻辑模式和内模式之间,用于定义逻辑模式和内模式之间的对应性,这个映像一般放在内模式中描述

d)        飞

6、 数据抽象的过程(即数据库设计的过程)

a)        根据用户需求,设计数据库的概念模型<概念设计>

b)        根据转换规则,把概念模型转换成数据库的逻辑模型

c)        根据用户的业务特点,需根据逻辑模型设计不同的外部模型,给程序员使用,外部模型与逻辑模型之间的对应性称为映像<逻辑设计>


二. SQL语言包括数据定义、数据操纵(Data Manipulation),数据控制(Data Control)

数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index等

数据操纵:Select ,insert,update,delete,

数据控制:grant,revoke

三. SQL常用命令

CREATE TABLE Student(

ID NUMBER PRIMARY KEY,

NAME VARCHAR2(50) NOT NULL);//建表

CREATE VIEW view_name AS

Select * FROM Table_name;//建视图

Create UNIQUE INDEX index_name ON TableName(col_name);//建索引

INSERT INTO tablename {column1,column2,…} values(exp1,exp2,…);//插入

INSERT INTO Viewname {column1,column2,…} values(exp1,exp2,…);//插入视图实际影响表

UPDATE tablename SET name=’zang 3’ condition;//更新数据

DELETE FROM Tablename WHERE condition;//删除

GRANT (Select,delete,…) ON (对象) TO USER_NAME [WITH GRANT OPTION];//授权

REVOKE (权限表) ON(对象) FROM USER_NAME [WITH REVOKE OPTION] //撤权

列出工作人员及其领导的名字:

Select E.NAME, S.NAME FROM EMPLOYEE E S

WHERE E.SUPERName=S.Name

四. 视图:

什么是视图:

  视图(view):从一个或几个基本表中根据用户需要而做成一个虚表

  1:视图是虚表,它在存储时只存储视图的定义,而没有存储对应的数据

  2:视图只在刚刚打开的一瞬间,通过定义从基表中搜集数据,并展现给用户

视图与查询的区别:

  视图和查询都是用由sql语句组成,这是他们相同的地方,但是视图和查询有着本质区别:

  它们的区别在于:

  1:存储上的区别:视图存储为数据库设计的一部分,而查询则不是.

  2:更新限制的要求不一样

  要注意:因为视图来自于表,所以通过视图可以间接对表进行更新,我们也可以通过update语句对表进行更新,但是对视图和查询更新限制是不同的,以下我们会知道虽然通过视图可以间接更新表但是有很多限制.

  3:排序结果:通过sql语句,可以对一个表进行排序,而视图则不行。比如:创建一个含有order by子句的视图,看一下可以成功吗?

视图的优点:

  为什么有了表还要引入视图呢?这是因为视图具有以下几个优点:

  1:能分割数据,简化观点。可以通过select和where来定义视图,从而可以分割数据基表中某些对于用户不关心的数据,使用户把注意力集中到所关心的数据列.进一步简化浏览数据工作

  2:为数据提供一定的逻辑独立性。 如果为某一个基表定义一个视图,即使以后基本表的内容的发生改变了也不会影响“视图定义”所得到的数据

  3:提供自动的安全保护功能。 视图能像基本表一样授予或撤消访问许可权

  4:视图可以间接对表进行更新,因此视图的更新就是表的更新

视图的创建和管理

  视图的创建

  1:通过sql语句

  格式:create view 视图名 as select 语句

   试一试:分别创建关于一个表或多个表的视图[因为视图可以来自于多表]

  2:通过企业管理器  

   说明:

  1:在完成视图的创立之后,就可以像使用基本表一样来使用视图

  2:在创建视图时,并非所有的select子查询都可用,如:compute和compute by,order by[除非与top一起连用] 

  3:但在查询时,依然都可以用在创建时禁用的select子查询

  4:在视图创建时,必须为没有标题列指定标题[思考:能否不用select语句来创建一个视图]
  视图的删除:

  1:通过sql语句:drop view 视图名

  2:通过企业管理器

  说明:与删除表不同的是,删除视图后只是删除了视图了定义,并没有删除表中的数据.[查看相关性]
  修改视图的定义

  1:通过企业管理器

  2:通过sql语句:

  格式:alter view 视图名 as 新的select语句

  浏览视图信息 sp_helptext 视图名 [查看视图创建的语句]

如何通过视图修改基本表的数据.

  A:在视图上使用insert语句

  通过视图插入数据与直接在表中插入数据一样,但视图毕竟不是基本表.因此在进行数据插入时还是有一定的限制

  1:如果视图上没有包括基本表中属性为not null[不能为空]的列,那么插入操作会因为那些列是null值而失败.

  2:如果某些列因为某些规则或约束的限制而不能直接接受从视图插入的列时,插入会失败

  3:如果在视图中包含了使用统计函数的结果,或是包含计算列,则插入操作会失败

  4:不能在使用了distinct语句的视图中插入值

  5:不能在使用了group by语句的视图中插入值

1

 

数据库视图介绍(二)

  B:使用update更新视图中的数据

  1:更新视图与更新表格一样,但是在视图中使用了多个基本表连接的情况下,每次更新操作只能更新来自基本表的一个数据列

  例如:创建以下视图:

create view del asselect 职工号,姓名,部门名称,负责人 from work1,部门where work1.部门编号=部门.部门编号

  如果再执行下面的语句时:

update del set 职工号=\'001\',部门名称=\'wenda\' where 职工号=\'01\'[出现错误]

  只能够改成:

update del set 职工号=\'001\' where 职工号=\'01\' update del set 部门名称=\'wenda\' where 职工号=\'01\'

  2:不能在使用了distinct语句的视图中更新值

  3:不能在使用了group by语句的视图中更新值
  C:使用delete删除视图中数据.

  通过视图删除数据最终体现为从基本表中删除数据

  格式:delete 视图名 [where 条件]

  说明:当视图由两个以上的基表构成时,不允许删除视图的数据

  例如:建一个视图kk

create view kk asselect 职工号,姓名,性别,部门名称 from work1,部门 where work1.部门编号=部门.部门编号 [试着去删除]

  使用with check option的视图

  如果不了解视图定义内容,则常常会发生向视图中输入不符合视图定义的数据的情况.

  比如:

create view xm asselect * from work where 性别=\'男\'

  完全可以插入insert xm values(\'001\',\'女\',23,\'2400\'....)

  尽管从意义上来说是不合理的,但是上述语句是正确的.为了防止这种情况的发生,可以使用with check option子句来对插入的或更改的数据进行限制.

  比如:

create view xm asselect * from work where 性别=\'男\' with check option

  使用schemabinding的视图[使用绑定到构架]

  我们知道视图是依赖于表,如果在一个表中创建一个视图,今后如果这个表被删除了,则这个视图将不可再用了.为了防止用户删除一个有视图在引用的表,可以在创建视图的时候加上schemabinding关键字.

  比如:

create view 基本工资 with SCHEMABINDINGas select 姓名,性别,基本工资 from dbo.work

  说明:

  1:不能使用“*”来创建此类型的视图

  2:创建此类型的视图时,一定要加上dbo.表名.

  3:如果在某个表中定义了此类视图,则用户将不能对表的结构进行修改,否则会删除这些绑定

  4:如果用户对表的结构进行列改名,则会删除绑定而且视图不可用.

  5:如果用户对表的结构进行列的类型或者大小修改,则会删除绑定但视图可用,此时用户可以删除视图所引用的表.
  使用with encryption对视图进行加密

  为了保护创建视图定义的原代码,可以对视图进行加密.

  比如:

create view kk with encryptionas select * from work where 职称=\'经理\'

  用sp_helptext来查看一下.或用企业管理器查看一下.

  说明:如果应用此项用户将无法设计视图

使用视图加强数据的安全

  一般通过使用视图共有三种途径加强数据的安全性 

  A:对不同用户授予不同的使用权.

  B:通过使用select子句限制用户对某些底层基表的列的访问

  C:通过使用where子句限制用户对某些底层基表的行的访问, 对不同用户授予不同的权限


五. 完整性约束:实体完整性、参照完整性、用户定义完整性

数据完整性约束:

为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确、有效、相容。
1 数据的完整性
约束是用来确保数据的准确性和一致性。数据的完整性就是对数据的准确性和一致性的一种保证。
数据完整性(Data Integrity)是指数据的精确(Accuracy)和可靠性(Reliability)。
分为以下四类:
1) 实体完整性:规定表的每一行在表中是惟一的实体。
2) 域完整性:是指表中的列必须满足某种特定的 数据类型约束,其中约束又包括取值范围、精度等规定。
3) 参照完整性:是指两个表的 主关键字和外关键字的数据应一致,保证了表之间的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。
4) 用户定义的完整性:不同的 关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件,它反映某一具体应用必须满足的语义要求。
2 完整性约束的类型:
可分为三种类型:与表有关的约束、域(Domain)约束、断言(Assertion)
1) 与表有关的约束:是表中定义的一种约束。可在列定义时定义该约束,此时称为列约束,也可以在表定义时定义约束,此时称为表约束。
2) 域(Domain)约束:在域定义中被定义的一种约束,它与在特定域中定义的任何列都有关系。
3) 断言(Assertion):在断言定义时定义的一种约束,它可以与一个或多个表进行关联。
一、 与表有关的约束:包括列约束(表约束+NOT NULL)和表约束(PRIMARY KEY、foreign key、check、UNIQUE) 。
(1) not null(非空)约束: 只用于定义列约束。
语法如下:
Colunm_name datatype | domain not null
实例:
create table Employee
(
emp_id int not null,
emp_name varchar(10) not null,
address varchar(40) ,
)
创建之后,如果往表Employee表中非空约束中插入 空值,insert into Employee values(1,null,'neimeng')将会出错。如下:
Msg 515, Level 16, State 2, Line 1
Cannot insert the value NULL into column 'emp_name', table 'Student.dbo.Employee';
column does not allow nulls. INSERT fails.
The statement has been terminated.
(2) unique(惟一)约束:用于指明创建惟一约束的列上的取值必须惟一。
语法如下:
Colunm_name datatype | domain unique
实例:
create table EmployeeInfo
(
emp_id int not null,
emp_name varchar(10) not null,
phone char(11) unique,
address varchar(40) ,
)
如下往EmployeeInfo插入数据时,如果两条记录的phone不惟一,
insert into EmployeeInfo values(1,'abcdwxc','neimeng','13612345678')
insert into EmployeeInfo values(2,'terry','neimeng','13612345678')
则会出现错误。如下:
(1 row(s) affected)
Msg 2627, Level 14, State 1, Line 2
Violation of UNIQUE KEY constraint 'UQ__EmployeeInfo__060DEAE8'. Cannot insert duplicate key in object 'dbo.EmployeeInfo'.
The statement has been terminated.
除了在定义列时添加unique约束外,也可以将unique约束作为表约束添加。即把它作为表定义的元素。
语法如下:
[CONSTRAINT constraint_name] unique (column1,column2,.....)
实例:
create table EmployeeInfo
(
emp_id int not null,
emp_name varchar(10) not null,
phone char(11)
address varchar(40) ,
constraint p_uniq unique(phone)
)
(3) primary key(主键)约束:用于定义基本表的主键,起惟一标识作用,其值不能为null,也不能重复,以此来保证实体的完整性。
语法如下:
Colunm_name datatype | domain primary key
实例:
drop table EmployeeInfo
create table EmployeeInfo
(
emp_id int primary key,
emp_name varchar(10) not null,
phone char(11),
address varchar(40) ,
)
如果向EmployeeInfo表插入的emp_id重复了或者插入时emp_id为null值,则会出错。
可以在创建表时,创建 主键约束,也可创建表完成以后,创建主键,例如:
alter table EmployeeInfo
add constraint e_prim primary key(emp_id)
primary key 与 unique的区别:
1.在一个表中,只能定义一个primary key约束,但可定义多个unique约束。
2.对于指定为primary key的一个列或多个列的组合,其中任何一个列都不能出现 空值,而对于unique所约束的惟一键,则允许为null,只是null值最多有一个。
(4) foreign key(外键)约束:定义了一个表中数据与另一个表中的数据的联系。
foreign key约束指定某一个列或一组列作为外部键,其中包含外部键的表称为子表,包含外部键所引用的主键的表称为父表。系统保证,表在外部键上的取值要么是父表中某一主键,要么取 空值,以此保证两个表之间的连接,确保了实体的参照完整性。
语法如下:
Colunm_name datetype | domain references table_name(column)
[match full|partial|simple] //注:sqlserver不支持。
[referential triggered action]
说明:table_name为父表的表名,column为父表中与 外键对应的主键值。
[match full|partial|simple]为可选子句,用于设置如何处理 外键中的null值。
[referential triggered action]也为可选子句,用于设置更新、删除 外键列时的操作准则。
可以为表的一列或多列创建foreign key 约束,如果为多列创建 foreign key约束,将分别与主表中的相应主键相对应。
实例:
create table EmployeeInfo
(
emp_id int primary key,
emp_name varchar(10) not null,
account char(4) primary key,
phone char(11)
address varchar(40) ,
)
create table Emp_Sal
(
emp_id int , account CHAR(4) ,salary DECIMAL(5,1),
CONSTRAINT E_SAL FOREIGN KEY(emp_id,account) REFERENCES EmployeeInfo (emp_id,account))
)
也可以表创建以后添加到表上。如下:
create table Emp_Sal
(
emp_id int ,emp_name varchar(10) not null, account CHAR(4) ,salary DECIMAL(5,1),
)
alter table Emp_Sal
add CONSTRAINT E_SAL FOREIGN KEY(emp_id,account) REFERENCES EmployeeInfo (emp_id,account)
该 外键的作用:确保表Emp_Sal的每个emp_id列都对应表EmployeeInfo中相应的emp_id。此时,表EmployeeInfo为父表,而表Emp_Sal为子表。子表的emp_id列参照父表的emp_id列。
如果想在子表的emp_id列插入一个值,首先父表的emp_id列必须存在,否则会插入失败。如果想从父表的emp_id删除一个值,则必须无删除子表emp_id列中所有与之对应的值。
(注:foreign key 列上的取值可以取null)。
潜在问题:由于foreign key列上可以取空值,DBMS将跳过对foreign key约束的检查,因此如果插入Emp_Sal如下数据:
insert into Emp_Sal values(6,null,null) 则插入到Emp_Sal中,但其主表的相关列却不存在。
解决办法:
(1)将联合 外键的列添加not null约束,但这限制了用户的部分操作。
(2)采用Match子句。(sqlserver不支持).
更新、删除操作规则:
在删除或更新有primary key值的行,且该值与子表的foreign key中一个或多个值相匹配时,会引起匹配完整性的丧失。
在foreign key创建语法中,提供了可选的on update和on delete子句,也就是上面的[referential triggered action]。可用此保持引用完整性。
on update / on delete
no action|cascade|restrict|set null|set default
no action:更新或删除父表中的数据时,如果会使子表中的 外键违反引用完整性,该动作将被禁止执行。不过在某些条件下,可出现暂时的,但在数据的最终状态中,不能违反 外键的引用完整性。
cascade: 当父表中被引用列的数据被更新或删除时,子表中的相应的数据也被更新或删除。
restrict:与no action规则基本相同,只是引用列中的数据永远不能违反 外键的引用完整性,暂时的也不行。
set null:当父表数据被更新或删除时,子表中的相应数据被设置成Null值,前提是子表中的相应列允许null值。
set default:当父表数据被更新或删除时,子表中的数据被设置成默认值。前提是子表中的相应列设置有默认值。
(5) check(校验)约束:用来检查字段值所允许的范围。DBMS每当执行delete,insert或update语句时,都对这个约束过滤。如果为true,则执行。否则,取消执行并提示错误。
列定义语法如下:
Column datetype | domain check(search condition)
表约束语法如下:
constraint constraint_name check(search condition)
实例如下:
create table Emp_Sal
(
emp_id int , account CHAR(4) ,salary DECIMAL(5,1),
constraint validsal check(salary >=1000 and salary<=10000)
)
如果此时,再往表中插入如下语句则会出错:(因为不满足salary大于等于1000的约束。)
insert into Emp_Sal values(8,'12324343',800.0)
二、 域约束:(sqlserver 不支持)
语法如下:
create domain domain_name as data type
[default default_value]
[constraint constraint_name] check(value condition expression)
例如:
create domain valid_no as int
constraint constraint_no check(value between 100 and 999)
然后创建表时,使用valid_no域。
create table TestDomain
(
emp_id valid_no,
emp_name varchar(10),
)
三、断言约束:不必与特定的列绑定,可以理解为能应用于多个表的 check约束,因此必须在表定义之外独立创建断言。
语法如下:
create assertion constraint_name
check search condition
例如:
create assertion name
check (Emp_Sal.emp_id in(select emp_id from EmployeeInfo where emp_name is not null)
添加断言后,每当试图添加或修改Emp_Sal表中的数据时,就对断言中的搜索条件求值,如果为false,则取消执行,给出提示

六. 第三范式:

1NF:每个属性是不可分的。

2NF:若关系R是1NF,且每个非主属性都完全函数依赖于R的键。例SLC(SID#, CourceID#, SNAME,Grade),则不是2NF;

 3NF:若R是2NF,且它的任何非键属性都不传递依赖于任何候选键。


你可能感兴趣的:(数据库学习笔记)