第一部分 数据库基础知识
一、基本概念[阅读材料]
数据(Data)
所谓数据就是描述事物的符号。在我们的日常生活中,数据无所不在,数字、文字、图表、图象、声音等都是数据。人们通过数据来认识世界,交流信息。
数据库(DB 即Database)
数据库,顾名思义,就是数据存放的地方。在计算机中,数据库是数据和数据库对象的集合。所谓数据库对象是指表(Table)、视图(View)、存储过程(Stored Procedure)、触发器(Trigger)等。这些数据库对象将在以后介绍。
数据库管理系统(DBMS)
数据库管理系统是用于管理数据的计算机软件。数据库管理系统使用户能方便地定义和操纵数据,维护数据的安全性和完整性,以及进行多用户下的并发控制和恢复数据库。
数据库系统(DBS 即Database System)
数据库系统狭义地讲是由数据库、数据库管理系统和用户构成,广义地讲是由计算机硬件、操作系统、数据库管理系统以及在它支持下建立起来的数据库、应用程序、用户和维护人员组成的一个整体。
二、关系数据库[阅读材料]
数据库这一概念提出后,先后出现了几种数据模型。其中基本的数据模型有三种:层次模型系统、网络模型系统和关系模型系统。60年代末期提出的关系模型具有数据结构简单灵活、易学易懂且具有雄厚的数学基础等特点,从70年代开始流行,发展到现在已成为数据库的标准。目前广泛使用的数据库软件都是基于关系模型的关系数据库管理系统。
1、关系模型(RM 即Relational Model)
关系模型把世界看作是由实体(Entity)和联系(Relationship)构成的。
所谓实体就是指现实世界中具有区分与其它事物的特征或属性并与其它实体有联系的对象。在关系模型中实体通常是以表的形式来表现的。表的每一行描述实体的一个实例,表的每一列描述实体的一个特征或属性。
所谓联系就是指实体之间的关系,即实体之间的对应关系。联系可以分为三种:
一对一的联系。如:一个人只有一种性别,一个人→性别为一对一的联系;
一对多的联系.如:相同性别的人有许多个,性别→人为一对多的联系;
多对一的联系。如:很多人有同一个性别,人→性别为多对一的联系。
通过联系就可以用一个实体的信息来查找另一个实体的信息。
关系模型把所有的数据都组织到表中。表是由行和列组成的,行表示数据的记录,列表示记录中的域。表反映了现实世界中的事实和值。
2、关系数据库(RDB,即Relational Database)
所谓关系数据库就是基于关系模型的数据库。
关系数据库管理系统(RDBMS)
关系数据库管理系统就是管理关系数据库的计算机软件。
关键字(Key)
关键字是关系模型中的一个重要概念,它是逻辑结构,不是数据库的物理部分。
候选关键字(Candidate Key)
如果一个属性集能惟一地标识表的一行而又不含多余的属性,那么这个属性集称为候选关键字。
主关键字(Primary Key)
主关键字是被挑选出来,作表的行的惟一标识的侯选关键字。一个表只有一个主关键字。主关键字又可以称为主键。
公共关键字(Common Key)
在关系数据库中,关系之间的联系是通过相容或相同的属性或属性组来表示的。如果两个关系中具有相容或相同的属性或属性组,那么这个属性或属性组被称为这两个关系的公共关键字。
外关键字(Foreign Key)
如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外关键字。由此可见,外关键字表示了两个关系之间的联系。以另一个关系的外关键字作主关键字的表被称为主表,具有此外关键字的表被称为主表的从表。外关键字又称作外键。
三、常见数据库对象[阅读材料]
数据库对象是数据库的组成部分,常见的有以下几种:
1、表(Table)
数据库中的表与我们日常生活中使用的表格类似,它也是由行(Row)和列(Column)组成的。列由同类的信息组成,每列又称为一个字段,每列的标题称为字段名。行包括了若干列信息项。一行数据称为一个或一条记录,它表达有一定意义的信息组合。一个数据库表由一条或多条记录组成,没有记录的表称为空表。每个表中通常都有一个主关键字(主键),用于惟一地确定一条记录。
2、索引(Index)
索引是根据指定的数据库表列建立起来的顺序。它提供了快速访问数据的途径,并且可监督表的数据,使其索引所指向的列中的数据不重复。
3、视图(View)
视图看上去同表似乎一模一样,具有一组命名的字段和数据项,但它其实是一个虚拟的表,在数据库中并不实际存在。视图是由查询数据库表产生的,它限制了用户能看到和修改的数据。由此可见,视图可以用来控制用户对数据的访问,并能简化数据的显示,即通过视图只显示那些需要的数据信息。
4、缺省值(Default)
缺省值是在表中创建列或插入数据时,对没有指定具体值的列或列数据项赋予事先设定好的值。
5、规则(Rule)
规则是对数据库表中数据信息的限制。它限定的是表的列。例如限定出生日期字段的规则为“小于1990年”。
6、触发器(Trigger)
是一个用户定义的SQL事务命令的集合。当对一个表进行插入、更改、删除时,这组命令就会自动执行。例如,对部门表中的记录进行删除操作的触发器:当某个部门有员工(即在员工表的所属部门字段中含有该部门名)时,不能删除该部门。
7、存储过程(Stored Procedure)
存储过程是为完成特定的功能而汇集在一起的一组SQL程序语句,经编译后存储在数据库中的SQL程序。
8、用户(User)
用户是有权限访问数据库的人。
四、范式[阅读材料]
构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求,即满足不同的范式。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。
图 员工信息表
下面我们介绍第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。
1、第一范式(1NF)
在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中,表的每一行只包含一个实例的信息。例如,对于图中的员工信息表,不能将员工信息都放在一列中显示,也不能将其中的两列或多列在一列中显示;员工信息表的每一行只表示一个员工的信息,一个员工的信息在表中只出现一次。简而言之,第一范式就是无重复的列。
2、第二范式(2NF)
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。如图员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。这个惟一属性列被称为主关键字或主键、主码。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。
3、第三范式(3NF)
满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在图中的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。
五、ACCESS数据库[阅读材料]
Access 数据库管理系统是Microsoft Office套件的重要组成部分,可在Windows环境下运行。Access适用于小型商务活动,用以存贮和管理商务活动所需要的数据。Access不仅是一个数据库,而且它具有强大的数据管理功能,它可以方便地利用各种数据源,生成窗体(表单),查询,报表和应用程序等。
数据库是有结构的数据集合,它与一般的数据文件不同,(其中的数据是无结构的)是一串文字或数字流。数据库中的数据可以是文字、图象、声音等。
Microsoft Access是一种关系式数据库,关系式数据库由一系列表组成,表又由一系列行和列组成,每一行是一个记录,每一列是一个字段,每个字段有一个字段名,字段名在一个表中不能重复。表与表之间可以建立关系(或称关联,连接),以便查询相关联的信息。Access数据库以文件形式保存,文件的扩展名是MDB。
Access数据库由六种对象组成,它们是表、查询、窗体、报表、宏和模块。
表(Table) ——表是数据库的基本对象,是创建其他5种对象的基础。表由记录组成,记录由字段组成,表用来存贮数据库的数据,故又称数据表。
查询(Query)——查询可以按索引快速查找到需要的记录,按要求筛选记录并能连接若干个表的字段组成新表。
窗体(form)——窗体提供了一种方便的浏览、输入及更改数据的窗口。还可以创建子窗体显示相关联的表的内容。窗体也称表单。
报表(Report)——报表的功能是将数据库中的数据分类汇总,然后打印出来,以便分析。
宏(Macro)——宏相当于DOS中的批处理,用来自动执行一系列操作。Access列出了一些常用的操作供用户选择,使用起来十分方便。
模块(Module)——模块的功能与宏类似,但它定义的操作比宏更精细和复杂,用户可以根据自己的需要编写程序。模块使用Visual Basic编程
第二部分 用ASP实现网站数据库操作
一 、结构化查询语言(SQL)
SQL是英文(Structured Query Language)的缩写,意思为结构化查询语言。SQL语言的主要功能就是同各种数据库建立联系,进行沟通。按照ANSI(美国国家标准协会)的规定,SQL被作为关系型数据库管理系统的标准语言。SQL语句可以用来执行各种各样的操作,例如更新数据库中的数据,从数据库中提取数据等。目前,绝大多数流行的关系型数据库管理系统,如Oracle, Sybase, Microsoft SQL Server, Access等都采用了SQL语言标准。
1、查询记录(Select)
select 字段列表 from 表名 where 条件
例:select * from book where bname="西游记"
2、添加记录(Insert)
insert into 表名 (字段列表) values (值列表)
例:insert into book (bookno,bname) values ("1265","红楼梦")
insert into 成绩单副本 (姓名,学号,数学,英语) select 姓名,学号,数学^0.5*10,英语 from 成绩单 '追加
select * into 数学高手 from 成绩单 where 数学>=90 '加入新建表
3、修改记录(Update)
update 表名 set 字段1=值1,字段2=值2,…where 条件
例:update book set bookno="3535" where bname="西游记"
update 成绩单 set 数学=数学^0.5*10 where 姓名 like "王%"
4、删除记录(Delete)
delete from 表名 where 条件
例:delete from book where bookno="4583"
二、UDA(Microsoft Universal Data Access)[阅读材料]
UDA(Microsoft Universal Data Access,一致性数据存取)是微软开发的一组数据存取组件,借以处理网络上所有异质数据类型。
这些组件都打包在MDAC(Microsoft Data Access Compontent)中,该组件又包含ADO、DAO、RDO等组件。
UAD主要包含两大标准接口:
1、ODBC(Open Database Connectivity)是处理关系型、非关系型数据库的标准应用程序接口(API),它打包在DAO(Data Access Object)与RDO(Remote Data Object)组件中。
2、OLE-DB 是处理关系型、非关系型、非库数据的应用程序接口(API),它包含ODBC的功能,它打包在ADO(Active Data Object)组件中。包含Active Directory、MAPI(E-mail)、DBMS、ODBC Provider等。
三、在ASP中用ODBC连接数据库[阅读材料]
方式一:利用控制面板中设置的系统数据源。
1、设置系统数据源的方法(以Access数据库为例):打开控制面板中的ODBC数据源管理器,添加新的系统数据源;然后,选定Access驱动,单击完成;接着,命名数据源并选定数据库,确定即可。
2、在ASP中打开数据源,连接数据库的方法:
set adocon=Server.CreateObject ("ADODB.Connection")
adocon.open="数据源名"
方式二:将所需的ODBC Driver名称、数据库文件路径置于ADO Connection对象的连接字符串中。例:
set adocon=Server.CreateObject ("ADODB.Connection")
adocon.open="Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath ("/aspall/aspall.mdb")
四、在ASP中用OLE-DB连接数据库
Access OLE DB的连接方式:
'建立数据库联接的一个实例:
set adocon=server.CreateObject ("ADODB.Connection")
’打开数据库连接:
adocon.open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath ("/aspall/aspall.mdb")
若为Access 97数据库,请将"OLEDB.4.0"改为"OLEDB.3.5"。
五、连接对象(Connection)的方法
在ASP中,通过ODBC或OLE-DB连接数据库成功后,就建立了Connection对象(例如:adocon)。
Connection的方法:
Close 关闭对象(不代表删除对象),例:adocon.close
Open 打开对象,例:adocon.open
Execute执行指定的查询、SQL语句及存储过程(Stored Procedure):
无返回值形式,适用于修改数据库(insert、update、delete等):
connection.execute [CommandText, RecordsAffected, Options]
返回记录集(Recordset)形式,适用于保存SQL查询结果:
set RecSet=connection.execute [CommandText, RecordsAffected, Options]
六、RecordSet对象
RecordSet是ADO的一个非常重要的对象,Connection对象的最终目标往往是为了创建一个RecordSet。
RecordSet对象创建一个数据的游标。游标是存储在内存中的一张虚拟表。当RecordSet创建一个游标时,它从数据提供者得到一个数据集。
RecordSet的列(字段)是用RecordSet的Fields集合表示的。
每个对象都允许开发者使用ADO开发一个管理数据的交互级控制属性和方法。
RecordSet可以对数据进行添加、删除、修改、查询等操作,并且支持数据的分页显示,功能十分强大。
建立数据集对象的方法:
set rs=Server.CreateObject ("ADODB.Recordset")
rs.open "book2", adocon,1,3
七、ASP数据库操作范例一:添加记录
<%
Set adocon=Server.CreateObject ("ADODB.Connection")
adocon.open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath ("book.mdb")
set rs=Server.CreateObject ("ADODB.Recordset")
rs.open "book2", adocon,1,3
rs.AddNew
rs("bookno").value=Request.form("bookno")
rs("author").value=Request.form("author")
rs("bookname").value=Request.form("bookname")
rs.Update
%>
八、ASP数据库操作范例二:查询数据
<%
set objjournal=server.createobject("adodb.connection")
objjournal.open "dsn=journal;database=journals;uid=;pwd=;"
set objsearch=objjournal.execute("select * from journals where title='"&Request.querystring("jn")&"'")
while not objsearch.eof
response.write "中图分类:" & objsearch("class") & "v
"
response.write "正 刊 名:" & objsearch("title") & "1-Ux
"
response.write "AUTHOR:" & objsearch("author") & "F?a $1
"
response.write "出 版 者:" & objsearch("publisher") & "DawXN:
"
response.write "馆藏数据:" & objsearch("lib") & "
"
objsearch.movenext
wend
%>
九、ASP数据库操作范例三:查询数据
<%
set objjournal=server.createobject("adodb.connection")
objjournal.open "dsn=journal;database=journals;uid=;pwd=;"
set objsearch=Server.CreateObject ("ADODB.Recordset")
sql="select * from journals where title='"&Request.querystring("jn")&"'"
objsearch.open sql,objjournal,3
while not objsearch.eof
response.write "中图分类:" & objsearch("class") & "dB,
"
response.write "正 刊 名:" & objsearch("title") & "e.TCC
"
response.write "AUTHOR:" & objsearch("author") & "%
"
response.write "出 版 者:" & objsearch("publisher") & "\FNfz
"
response.write "馆藏数据:" & objsearch("lib") & "
"
objsearch.movenext
wend
%>t^op