1.22k likes | 1.45k Views
第9章 数据库的使用. 9.1 结构化查询语言 SQL 9.2 用 Access 建立一个数据库文件 9.3 搭建 DSN 桥梁 9.4 访问数据库中的数据 9.5 在客户端访问数据库 9.6 用 Command 对象改善查询 习题. 9.1 结构化查询语言 SQL.
E N D
第9章 数据库的使用 9.1 结构化查询语言SQL 9.2 用Access建立一个数据库文件 9.3 搭建DSN桥梁 9.4 访问数据库中的数据 9.5 在客户端访问数据库 9.6 用Command对象改善查询 习题
9.1 结构化查询语言SQL • SQL 一词实际上是 ″Structured Query Language″ 结构化查询语言的缩写,SQL是用于对存放在计算机数据库中的数据进行组织、管理和检索的一种工具;SQL是一种特定类型的数据库——关系数据库。而控制这种数据库的计算机程序就是DBMS——数据库管理系统,譬如:SQL Server、Oracle、Sybase、DB2 等等。当用户想要检索数据库中的数据时,需要通过SQL语言发出请求,接着DBMS对该SQL 请求进行处理并检索所要求的数据,最后将其结果返回给用户,此过程被称为数据库查询,这也就是数据库查询语言这一名称的由来。
SQL 不是 C、COBOL 和 FORTRAN 那种完整的计算机语言。SQL 既没有用于条件测试的If语句,也没有用于程序分支的Goto语句以及循环语句For或Do。 9.1.1 查询语句Select • 查询是SQL语言的核心,而用于表达SQL查询的Select语句则是功能最强也是最为复杂的SQL语句,它从数据库中检索数据,并将查询结果提供给用户。 • [例9-3]这一次,做一个稍微复杂一点的查询,如果要列出S表中年龄大于和等于24的所有女性的姓名、工资、电话和居住地区,并且按工资排序,可用下面的Select语句实现。 • 语法格式:
Select 数据项1,数据项2,... From 表名 [[Where 条件表达式][Order By排序选项][Group By汇总查询|[Having子句]]] • 功能: 从数据库表中检索出满足条件表达式要求的数据项。 • 说明: 1. Select子句列出所有要求Select语句检索的数据项。它放在Select语句开始处,指定此查询要检索的字段。这些数据项通常用选择项表示,即一组用“,”隔开的选择项。按照从左到右的顺序,每个选择项产生一列的查询结果,一个选择项可能是以下项目: (1) 字段名: 标识From子句指定表中的字段。如果字段名作为选择项,则SQL直接从数据库表中每行取出该列的值,再将其放在查询结果的相应行中。
(2) 常数:指定在查询结果的每行中都放上该值。 (3) SQL表达式: 说明必须将要放入查询结果中的值按表达式的规定进行计算。 2. From 子句列出包含所要查询数据的表,它由关键字From后跟一组用逗号分开的表名组成。每个表名都代表一个包括该查询要检索数据的表。这些表称为此SQL语句的表源,因为查询结果都源于它们。 3. Where子句告诉SQL只查询某些行中的数据,这些行用搜索条件描述。 4. Order By子句将查询结果按一列或多列中的数据排序。如果省略此子句,则查询结果将是无序的。添加ASC属性以升序(从小到大)排列,DESC属性以降序(从大到小)排列。
5. Group By子句指定汇总查询,它不是对每行产生一个查询结果,而是将相似的行进行分组,再对每组产生一个汇总结果。 6. Having子句告诉SQL只产生由Group By得到的某些组的结果,和Where子句一样,所需要的组也用一个搜索条件指定。 • 注意: 在这里使用的条件表达式与VBScript中用比较运算符组成的表达式是一致的
SQL不仅能进行数据库的查询,还可以对数据库中的数据进行修改和更新,而且更改数据库内容的SQL 更简单。不过,对于一个DBMS 来说,数据更新所造成的风险大大超出了数据查询。数据库管理系统必须在更改期内保护所存储的数据的一致性,确保有效的数据进入数据库,数据库必须保持一致性,DBMS还必须协调多用户的并行更新,以确保用户和他们的更改不至于影响其他用户的作业。所以,使用修改和更新语句时,一定要小心!
9.1.2 插入语句Insert Into • 语法格式: Insert Into表名(col1, col2...) Values (value1, value2...) • 功能: 向一个表中加入新的数据行 [例9-4]将张驰作为一个新的成员加入表S中。 Insert Into S( xm,xb,nl,gz,dh,dz) Values (′张驰′,′男′,28,4500,8888,′北京′) • Insert 语句还可以将多行数据添加到目标表中去,在这种形式的 Insert 语句中,新行的数据值不是在语句正文中明确地指定的,而是语句中指定的一个数据库查询。添加的值来自已经存在的表中。看下面的例子。
[例9-5]如果要把2000年12月30日之前产生的订单编号(Num)、日期(Date)和数目(Amount)从A表拷贝到另一个名为B的表中去,可用下面的语句:[例9-5]如果要把2000年12月30日之前产生的订单编号(Num)、日期(Date)和数目(Amount)从A表拷贝到另一个名为B的表中去,可用下面的语句: Insert into B (Num,Date,Amount) Select Num,Date,Amount From A Where Date<′30122000′ 9.1.3 更新语句Update • 下面介绍 Update 的用法,Update 语句用于更新表中选定行的一列或多列的值。要更新的目标表在语句中定义,Set子句则指定要更新哪些列并计算它们的值。 Update 语句总是包含Where语句,因为Update语句比较危险,所以你必须明确地认识到 Where 语句的重要性,Where 语句被用来指定需要更新的行
语法格式: Update 表名 Set 字段名1=value1 \[,字段名2 = value2\]... Where 条件 • 功能: 用value值更改选定的表中已经存在的字段的数据。 [例9-6]这是一个简单的Update 语句,可将表C中客户名为slp的客户的信贷值更新为10万并将他的ID变更为99。 Update C Set credit=100000.00,id=99 Where name=′slp′
[例9-7]如果要将表C中客户ID为80、90、100、120客户的信贷值更新为20万,状态值为021,可用下列语句:[例9-7]如果要将表C中客户ID为80、90、100、120客户的信贷值更新为20万,状态值为021,可用下列语句: Update C Set credit=200000.00,state=021 Where ID in (80,90,100,120) • Where 字段名in (数据集合),表示查询“字段名”的值为“数据集合”中的所有记录。例如,上例中“字段名”为ID,ID的值为80、90、100、120。 • SQL 处理 Update 语句的过程是逐行搜索所指定的表,更新满足搜索条件的记录,跳过不满足搜索条件的记录。
9.1.4 删除语句Delete • 语法格式: Delete from 表名 Where 条件 • 功能: 从一个表中删除数据行。 [例9-8]从表D中删除ID为99的所有行的记录。 Delete from D Where ID=99 9.1.5 创建表语句Create table • SQL 语言可以分为两大部分: 数据定义语言和数据操纵语言,以上介绍的是数据操纵语言的Select 语句。下面介绍数据定义语言,它是用来创建和修改数据库结构的一种语句,包括 Create 和 Drop 语句。
语法格式: Create table 表名 ( 字段名1 数据类型 \[NOT NULL\],字段名2 数据类型 \[NOT NULL\], 字段名3 数据类型\[ NOT NULL\]...) • 功能: 建立一个给定字段的表。 [例9-9]下面的语句创建一个具有字段name字符型30位, amout数值型8位,id数值型4位的表B。 Create Table B (name CHAR(30), amout NUMBER(8), id NUMBER(4)) • 虽然Create table 比前面介绍的语句难理解一些,但仍然很直观。它将表B赋予一个新表,并指定表中三列的名称和数据类型。表被建立后就可以添入数据了。可用下面的语句输入数据。
Insert Into B(name,amout,id) Values(′zhangchi′,100,1) 9.1.6 删除表语句Drop table • 如果,你觉得不再需要保存某个表的数据信息,则可用 Drop table 语句将该表及其所包含的所有数据从数据库中删除掉。 • 语法格式: Drop table 表名 • 功能: 删除一个表。 [例9-10]如果要删除表B可使用下面的语句。 Drop table B
9.2 用Access建立一个数据库文件 • 如果你已经安装有Access软件,可单击Windows 2000的“开始”→“程序” →“Microsoft Access”菜单,启动Access,可看到如图9.1所示的对话框。 • 在Microsoft Access对话框中,选择“空Access数据库”,然后单击“确定”按钮,打开“文件新建数据库”对话框,如图9.2所示,单击“新建文件夹”图标,会弹出图9.3所示对话框。
在图9.3所示“新文件夹”对话框中输入你取的名称,如“mydb”,然后单击“确定”按钮,将返回“文件新建数据库”对话框,但路径已经改变,如图9.4所示。在图9.3所示“新文件夹”对话框中输入你取的名称,如“mydb”,然后单击“确定”按钮,将返回“文件新建数据库”对话框,但路径已经改变,如图9.4所示。 图9.4
在“文件新建数据库”对话框的“文件名”框中输入你要建的数据库的名字,如“mydb1”,然后单击“创建”按钮,即可打开“数据库窗口”,如图9.5所示。在“文件新建数据库”对话框的“文件名”框中输入你要建的数据库的名字,如“mydb1”,然后单击“创建”按钮,即可打开“数据库窗口”,如图9.5所示。 图9.5
双击“通过输入数据创建表”将打开“表”窗口如图9.6所示,在这里可输入你要保存的数据,在“字段1”上右击选择“重命名列”,可输入“姓名”,同样可将“字段2”改写为“年龄”,“字段3”改写为“工资”,“字段4”改写为“电话”,“字段5”改写为“地址”,“字段6”改写为“出生日期”,并填写相应的数据,如图9.7所示。双击“通过输入数据创建表”将打开“表”窗口如图9.6所示,在这里可输入你要保存的数据,在“字段1”上右击选择“重命名列”,可输入“姓名”,同样可将“字段2”改写为“年龄”,“字段3”改写为“工资”,“字段4”改写为“电话”,“字段5”改写为“地址”,“字段6”改写为“出生日期”,并填写相应的数据,如图9.7所示。
如果这次的数据都输入完了,可单击Microsoft Access的窗口的“文件”→“保存”菜单,将出现“另存为”对话框,如图9.8所示,在“表名称”栏中填写你的表名称如“S1”,然后单击“确定”按钮,会出现一个icrosoft Access的提示对话框,如图9.9所示。 • 图9.9提示你应该定义一个主关键字,单击“是”按钮,将会直接为你增加一个ID字段,如图9.10所示。 • 图9.10中所示的“表”窗口已经显示出你定义的表名“S1”,也可看到ID字段自动输入的数值1、2。至此,一个Access表S1就建好了。你可单击Microsoft Access窗口右上角的按钮,关闭Microsoft Access窗口,结束建表的工作。如果你要向表S1输入数据,可直接打开表S1继续输入的工作。
9.3 搭建DSN桥梁 • 先来说明什么是ODBC。ODBC是一种访问数据库的方法,只要系统中有相应的ODBC驱动程序,任何程序就可以通过ODBC操纵数据库。比如系统中有Access的ODBC驱动程序,那么即使你没有Access软件,也可以在你的ASP程序中间对一个Access的数据库进行加、删、改记录的操作。而且根本不用知道这个数据库是放在哪里。只要写出SQL语句,ODBC驱动程序就会帮你做一切事情。
用ODBC时,经常见到DSN这个名词,DSN(Date Source Name)即数据源名称。在给ODBC驱动程序传SQL指令时,即是用DSN来告诉它到底操作的是哪一个数据库。如果数据库的平台变了,比如改用了SQL Server的数据库,只要其中表的结构没变,就不用改写程序,只要重新在系统中配置DSN就行了。由此可见,DSN是应用程序和数据库之间的桥梁,要通过ODBC访问数据库,前提就是必须配置好DSN(即架好桥梁)。一个DSN必须包含如下一些信息。 • DSN的名字: 就是给这座桥取个名字,当程序访问数据库时,给系统传的就是这个名字,而不是数据库的实际名称。 • ODBC驱动程序类型:只有指出驱动程序类型,在操作数据库时,系统才会知道调哪个ODBC驱动程序来服务。
数据库: 必须指定这座桥到底连接的是哪个数据库,但不同的数据库系统指定数据库名字的方法有些不同。 • 这座桥是架在系统之中的,所以Windows 95/98提供了一个工具来完成这件事,即控制面板中的32位ODBC,或Windows 2000/NT中“控制面板”/“管理工具”的用户DSN、系统DSN、文件DSN。一般要用系统DSN,因为这样可以让所有在该系统上操作的人都能使用这个DSN。 (1) 单击Windows 95/98“开始”→“设置” →“控制面板”,打开“控制面板”窗口,如图9.11(a)所示。或Windows 2000/NT中“控制面板” →“管理工具”,如图9.11(b)所示。
(2) 双击图标“ODBC数据源(32位)”或“数据源(ODBC)”,将弹出“ODBC数据源管理器”对话框,如图9.12所示,选择“系统DSN”标签。 (3) 在图9.12中单击“添加”按钮,将弹出“创建新数据源”对话框,如图9.13所示。选择“Microsoft Access Drive”选项,单击“完成”按钮,将弹出“ODBC Microsoft Access安装”对话框,如图9.14所示。
(4) 在图9.14中的“数据源”栏中输入你希望指定的DSN名称,如“QL”,然后单击“数据库”栏中“数据库:”下的“选取”按钮,将打开“选择数据库”对话框,如图9.15所示。 • 在图9.15中先在目录下选择数据库存放的路径,再选择要使用的数据库,例如“C:\..\My Documents\mydb\mydb1.mdb”,然后单击“确定”按钮就大功告成了。 • 以后可以用“ql”来访问数据库“C:\..\my Documents\mydb\mydb1.mdb”,而不用直接使用文件名“C:\..\My Documents\mydb\mydb1.mdb”,这样做的好处是,一旦改变了文件名或存放地,就不必一个一个地修改程序中所有该数据库的名称,而只需修改DSN中的配置就可以了。
以上步骤完成后,在ASP程序中即可利用DSN与数据库mydb1.mdb中的表S1建立联系了。以上步骤完成后,在ASP程序中即可利用DSN与数据库mydb1.mdb中的表S1建立联系了。 图9.15
9.4 访问数据库中的数据 9.4.1 使用Recordset对象处理结果 • 对于检索数据、检查结果和更改数据库,ADO提供了Recordset对象。正如它的名称所暗示的那样,是对记录的设置。Recordset 对象有许多可以使用的特性,可根据不同的查询条件限制,检索并且显示一组数据库文件的记录。 Recordset 对象还保持查询返回的记录的位置,它返回第一个检索到的记录,但允许你一次一项逐步扫描其他结果。
根据 Recordset 对象的指针类型的属性设置,可以滚动和更新记录。指针可以让你在一组记录中定位到特定的项。指针还用于检索和检查记录,然后在这些记录的基础上执行操作。Recordset 对象还有一些属性,可用于精确地控制指针的行为,提高检查和更新结果的能力。下面通过例子来看看如何使用Recordset 对象。 [例9-11]查询并显示数据库表中数据的程序。 <% Set rs=Server.CreateObject(″ADODB.Recordset″) rs.Open ″Select * from S1″,″DSN=ql;″%>
姓名为:<%=rs(″姓名″)%><p> 年龄为:<%=rs(″年龄″)%><p> 工资为:<%=rs(″工资″)%> <%rs.Close set rs=nothing %> • 9.11.asp执行的结果如图9.16所示。
语法格式: <% Set rs= Server.CreateObject(″ADODB.Recordset″) rs.Open 数据查询信息,数据库连接信息 =rs(″字段名称″) ... rs.close set rs=nothing %> • 功能: 使用Recordset对象可返回已经建立连接的数据库中的数据。
说明: • 第一行是声明rs为建立的Recordset对象的实例,这个语句不能少。 • 第二行是以Recordset对象的Open方法连接并发出数据查询,其中的“数据查询信息”由SQL请求命令语句组成,“数据库连接信息”由“DNS=数据源名称;UID=登录名称;PWD=密码;”组成,数据源的登录名称和密码可在建立数据源时通过“高级”选项进行设置;登录名称和密码也可以省略不设。 • 第三行“=rs(″字段名称″)”确定输出哪些数据字段。
第四行为Recordset对象的rs.close方法,将释放Recordset对象及其相关的对象。但close方法不会将Recordset对象从内存里清除,如果你不再需要这个对象了,要使用set rs=nothing,这个语句可以精确地清除这个对象。 • 注意: 当打开一个数据库的表时,如果这个表中包含若干条记录,则当前的记录指针指向第一条记录。所以,例子中显示的数据是表S1中的第一条记录的数据。
[例9-12]显示数据库表中所有数据的程序。 <%Set rs=Server.CreateObject(″ADODB.Recordset″) rs.Open ″Select * from S1″,″DSN=ql;″%> <%while not rs.EOF%> 姓名为:<%=rs(″姓名″)%> 年龄为:<%=rs(″年龄″)%> 工资为:<%=rs(″工资″)%><p> <%rs.MoveNext wend%> <%rs.Close set rs=nothing %>
9.12.asp执行的结果如图9.17所示,可看到在S1中要求的数据都显示了出来。9.12.asp执行的结果如图9.17所示,可看到在S1中要求的数据都显示了出来。 图9.17
这里使用了while...wend循环,并使用了Recordset 对象的MoveNext方法,将记录指针向下移动一行。 • 下面列出了所创建的 RecordSet对象(游标)的一些属性和方法。 • rs.EOF: 记录指针在记录的尾部; • rs.BOF: 记录指针在记录的头部; • rs.Fields.Count: RecordSet对象的字段总数; • rs(i).Name: 第 i 个字段的名称, i 由 0 算起到 rs.Fields.Count1; • rs(i): 读取第 i 个字段的数据, i 由 0 算起到 rs.Fields.Count1; • rs(″ 字段名称 ″): 读取指定字段的数据; • rs.RecordCount: 游标中的数据记录总数;
rs.MoveNext: 将指针移到下一个记录; • rs.MovePrev: 将指针移到上一个记录; • rs.MoveFirst: 将指针移到第一个记录; • rs.MoveLast: 将指针移到最后一个记录; • rs.Move [n] : 将指针移到第 n 个记录,n由0算起; • rs.Move NumRecords,Start: “NumRecords”是一个正负数运算式,设定当前记录位置的移动数目;“start”是一个可选的项目,用来指定记录起始的标签; • rs.Close: 关闭 RecordSet 对象。
9.4.2 使用Connection对象 1. 向数据库插入数据 • ADO提供了Connection对象,用于建立和管理应用程序和ODBC数据库之间的连接。Connection对象具有各种属性和方法,可以使用它们打开和关闭数据库连接,并且发出查询请求来更新信息。 • 下面的脚本使用Connection对象的Execute方法发出SQL Insert命令向数据库中的表发出查询,该命令并将数据插入到指定的数据库表中。 [例9-13]将新的数据插入到数据库表文件里的程序。 <% Set cn =Server.CreateObject(″ADODB.Connection″)