网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 交易代码 > SQL语法 > 正文

学习资料sql语言入门教程

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

【网学网提醒】:网学会员,鉴于大家对学习资料sql语言入门教程十分关注,会员在此为大家搜集整理了“学习资料sql语言入门教程”一文,供大家参考学习!


    老代向大家推荐
    SQL语言入门教程之通人易懂手册语言入门教程之通人易懂手册第一课简介
    SQL是英文StructuredQueryLanguage的缩写,意思为结构化查询语言。SQL语言的主要功能就是同各种数据库建立联系,进行沟通。按照ANSI(美国国家标准协会)的规定,SQL被作为关系型数据库管理系统的标准语言。SQL语句可以用来执行各种各样的操作,例如更新数据库中的数据,从数据库中提取数据等。目前,绝大多数流行的关系型数据库管理系统,如Oracle,Sybase,MicrosoftSQLServer,Access等都采用了SQL语言标准。虽然很多数据库都对SQL语句进行了再开发和扩展,但是包括Select,Insert,Update,Delete,Create,以及Drop在内的标准的SQL命令仍然可以被用来完成几乎所有的数据库操作。下面,我们就来详细介绍一下SQL语言的基本知识。一个典型的关系型数据库通常由一个或多个被称作表格的对象组成。数据库中的所有数据或信息都被保存在这些数据库表格中。数据库中的每一个表格都具有自己唯一的表格名称,都是由行和列组成,其中每一列包括了该列名称,数据类型,以及列的其它属性等信息,而行则具体包含某一列的记录或数据。以下,是一个名为太平洋网络的数据库表格的实例。栏目新手上路软件教室设计教室开发教室用户群电脑初学者一般的电脑用户电脑设计爱好者电脑编程人员
    该表格中“栏目”“用户群”就是两个不同的列,而表格中的每一行则包含了具体的,表格数据。1.创建表格2.数据查询3.向表格中添加、更新、删除记录4.删除数据库表格
    第二课创建表格
    SQL语言中的createtable语句被用来建立新的数据库表格。createtable语句的使用格式如下:createtabletablename(column1datatype,
     老代向大家推荐
    column2datatype,column3datatype);如果用户希望在建立新表格时规定列的限制条件,可以使用可选的条件选项:createtabletablename(column1datatype[constraint],column2datatype[constraint],column3datatype[constraint]);举例如下:createtableemployee(firstnamevarchar(15),lastnamevarchar(20),agenumber(3),addressvarchar(30),cityvarchar(20));简单来说,创建新表格时,在关键词createtable后面加入所要建立的表格的名称,然后在括号内顺次设定各列的名称,数据类型,以及可选的限制条件等。注意,所有的SQL语句在结尾处都要使用“;”符号。使用SQL语句创建的数据库表格和表格中列的名称必须以字母开头,后面可以使用字母,数字或下划线
    ,名称的长度不能超过30个字符。注意,用户在选择表格名称时不要使用SQL语言中的保留关键词,如select,create,insert等,作为表格或列的名称。数据类型用来设定某一个具体列中数据的类型。例如,在列中只能采用varchar或char的数据类型,而不能使用number的数据类型。SQL语言中较为常用的数据类型为:char(size):固定长度字符串,其中括号中的size用来设定字符串的最大长度。Char类型的最大长度为255字节。varchar(size):可变长度字符串,最大长度由size设定。number(size):数字类型,其中数字的最大位数由size设定。Date:日期类型。number(size,d):数字类型,size决定该数字总的最大位数,而d则用于设定该数字在小数点后的位数。最后,在创建新表格时需要注意的一点就是表格中列的限制条件。所谓限制条件就是当向特定列输入数据时所必须遵守的规则。例如,unique这一限制条件要求某一列中不能存在两个值相同的记录,所有记录的值都必须是唯一的。除unique之外,较为常用的列的限制条件还包括notnull和primarykey等。null用来规定表格中某一列的值不能为空。notprimarykey则为表格中的所有记录规定了唯一的标识符。
    第三课数据查询
    在众多的SQL命令中,select语句应该算是使用最频繁的。select语句主要被用来对数据库进行查询并返回符合用户查询标准的结果数据。Select语句的语法格式如下:selectcolumn1[,column2,etc]fromtablename[wherecondition];([]表示可选项)
     老代向大家推荐
    select语句中位于select关键词之后的列名用来决定那些列将作为查询结果返回。用户可以按照自己的需要选择任意列,还可以使用通配符“*”来设定返回表格中的所有列。select语句中位于from关键词之后的表格名称用来决定将要进行查询操作的目标表格。Select语句中的where可选从句用来规定哪些数据值或哪些行将被作为查询结果返回或显示。在where条件从句中可以使用以下一些运算符来设定查询标准:=等于>大于<小于>=大于等于<=小于等于<>不等于除了上面所提到的运算符外,LIKE运算符在where条件从句中也非常重要。LIKE运算符的功能非常强大,通过使用LIKE运算符可以设定只选择与用户规定格式相同的记录。此外,我们还可以使用通配符“%”用来代替任何字符串。举例如下:selectfirstname,lastname,cityfromemployeewherefirstnameLIKE‘E%’;(注意,字符串必须被包含在单括号内)
    上述SQL语句将会查询所有名称以E开头的。或者,通过如下语句:select*fromemployeewherefirstname=‘May’;查询所有名称为May的行。
    向表格中添加、更新、第四课向表格中添加、更新、删除记录
    添加新记录SQL语言使用insert语句向数据库表格中插入或添加新的数据行。Insert语句的使用格式如下:insertintotablename(first_column,...last_column)values(first_value,...last_value);例如:insertintoemployee(firstname,lastname,age,address,city)values(‘Li’,’Ming’,45,‘No.77ChanganRoad’,’Beijing’);简单来说,当向数据库表格中添加新记录时,在关键词insertinto后面输入所要添加的表格名称,然后在括号中列出将要添加新值的列的名称。最后,在关键词values的后面按照前面输入的列的顺序对应的输入所有要添加的记录值。更新记录SQL语言使用update语句更新或修改满足规定条件的现有记录。update语句的格式为:updatetablenamesetcolumnname=newvalue[,nextcolumn=newvalue2...]wherecolumnnameOPERATORvalue[and|orcolumnOPERATORvalue];
     老代向大家推荐
    例如:updateemployeesetage=age+1wherefirst_name=‘Mary’andlast_name=‘Williams’;使用update语句时,关键一点就是要设定好用于进行判断的where条件从句。删除记录SQL语言使用delete语句删除数据库表格中的行或记录。Delete语句的格式为:deletefromtablenamewherecolumnnameOPERATORvalue[and|orcolumnOPERATORvalue];例如:deletefromemployeewherelastname=May;简单来说,当需要删除某一行或某个记录时,在deletefrom关键词之后输入表格名称,然后在where从句中设定删除记录的判断条件。注意,如果用户在使用delete语句时不设定where从句,则表格中的所有记录将全部被删除。
    第五课删除数据库表格
    在SQL语言中使用droptable命令删除某个表格以及该表格中的所有记录。droptable命令的使用格式为:droptabletablename;例如:droptableemployee;如果用户希望将某个数据库表格完全删除,只需要在droptable命令后输入希望删除的表格名称即可。droptable命令的作用与删除表格中的所有记录不同。删除表格中的全部记录之后,该表格仍然存在,而且表格中列的信息不会改变。而使用droptable命令则会将整个数据库表格的所有信息全部删除。以上,我们对SQL语言主要的命令和语句进行了较为详细的介绍。应该说SQL语句的语法结构和风格还是相当简单和直观的,只要用户
    结合实践多加练习,一定会在短期内迅速掌握。以Store_Information数据表为例,我们可以在GROUPBY一节中所使用的SQL命令中设置如下字段和数据表别名:SELECTA1.store_nameStore,SUM(Sales)"TotalSales"FROMStore_InformationA1GROUPBYA1.store_name查询结果显示为:StoreTotalSalesLosAngeles$1800SanDiego$250Boston$700
     老代向大家推荐
    SQL循序渐进SQL循序渐进目录循序渐进(目录目录)
    SQL循序渐进(1)-------介绍SQLSQL循序渐进(2)-------表的基础知识SQL循序渐进(3)-------数据检索SQL循序渐进(4)-------创建表SQL循序渐进(5)-------插入数据到表SQL循序渐进(6)-------删除表SQL循序渐进(7)-------更新记录SQL循序渐进(8)-------删除记录SQL循序渐进(9)-------SELECT语句SQL循序渐进(10)------合计函数SQL循序渐进(11)------GROUPBY子句SQL循序渐进(12)------HAVING子句SQL循序渐进(13)------ORDERBY子句SQL循序渐进(14)------组合条件和布尔运算符SQL循序渐进(15)------IN和BETWEEN条件运算符SQL循序渐进(16)------数学运算符SQL循序渐进(17)------JOIN子句SQL循序渐进(18)------索引SQL循序渐进(19)------DISTINCT和排除复制SQL循序渐进(20)------Aliases、In以及子查询SQL循序渐进(21)------更多的子查询SQL循序渐进(22)------EXISTS和ALLSQL循序渐进(23)------UNION和外部连接SQL循序渐进(24)------嵌入SQL
    (1)介绍SQL介绍
    SQL(StructuredQueryLanguage,结构查询语言)是一个功能强大的数据库语言。SQL通常使用于数据库的通讯。ANSI(美国国家标准学会)声称,SQL是关系数据库管理系统的标准语言。SQL语句通常用于完成一些数据库的操作任务,比如在数据库中更新数据,或者从数据库中检索数据。使用SQL的常见关系数据库管理系统有:Oracle、Sybase、MicrosoftSQLServer、Access、Ingres等等。虽然绝大多数的数据库系统使用SQL,但是它们同样有它们自立另外的专有扩展功能用于它们的系统。但是,标准的SQL命令,比如"Select"、"Insert"、"Update"、"Delete"、"Create"和"Drop"常常被用于完成绝大多数数据库的操作。但是,不象其它的语言,C、如Pascal等,SQL没有循环结构(比如if-then-else、do-while)以及函数定义等等的功能。而且SQL只有一个数据类型的固定设置,换句话说,你不能在
     老代向大家推荐
    使用其它编程语言的时候创建你自己的数据类型。SQL功能强大,但是概括起来,它可以分成以下几组:DML(DataManipulationLanguage,数据操作语言):用于检索或者修改数据;DDL(DataDefinitionLanguage,
    数据定义语言):用于定义数据的结构,比如创建、修改或者删除数据库对象;DCL(DataControlLanguage,数据控制语言):用于定义数据库用户的权限。DML组可以细分为以下的几个语句:SELECT:用于检索数据;INSERT:用于增加数据到数据库;UPDATE:用于从数据库中修改现存的数据DELETE:用于从数据库中删除数据。DDL语句可以用于创建用户和重建数据库对象。下面是DDL命令:CREATETABLEALTERTABLEDROPTABLECREATEINDEXDROPINDEXDCL命令用于创建关系用户访问以及授权的对象。下面是几个DCL命令:ALTERPASSWORDGRANTREVOKECREATESYNONYM为了让你对SQL有一个直观的认识,下面先给出一个简单SQL语句的例子:我们使用SQL语句来从Employees中检索DepartmentID为CS的:SELECTEmployees.NameFROMEmployeesWHEREEmployees.DeptID="CS"可能你现在一开始不太理解这些语句,也许你会一头雾水,不要紧的,通过本教程的学习后,你会发现这段语句是多么的普通。为了不让你困惑,下面我也进行一番解释:先对FROM子句吧,语句中的FROMEmployees意思是从Employees表中检索数据。而语句WHEREEmployees.DeptID="CS"意思是检索Employees的DeptID列为”CS”的行,这样SQL语句检索的结果将是DeptID为CS的列的所有数据,比如:EmpID123124NamePurpleZscDeptCSCS
    最后,我们来解释一个SELECT子句,它指定了从Name列检索来的所有数据,比如NamePurpleZsc
     老代向大家推荐
    好吧,开始我们下一节的教程-------表的基本知识。
    (2)表的基础知识表的基础知识
    关系数据库通常包含多个表。数据库实际上是表的集合,数据库的数据或者信息都是存储在表中的。表是对数据进行存储和操作的一种逻辑结构,每一个表都代表一个对用户意义的对象。例如,一个公司数据库中,会有雇员表、部门表、库存表、销售表、工资表等等。我们经常见到的成绩表就是一种表,它是有行和列组成的,我们并且可以通过名字来识别数据。列包含了列的名字、数据类型以及列的其它属性;行包含了列的记录或者数据。下面给出一个成绩单,其中、语文、数学、英语都是列,而行包含了这个表的数据,即每个人的各科成绩:王小童张柳风紫云飞黄天龙语文78856598数学100928967英语87958675
    (3)数据检索数据检索
    在SQL中SELECT语句通常用于检索数据库,或者检索满足你设定条件的数据,以下是简单的SELECT语句的格式:select"column1"[,"column2",etc]from"tablename"[where"condition"];[]=optional其中列的名字跟着SELECT关键字,它决定了哪一列将被作为结果返回。你可以任意指定多个列
    ,或者你可以使用"*"来选择所有的列。表的名字是紧跟着FROM关键字的,它指出了哪个表格将作为最后结果被查询。而WHERE子句(可选)指出哪个数据或者行将被返回或者显示,它是根据关键字WHERE后面描述的条件而来的。在WHERE子句中可以有以下的条件选择:=等于>大于<小于>=大于等于<=小于等于<>不等于LIKE参见以下注释注释:LIKE模式匹配操作符同样可以使用在WHERE子句的条件条件中。LIKE是一个功
     老代向大家推荐
    能强大的操作符,它可以让你选择你"喜欢"指定的行。百分号"%"可以被用来匹配任何可能的字符,它可以出现在指定字符的前面或者后面,例如:selectfirst,last,cityfromempinfowherefirstLIKE'Er%';以上这条SQL语句将会匹配任何名字以'Er'开始的名字,这里必须使用单引号。或者你也可以使用"%"在字符的前面,例如:selectfirst,lastfromempinfowherelastLIKE'%s';这条SQL语句将会匹配任何名字以's'结尾的名字。这个"%"的作用就跟DOS命令的"*"号很相似。select*fromempinfowherefirst='Eric';以上的SQL语句只选择first名字为'Eric'的行。
    (4)创建表创建表
    这个createtable语句是用于创建一个新的表格。以下是一个简单创建表格语句的格式:createtable"tablename"("column1""datatype","column2""datatype","column3""datatype");如果你想使用可选的约束,创建表格的格式为:createtable"tablename"("column1""datatype"[constraint],"column2""datatype"[constraint],"column3""datatype"[constraint]);[]=optional这里注意:你可以任意创建多列的表格,这个条件是可选的。为了更好的理解,下面举个例子:createtableemployee(firstvarchar(15),lastvarchar(20),agenumber(3),addressvarchar(30),cityvarchar(20),statevarchar(20));为了创建一个新表格,你可以在关键字createtable之后跟着表的名字,然后一个圆左括号”(”,然后是第一列的名字,再是这一列的数据类型,接着是任意的可选约束,最后是圆右括号”)”。确保在开始表格内容之前使用圆左括号并且在表的最后一列定义之后使用圆右括号是相当重要的。你还要保证每一个列定义之间有逗号分隔。最后在SQL语句结束时候加上分号";"。表格和列名必须以字母开头,第二个字符开始可以是字母、数字或者下划线,但是要保证名
     老代向大家推荐
    字的总长度不要超过30个字符。在定义表格和列名不要使用不要使用SQL预定的用于表格或者列名的关键字(比如"select"、"create"、"insert"等等),以避免错误的发生。数据类型是指在特定的列使用什么样数据的类型。如果一个列的名字为"Last_Name",它是用来容纳人名的,
    所以这个特定列就应该采用"varchar"(variable-lengthcharacter,变长度的字符型)数据类型。以下是几种常见的数据类型:char(size):固定长度的字符串型。Size是圆括号中指定的参数,它可以由用户随意设置,但是不能超过255个字节。varchar(size):变长度的字符串型。它的最大长度是由括号中的参数size设定的。number(size):数值型。最大数字的位数由括号中的参数size设置。date:日期数值型。number(size,d):数值型。它的最大数字的位数由括号中的参数sieze设定,而括号中的参数d是设置小数点的位数。什么是约束呢?当表被创建的时候,可以一列也可以多列共用一个约束。约束是一个跟列有关的基本准则,返回的数据必须遵循这个准则。下面举个例子,一个约束指定在一列中不能有两个记录共用一个数值。它们必须单独的。其它两个流行的约束是:"notnull",它设置了列不能留空白,即一定要有数据;以及"primarykey"(主键),主键约束定义了表中每一个记录(或行)的唯一标识。所有的这些将在以后的教程中再作进一步阐述。好吧,也许你已经有跃跃欲试的冲动了。作为本节练习,下面我们自己来设计和创建表格。你可以开始创建一个公司的雇员表格。你需要创建一个包含firstname、lastname、title、age和salary的表格。
    (5)插入数据到表插入数据到表
    Insert语句用于往表格中插入或者增加一行数据,它的格式为:insertinto"tablename"(first_column,...last_column)values(first_value,...last_value);[]=optional简单举个例子:insertintoemployee(first,last,age,address,city)values('Luke','Duke',45,'2130BoarsNest','HazardCo');这里要注意:每一个字符窜都要用单引号括起来。为了往表中插入数据,要在关键字insertinto之后紧跟着表名,然后是左圆括号,接着是以逗号分开的一系列的列名,再是一个右圆括号,然后在关键字values之后跟着一系列用圆括号括起的数值。这些数值是你要往表格中填入的数据,它们必须与指定的列名相匹配。字符串笔译用单引号括起来,而数字就不用。在上面的例子中,'Luke'必须与列first相匹配,而45必须与列age相匹配。假如你想往employee表格中插入以下数据;ZhangWeiguo,28,北京601信箱,北京那么你要使用以下的SQL语句:insertintoemployee(first,last,age,address,city)
     老代向大家推荐
    values('Zhang','Weiguo',28,'北京601信箱','北京');
    (6)删除表删除表
    Droptable命令用于删除一个表格或者表中的所有行。其语法格式为:droptable"tablename"下面举个例子:droptableemployee;为了删除整个表(包括所有的行),可以使用droptable命
    令后加上tablename。Droptable命令跟从表中删除所有记录是不一样的:删除表中的所有记录是留下表格(只是它是空的)以及约束信息;而droptable是删除表的所有信息,包括所有行、表格以及约束信息等等。
    (7)更新记录更新记录更新
    Update语句用于更新或者改变匹配指定条件的记录,它是通过构造一个where语句来实现的。其语句格式如下:update"tablename"set"columnname"="newvalue"[,"nextcolumn"="newvalue2"...]where"columnname"OPERATOR"value"[and|or"column"OPERATOR"value"];[]=optional下面举个例子来说明:updatephone_booksetarea_code=623whereprefix=979;以上语句是在phone_book表中,在prefix=979的行中将area_code设置为623。updatephone_booksetlast_name='Smith',prefix=555,suffix=9292wherelast_name='Jones';而以上的这段语句是在phone_book中,在last_name='Jones'的行中将last_name设置为'Smith',prefix为555,suffix为9292。updateemployeesetage=age+1wherefirst_name='Mary'andlast_name='Williams';这段语句是在employee表中,first_name='Mary'和last_name='Williams'的行中将age加1。在作为每课一练,你在结束本教程之后要好好作以下的练习:1因为JonieWeber已经跟BobWilliams结婚,所以它需要将它的last名更新为Weber-Williams。2DirkSmith的生日是今天,所以他的年龄应该加1。3所有的秘书都叫做"AdministrativeAssistant".所以要将所有的标题标题都相应地修改。就作这几个练习,千万不可大意哟。
     老代向大家推荐
    (8)删除记录删除记录
    Delete语句是用来从表中删除记录或者行,其语句格式为:deletefrom"tablename"where"columnname"OPERATOR"value"[and|or"column"OPERATOR"value"];[]=optional下面还是举个例子:deletefromemployee;这条语句没有where语句,所以它将删除所有的记录,因此如果没有使用where的时候,要千万小心。如果你只要删除其中一行或者几行,可以参考以下的语句:deletefromemployeewherelastname='May';这条语句是从emplyee表中删除lastname为'May'的行。deletefromemployeewherefirstname='Mike'orfirstname='Eric';这条语句是从emplyee表中删除firstname为'Mike'或者'Eric'的行。为了从表中删除一个完整的记录或者行,就直接在"deletefrom"后面加上表的名字,并且利用where指明符合什么条件的行要删除即可。如果你没有使用where子句,那么表中的所有记录或者行将被删除。
    (9)SELECT语句
    在上面的教程中已经有用到SELECT语句。在本节教程中将详细对它进行阐述。SELECT语句是SQL的核心,在你的SQL语句中可能用的最多的就是SELECT语句了。由于大量的选项可以用于SELECT语句,所以整个教程好象就是围这S
    ELECT语句转。当我们构造SQL查询语句(利用了SELECT语句)的时候,认识所有的可能选项和最好的或者最有效率的方法来实现是很有用的。这个教程将为你提供这些技能。SELECT语句用于查询数据库并检索匹配你指定条件的选择数据。SELECT语句有五个主要的子句子你可以选择,而FROM是唯一必须的子句。每一个子句有大量的选择项、参数等等。这些子句将罗列在下面,而且它们每一个都将在以后的教程有更为详细的描述。以下是SELECT语句的格式:SELECT[ALL|DISTINCT]column1[,column2]FROMtable1[,table2][WHERE"conditions"][GROUPBY"column-list"][HAVING"conditions][ORDERBY"column-list"[ASC|DESC]]下面举个例子:SELECTname,age,salaryFROMemployeeWHEREage>50;上面的这个语句将从employee表中选择age大于50的所有的name、和salary列的数值。age
     老代向大家推荐
    注意:一定要在SQL语句末尾加上一个分号。这个分号提示SQL语句已经结束并准备被解释。以下的表格给出了各种比较运算符号:=等于
    >
    大于
    <
    小于
    >=
    大于等于
    <=
    小于等于
    <>
    不等于
    LIKE
    字符串比较测验
    举个例子吧:SELECTname,title,deptFROMemployeeWHEREtitleLIKE'Pro%';上面的语句是从employee表中选择title是以'Pro'为开头的name、title和dept列中的所有行或者数值。另外ALL和DISTINCT也是SQL中的关键字,它们用于在你的查询结果中选择ALL(缺省)或者"distinct"或者单一记录。如果你想在指定的列中检索单一记录,你可以使用"DISTINCT"关键子。因为DISTNCT将会丢弃所有你在SELECT指定的列复制的记录,比如:SELECTDISTINCTageFROMemployee_info;这条语句将返回所有在employee_info表中单一的age数据。而ALL就将显示所有指定的类,包括所有的复制数据。在没有指定的时候,这个ALL关键字是缺省的。
    (10)合计函数合计函数
    所有的合计函数如下表所示:
     老代向大家推荐
    MINMAXSUMAVGCOUNTCOUNT(*)
    返回一个给定列中最小的数值返回一个给定列中最大的数值返回一个给定列中所有数值的总和返回一个给定列中所有数值的平均值返回一个给定列中所有数值的个数返回一个表中的行数
    合计函数用于从SELECT语句中计算一个”返回列的数据”。它们是总结了所选数据列的结果。虽然它们需要"GROUPBY"子句(后面一个教程介绍),但是这些函数也可以在不用使用"GROUPBY"子句的情况被使用,比如:SELECTAVG(salary)FROMemployee;这条语句将返回单一的结果,它包含了从employee表中所有salary列数据的平均值。为了更好的理解,我们再举个例子:SELECTAVG(salary)FROMemployee;WHEREtitle='Programmer';以上这条语
    句将返回employee表中所有title列为'Programmer'的数据的平均值。下面的例子中使用的语句跟其它合计函数有点不用,因为没有一个类被指定给COUNT函数。这条语句实际上将返回employee表的行数,如下:SELECTCount(*)FROMemployees;最后给出本节教程的配套练习:1)作一个公司的销售表items_ordered,里面有price、product和amount。从items_ordered表中选择price最大的数据。这里提示:使用MAX函数。2)计算items_ordered表中的行数。
    (11)GROUPBY子句
    GROUPBY子句首先讲讲GROUPBY子句语法:SELECTcolumn1,SUM(column2)FROM"list-of-tables"GROUPBY"column-list";这个GROUPBY子句将集中所有的行在一起,它包含了指定列的数据以及允许合计函数来计算一个或者多个列。当然最好解释的方法是给出一个例子啦:假设我们将从employee表中搜索工资最高的列,可以使用以下的SQL语句:SELECTmax(salary),deptFROMemployeeGROUPBYdept;
     老代向大家推荐
    这条语句将在每一个单独的部门中选择工资最高的工资。结果他们的salary和dept将被返回。
    (12)HAVING子句
    HAVING子句下面先给出HAVING子句的语法:SELECTcolumn1,SUM(column2)FROM"list-of-tables"GROUPBY"column-list"HAVING"condition";这个HAVING子句允许你为每一个组指定条件,换句话说,可以根据你指定的条件来选择行。如果你想使用HAVING子句的话,它应该处再GROUPBY子句之后。下面将以一个例子来解释HAVING子句。假设我们的employee表中包含雇员的name、departmen、salary和age。如果你想为每个部门中每个雇员选择平均工资的话,你可以使用下面的SQL语句:SELECTdept,avg(salary)FROMemployeeGROUPBYdept;当然,如果你还想只计算和显示salary大于20000的平均工资的话,你还可以加上HAVING子句:SELECTdept,avg(salary)FROMemployeeGROUPBYdeptHAVINGavg(salary)>20000;
    (13)ORDERBY子句
    ORDERBY子句ORDERBY子句的语法为:SELECTcolumn1,SUM(column2)FROM"list-of-tables"ORDERBY"column-list"[ASC|DESC];[]=optionalORDERBY是一个可选的子句,它允许你根据指定要orderby的列来以上升或者下降的顺序来显示查询的结果。例如:ASC=AscendingOrder–这个是缺省的DESC=DescendingOrder下面举个例子:SELECTemployee_id,dept,name,age,salaryFROMemployee_infoWHEREdept='Sales'ORDERBYsalary;
     老代向大家推荐
    这条SQL语句将从employee_info表中列dept等于'Sales'选择employee_id,、dept、name、age和salary,并且根据他们的salary按升序的顺序来列出检索结果。如果你想对多列排序的话,那么在列与列之间要加上逗号,比如:SELECTemployee_id,dept,name,age,salaryFROMemployee_infoWHEREdept='Sales'ORDERBYs
    alary,ageDESC;
    (14)组合条件和布尔运算符组合条件和布尔运算符
    以下的SQL语句中就含有组合条件:SELECTcolumn1,SUM(column2)FROM"list-of-tables"WHERE"condition1"AND"condition2";AND运算符可以在WHERE子句中连接两个或者多个条件。AND条件的两旁必须都为true(真),即两个条件都同时满足的时候,这些行才将被显示。当然,你也可以使用OR运算符,它也可以在WHERE子句中连接两个或者多个条件。但是,只要OR运算符两旁有一个为true的时候条件就满足了,因此行才会被显示。所以你使用OR运算符的时候,可以是OR运算符两旁只有一个为true或者两旁都为true。下面举个例子吧:SELECTemployeeid,firstname,lastname,title,salaryFROMemployee_infoWHEREsalary>=50000.00ANDtitle='Programmer';这条SQL语句是从employee_info表中选择salary大于等于50000.00并且title等于'Programmer'的列employeeid、firstname、lastname、title和salary。此时必须AND运算符两旁的条件都为真,行才会最为检索结果返回。如果其中有一个条件为假,那么就什么都没有显示。你可以使用圆括号将条件括起来,虽然它们也不一定是必须的,但是括起来看起来更清晰一些,这是一个编程习惯的问题。比如:SELECTemployeeid,firstname,lastname,title,salaryFROMemployee_infoWHERE(salary>=50000.00)AND(title='Programmer');下面再举个例子:SELECTfirstname,lastname,title,salaryFROMemployee_infoWHERE(title='Sales')OR(title='Programmer');这条语句将从employee_info表中选择title等于'Sales'或者等于'Programmer'的列firstname、lastname,title和salary。
    (15)IN和BETWEEN条件运算符
    下面是IN条件运算符的SQL语句:
     老代向大家推荐
    SELECTcolumn1,SUM(column2)FROM"list-of-tables"WHEREcolumn3IN(list-of-values);下面是BETWEEN条件运算符的SQL语句:SELECTcolumn1,SUM(column2)FROM"list-of-tables"WHEREcolumn3BETWEENvalue1ANDvalue2;实际上,IN条件运算符是一个设置成员测试运算符,也就是说,它用于测试是否一个数值处在IN关键字之后提供的数值之中。举个例子如下:SELECTemployeeid,lastname,salaryFROMemployee_infoWHERElastnameIN('Hernandez','Jones','Roberts','Ruiz');这条语句是从employee_info表中选择lastname等于Hernandez、Jones、Roberts或者Ruiz名字之一的列employeeid、lastname和salary。如果它在其中就将返回行。IN条件运算符可以使用混合条件来替代,比如你可以使用等号运算符或者使用OR运算符等等,但是结果是一样的,例如:SELECTemployeeid,lastname,salaryFROMemployee_infoWHERElastname='Hernandez'ORlastname='Jones'ORlastname='Roberts'ORlastname='Ruiz';你可以观察到,利用IN运
    算符时语句会更加简短并且容易读,特别是在你测试两个或者三个数值以上的时候尤为突出。当然你也可以使用NOTIN来在你的列表中排除行的。而BETWEEN条件运算符是用与测试一个数值是否处在BETWEEN关键字两边指定数值的中间,比如:SELECTemployeeid,age,lastname,salaryFROMemployee_infoWHEREageBETWEEN30AND40;这条SQL语句是从employee_info表中选择age处于30到40岁之间(包括30岁和40岁)的列employeeid、age、lastname和salary。这条语句同样可以不用BETWEEN运算符,而使用混合条件来替代,例如:SELECTemployeeid,age,lastname,salaryFROMemployee_infoWHEREage>=30ANDage<=40;当然,你也可以类似于NOTIN的方法,使用NOTBETWEEN来排除一些数据。
    (16)数学运算符数学运算符
    标准的ANSISQL-92支持下面四个基本的算术运算符:+加减
     老代向大家推荐
    */%
    乘除求余
    其中求余运算符决定除法的余数。这个运算符不是ANSISQL支持的,但是,绝大多数的数据库支持他。下面是一些有用的数学函数,因为可能要用到它,所以我这里要集中提一下。在ANSISQL-92中不支持这些函数,但是它们可能对于某些特殊的RDBMS是有效的。然而它们对于几个主要的数据库系统都是有效的。下面就说说这些数学函数吧:ABS(x)SIGN(x)MOD(x,y)FLOOR(x)CEILING(x)或CEIL(x)POWER(x,y)ROUND(x)ROUND(x,d)SQRT(x)返回x的绝对值当x为负数、零、正数的时候分别返回x的符号-1、0或者1返回x除以y的余数,跟x%y作用一样返回小于等于x的最大整数返回大于等于x的最小整数返回x的y次方的数值返回最接近于x的数返回小数点数为4的接近于x的数返回x的平方根
    下面举个例子:SELECTround(salary),firstnameFROMemployee_info上面这条语句将从employee_info表中选择salary最接近的数以及firstname列。
    (17)JOIN子句
    不知你有没有发现直到现在我们利用SELECT语句来检索的时候只能从一个表中进行。如果你想从两个表或者更多的表中进行检索,该怎么办呢?好在我们可以使用SQL和关系数据库系统的一个很有用的特性,即"Join"。为了简单说明,实际上"Join"就是使得关系数据库系统相关的东东。"Join"允许你从两个表或者更多的表连接数据进行数据检索,而只需要利用一个SELECT语句。如果在FROM关键字之后有多个表的话,"Join"可以在SQLSELECT语句中识别它们。下面举个例子:SELECT"list-of-columns"FROMtable1,table2WHERE"search-condition(s)""Join"
     老代向大家推荐
    通过示范当你只处理一个表的时候会发生什么事情可以使得"Join"的解释更简单,所以这里我没有使用"Join"。这个单一的数据库有事也被称
    为"flattable"(平表)。现在你有一个表的数据库用来检索所有顾客的信息以及他们从你的商店买了什么,下面就是这个表的所有列:
    每次一个新行被插入到表中,所有的列都将被更新,这样就导致了不必要的”多余数据”。比如,每次Jenny买东西,下面的行都将被插入到表中:
    为了避免”多余数据”,一个最好的方法:让数据库有两个表:其中一个用来对顾客保持跟踪;另外一个用来对他们买什么东西保持跟踪。即有"Customer_info"表和"Purchases"表:"Customer_info"表为:customer_numberfirstnamelastnameaddresscitystateipz
    "Purchases"表为:customer_number现在开始,不管顾客什么时候进行重复的购物,只有第二个表"Purchases"需要更新。这样我们就减少了多余的数据,也就是说我们规格化了这个数据库。你仔细点就会发现两个表中还是有一个"cusomer_number"列是相同的。这个列包含了单独的顾客号,它将用来JOIN(连接)两个表。下面举个例子来使用这两个表,假如你想搜索顾客的名字以及他们所买的东西,你可以使用以下的语句来实现:SELECTcustomer_info.firstname,customer_info.lastname,purchases.itemFROMcustomer_info,purchasesWHEREcustomer_info.customer_number=purchases.customer_number;特殊的"Join"有为"InnerJoin"或者"Equijoin",这是一个最常见的"Join"类型,以后我们经常用使用到或者看到。dateitemprice
     老代向大家推荐
    这里要注意每列总是在表名之前,这却也不是必需的。这是一个好的练习对于帮助你澄清列后面跟着表的认识有很大帮助。如果两个表之间有一个相同的列,它就是必须的。我这里推荐在使用JOIN的时候最好在所有列之后加上表名。注意;上面描述的这个语法将在绝大多数的数据库系统起作用,本教程的也是一样。但是结果你会发现你上面的语句并不起作用,请仔细检查一下吧。当然你可以试一试修改以上的代码,你可以使用JOIN(ANSISQL-92语法规范中的INNERJOIN):SELECTcustomer_info.firstname,customer_info.lastname,purchases.itemFROMcustomer_infoINNERJOINpurchasesONcustomer_info.customer_number=purchases.customer_number;再举另外一个例子:SELECTemployee_info.employeeid,employee_info.lastname,employee_salesissionFROMemployee_info,employee_salesWHEREemployee_info.employeeid=employee_sales.employeeid;这个例子将从employee_info和employee_sales表中选择当employee_info表的employeeid等于employee_sales表的employeeid的employeeid、emplyee_info表中lastname以及employee_sales表中的comission数值。从上面的例子中可以发现利用JION的语句比价简练。既然有这样的有点,我们何乐而不为呢?
    (18)索引索引
    索
    引允许DBMS更快地访问数据。系统创建了这个内部地数据结构(即索引),它导致当查询以列为索引的时候搜索行,这样查询会快得多。这个索引对于给定列索引数值的时通知DBMS找到表中某一行,这有点象书的索引,它告诉你对于给定的字你能找到哪一页。下面让我们在AntiqueOwners列中为OwnerID创建索引:CREATEINDEXOID_IDXONANTIQUEOWNERS(OWNERID);下面语句是为名字创建所以:CREATEINDEXNAME_IDXONANTIQUEOWNERS(OWNERLASTNAME,OWNERFIRSTNAME);为了删除索引,你可以利用DROP:DROPINDEXOID_IDX;就象前面教程中,我们也可以"drop"(删除)一个表。上面第二个例子中,是在两列上创建索引的。有些DBMS不强迫要求主键,换句话说就是,类的唯一性不会自动强制。这是什么意思呢,好象听起来云里雾里的。好吧,再给你举个例子,如果你象插入另外一行到AntiqueOwners表中,比如这个OwnerID是02,有些系统可以让你这样做即使我们要求所有行的数值都要是不同的。为了避免两行有相同的值,我们有一种方法来克服,就是在列上创建唯一的索引,而在这个列上我们需要它成为主键,这样就可以系统不会出现复制的情况:CREATEUNIQUEINDEXOID_IDXONANTIQUEOWNERS(OWNERID);
     老代向大家推荐
    (19)DISTINCT和排除复制
    假如你象列出所有买过古董的ID和名字,很明显,你可能会将所有的顾客都列出来而没有考虑有些顾客是买过多讲古董的,所以这时你会发现有些数据是重复的。这就意味着你需要通知SQL来排除复制的行,而不管这个顾客买过多少个古董只需要列出一次即可。为了实现这个目的,你可以使用DISTINCT关键字。首先我们需要为AntiqueOwners表来一个equijoin以得到顾客的LastName和First的详细数据。但是,你要考虑到Antiques表中的SellerID列是AntiqueOwners表的一个外码,所以顾客只能在AntiqueOwners表列出ID和名字的行才被列出。我们还想在列的数据中排除SellerID复制的发生,所以我们要在发生重复的列上使用DISTINCT。为了防止复制的发生,我们还想将LastName以字母顺序排列,然后在按字母顺序排列FirstName最后排列OwnerID,因此我们还必须使用ORDERBY子句,具体语句如下:SELECTDISTINCTSELLERID,OWNERLASTNAME,OWNERFIRSTNAMEFROMANTIQUES,ANTIQUEOWNERSWHERESELLERID=OWNERIDORDERBYOWNERLASTNAME,OWNERFIRSTNAME,OWNERID在这个例子中,因为每个人都买都一个件古董,所以我们将Lasname以字母顺序列出所有的古董拥有者。
    (20)Aliases、In以及子查询
    在本节教程中,我们将要介绍Aliases、In以及子查询的用法。首先我们看一下一个查询语句,它搜索所有已经定货的顾客的
    LastName以及他们定什么货,语句如下:SELECTOWN.OWNERLASTNAMELastName,ORD.ITEMDESIREDItemOrderedFROMORDERSORD,ANTIQUEOWNERSOWNWHEREORD.OWNERID=OWN.OWNERIDANDORD.ITEMDESIREDIN(SELECTITEMFROMANTIQUES);这条查询语句的结果为:LastNameItemOrdered--------------------SmithTableSmithDeskAkinsChairLawsonMirror下面好好解释一下上面的这条语句:"LastName"和"ItemOrdered"给出了报告的数据头。OWN&;ORD是aliases(别名),它们使用在FROM子句中,可在它们的后面加一个点号再加列名就可以进行查询了。这样做就避免了模棱两可的情况,特别是在equijoinWHERE子句中当两个列都名为OwenerID的时候,而点号就通知SQL我们使用是两个不同表的不同OwnerID。这里要注意,在FROM子句中Orders表被首先列出,并且确保AntiqueOwners表只用
     老代向大家推荐
    于详细的信息(LastName)。更为重要的,在WHERE子句中的AND强迫In子查询被调用("=ANY"or"=SOME"都等价于使用IN)。但这到底做了些什么呢?当这个子查询完成了,它就返回Antiques表的所有Items因为这里没有WHERE子句。然后,对于从Orders表列出的行,ItemDesired必须在从Antiques表中返回的Items列表中,然后在定货可以有另外的拥有者填写的情况下列出一个item。你可以想想这个方法:子查询从Orders表中的每一个ItemDesired被比较中返回一系列的Items;如果ItemDesired是在从Antiques表中返回的,那么条件才为真。
    (21)更多的子查询更多的子查询
    我们可以使用在SELECT查询语句中再包括一个SELECT子查询语句。举个例子吧,首先我们列除所有购买贵重物品的顾客,贵重物品的标准是比所有卖出的物品价钱的平均值多100元的物品。具体语句如下:SELECTOWNERIDFROMANTIQUESWHEREPRICE>(SELECTAVG(PRICE)+100FROMANTIQUES);上面子查询语句是计算物品的平均价格再加100元,并搜索所有在ANTIQUES表中PRICE大于这个数值的OWNERID。这里你可以使用DISTINCTOWNERID来排除复制的现象。下面的语句列出了所有在AntiqueOwners表中的有买过物品的人的LastName:SELECTOWNERLASTNAMEFROMANTIQUEOWNERSWHEREOWNERID=(SELECTDISTINCTBUYERIDFROMANTIQUES);这个子查询返回了一系列的顾客,当且仅当物品拥有者的ID出现在子查询的列表中,古董的拥有者的LastName才会显示出来。为了更新这个例子,我们假设有一个买过bookcase的顾客,他的FirstName在数据库中出错了,应该为John:UPDATEANTIQUEOWNERSSETOWNERFIRSTNAME='John'WHEREOWNERID=(SELECTBUYERIDFROMANTIQUESWHEREITEM='Bookcase');上面的语句中的子查询首先搜索买过bookcase的顾客的BuyerID,然后在外层的查询中来更新他的Fi
    rstName。
     老代向大家推荐
    (22)EXISTS和ALL
    EXISTS使用了一个子查询作为条件,只有当子查询返回行的时候这个条件才为真,如果子查询不返回任何的行条件就为假。如果商店在处理Chair的时候,有个顾客想看看所有拥有者的列表,就可以使用EXSIST,语句如下:SELECTOWNERFIRSTNAME,OWNERLASTNAMEFROMANTIQUEOWNERSWHEREEXISTS(SELECT*FROMANTIQUESWHEREITEM='Chair');如果在Antiques列中有Chair,那么子查询就会返回一行或者多行,就使得EXISTS子句为真,然后让SQL列出拥有者来。如果没有搜索到Chair,则没有行被返回,条件就为假。ALL是另外一个不寻常的关键字,因为ALL查询通常可以用不同的方法来进行,并且可能是一种更为简单的方法。举个例子来说明吧:SELECTBUYERID,ITEMFROMANTIQUESWHEREPRICE>=ALL(SELECTPRICEFROMANTIQUES);上面这条语句将返回最高价格的Item以及它的买方。子查询返回了Antiques表中的所有的Price列,而外层的查询逐行查询Antiques表,并且如果它的Price大于等于(或者ALL)列中的Prices,它就会被列出,它就是最好价格的Item。这里必须使用">="的原因是最高价格的Item要等于列表中的最高价格,因为这个Item在Price列中。
    (23)UNION和外部连接
    有些时候,你可以想一起看多个查询的结果、组合它们的输出,你可以使用UNION关键字。为了合并以下两个查询的输出:显示所有买方的ID和已经有定货的顾客,你可以使用以下语句:SELECTBUYERIDFROMANTIQUEOWNERSUNIONSELECTOWNERIDFROMORDERS;这里要注意SQL要求SELECT的列表必须匹配,即列于数据类型匹配。在本例子中,BuyerID和OwnerID都是相同的数据类型,同为Interger(整型)。同时还有一提的是,SQL但使用UNION的使用会进行自动复制排除。而在单一的查询中,你就必须使用DISTINCT。OuterJoin(外部连接)通常是在JOIN查询被联合,而行没有包括到JOIN中的时候使用,特别是在常量文本"flags"被包括的时候尤为有用。下面我们看看这个查询先:SELECTOWNERID,'isinbothOrders&;Antiques'FROMORDERS,ANTIQUESWHEREOWNERID=BUYERID
     老代向大家推荐
    UNIONSELECTBUYERID,'isinAntiquesonly'FROMANTIQUESWHEREBUYERIDNOTIN(SELECTOWNERIDFROMORDERS);第一个查询做了一个连接以列出两个表中的每个owener,并且在ID后面放置一个标记线来重复引用。这个UNION合并了这个列表以及以下第二个的列表。第二个列表是列出不是在Orders表的ID,这样就产生了在JOIN查询之外的ID列表,它是利用引用标签列出的。这可能是一种最容易的方法来产生这个列表。这个概念对于主键跟外码有关的状况是很有用的,但是有些主键
    的外码值是NULL。比如,在一个表中,主键是salesperson,而在其它的表中主键是customers,并且它们的salesperson列在相同的行。然而,如果salesperson没有customers的时候,这个人的名字就不会出现在customer表中。如果所有salespersons的列表要显示出来,那么就要外部连接了。
    (24)嵌入式SQL嵌入式嵌入
    为了更好的理解嵌入式SQL,本节利用一个具体例子来说明。嵌入式SQL允许程序连接数据库并且包括SQL代码到程序中,这样在程序中就可以对数据库进行使用、操作以及处理数据等等。以下是用C语言编写的使用嵌入SQL的例程,它将打印一个报告;这个程序必须在普通的编译之前先预编译SQL语句。嵌入SQL对于不同系统是不一样的,所以在不同的系统中对以下的程序稍作修改,特别是变量的声明以及过程记录等。在嵌入SQL时,考虑网络、数据库管理系统、操作系统是相当重要的。以下是详细的代码:#include/*以下这部分是声明主机变量,它将使用于程序中*/EXECSQLBEGINDECLARESECTION;intBuyerID;charFirstName[100],LastName[100],Item[100];EXECSQLENDDECLARESECTION;/*以下包括SQLCA变量,它可以用来进行错误检查*/EXECSQLINCLUDESQLCA;main(){/*以下连接数据库*/EXECSQLCONNECTUserID/Password;/*以下是连接数据库并检查是否有错误产生T*/if(sqlca.sqlcode){printf(Printer,"Errorconnectingtodatabaseserver.\n");exit();}printf("Connectedtodatabaseserver.\n");/*下面声明一个"Cursor"。它将在查询结果多于一行的时候使用*/
     老代向大家推荐
    EXECSQLDECLAREItemCursorCURSORFORSELECTITEM,BUYERIDFROMANTIQUESORDERBYITEM;EXECSQLOPENItemCursor;/*你可以在这里还可以加入另外一些错误检查的内容,这里就省略了*//*当这个CURSOR没有数据,sqlcode将被产生以允许我们退出循环。这里注意,为了简单起见,我们使程序遇到错误的时候就退出任何的sqlcode。*/EXECSQLFETCHItemCursorINTO:Item,:BuyerID;while(!sqlca.sqlcode){EXECSQLUPDATEANTIQUESSETPRICE=PRICE+5WHEREITEM=:ItemANDBUYERID=:BuyerID;EXECSQLSELECTOWNERFIRSTNAME,OWNERLASTNAMEINTO:FirstName,:LastNameFROMANTIQUEOWNERSWHEREBUYERID=:BuyerID;printf("%25s%25s%25s",FirstName,LastName,Item);EXECSQLFETCHItemCursorINTO:Item,:BuyerID;}/*关闭CURSOR,提交变化并退出程序。*/EXECSQLCLOSEDataCursor;EXECSQLCOMMITRELEASE;exit();}
    在SQLServer中保存和输出图片
    有时候我们需要保存一些binarydata进数据库。SQLServer提供一个叫做image的特殊数据类型供我们保存binarydata。Binarydata可以是图片、文档等。在这篇文章中我们将看到如何在SQLServer中保存和输出图片。建表为了试验这个例子
    你需要一个含有数据的table(你可以在现在的库中创建它,也可以创建一个新的数据库),下面是它的结构:ColumnNameDatatypePurposeIDIntegeridentitycolumnPrimarykey
     老代向大家推荐
    IMGTITLEVarchar(50)StoressomeuserfriendlytitletoidentitytheimageIMGTYPEVarchar(50)Storesimagecontenttype.ThiswillbesameasrecognizedcontenttypesofASP.NETIMGDATAImageStoresactualimageorbinarydata.保存images进SQLServer数据库为了保存图片到table你首先得从客户端上传它们到你的web服务器。你可以创建一个webform,用TextBox得到图片的标题,用HTMLFileServerControl得到图片文件。确信你设定了Form的encType属性为multipart/form-data。Streamimgdatastream=File1.PostedFile.InputStream;intimgdatalen=File1.PostedFile.ContentLength;stringimgtype=File1.PostedFile.ContentType;stringimgtitle=TextBox1.Text;byte[]imgdata=newbyte[imgdatalen];intn=imgdatastream.Read(imgdata,0,imgdatalen);stringconnstr=((NameValueCollection)Context.GetConfig("appSettings"))["connstr"];SqlConnectionconnection=newSqlConnection(connstr);SqlCommandcommand=newSqlCommand("INSERTINTOImageStore(imgtitle,imgtype,imgdata)VALUES(@imgtitle,@imgtype,@imgdata)",connection);SqlParameterparamTitle=newSqlParameter("@imgtitle",SqlDbType.VarChar,50);paramTitle.Value=imgtitle;command.Parameters.Add(paramTitle);SqlParameterparamData=newSqlParameter("@imgdata",SqlDbType.Image);paramData.Value=imgdata;command.Parameters.Add(paramData);SqlParameterparamType=newSqlParameter("@imgtype",SqlDbType.VarChar,50);paramType.Value=imgtype;command.Parameters.Add(paramType);connection.Open();intnumRowsAffected=command.ExecuteNonQuery();connection.Close();从数据库中输出图片现在让我们从数据库中取出我们刚刚保存的图片,在这儿,我们将直接将图片输出至浏
     老代向大家推荐
    览器。你也可以将它保存为一个文件或做任何你想做的。privatevoidPage_Load(objectsender,System.EventArgse){stringimgid=Request.QueryString["imgid"];stringconnstr=((NameValueCollection)Context.GetConfig("appSettings"))["connstr"];stringsql="SELECTimgdata,imgtypeFROMImageStoreWHEREid="+imgid;SqlConnectionconnection=newSqlConnection(connstr);SqlCommandcommand=newSqlCommand(sql,connection);connection.Open();SqlDataReaderdr=command.ExecuteReader();if(dr.Read()){Response.ContentType=dr["imgtype"].ToString();Response.BinaryWrite((byte[])dr["imgdata"]);}connection.Close();}在上面的代码中我们使用了一个已经打开的数据库,通过datareader选择images。接着用Response.BinaryWrite代替Response.Write来显示image文件。
    数据库的备份与恢复
    随着信息时代和互联网技术的飞速发展,企业的信息数据量也急剧增长。如何避免突如
    其来的数据破坏(如:黑客攻击、病毒袭击、硬件故障和人为误操作等),提高数据的安全性和数据恢复能力一直是用户和厂商关注的焦点。备份是恢复数据最容易和最有效的保证方法,备份应定期进行,并执行有效的数据管理。Microsoft公司的SQLServer是一个功能完善的数据库管理系统,由于和Windows操作系统无缝结合,操作简便易行,应用十分广泛。下面来看一看基于NT的SQLServer7.0的备份与数据恢复的有效方法。针对服务器系统由于数据库服务器中安装的系统较多,设置复杂,如出现硬件故障,则必须重装系统,恢复设置,因此有必要对数据库服务器进行备份。1、使用NTServer提供的功能在防止数据丢失方面,NT的磁盘管理器具有强大的功能,它支持RAID的第0、1、5级。其中RAID1级是指把一个驱动器上的某一分区在另一个上建立一个镜像。进行写操作时,数据将向两个磁盘中写入同样的数据,读取时可以从两个磁盘同时读取。当驱动器损坏时,由它的镜像来进行恢复。2、使用第三方备份工具采用其他公司的备份软件来对服务器系统做备份。笔者常用的是Norton公司的磁盘备份工具——Ghost。该软件可以直接将磁盘上的某个分区或整个硬盘克隆成一个镜像文件,然后把它存放在别处,那么当该分区或硬盘出现问题甚至毁坏时,使用Ghost在另一硬盘或分区上,利用镜像文件快速还原。
     老代向大家推荐
    针对SQLServer1、在本地机上进行数据库备份先确认SQLServer服务是否已经启动,如果没有启动,则使用SQLServer7.0程序菜单中的“SQLServerServiceManager”进行启动,然后打开“EnterpriseManager”,展开左边的SQLServerGroup,展开SQLServer中的“Databases”,单击右键,在菜单中选择“所有任务”选项中的“BackupDatabase”子选项,出现如图1的数据库备份画面。
    图1选好要备份的数据库及备份方式后,单击[Add]按钮,在对话框中设置好存放目录及文件名,单击[OK]按钮。如果要设置定期自动备份,可在“Schedule”中设置,完毕后,单击[确定]按钮,数据库备份就开始执行了。2、在本地机上进行数据库恢复启动“EnterpriseManager”,展开其中的选项,选择“Databases”,单击右键,在对话框中选择“所有任务”选项中的“RestoreDatabase”(如图2)。
    图2单击[SelectDevices]按钮,选择要恢复的数据库文件。选择完毕后,“BackupNumber”
     老代向大家推荐
    选项将会变亮,选择最近的一次备份。然后单击[确定],数据库恢复过程开始执行。3、将数据库导出到网络上的另一台计算机上进行备份与恢复先在网络上的另一台计算
    机上安装一个新的SQLServer,并启动它建立好数据库结构。然后在本机上启动“EnterpriseManager”,在左边的目录栏中选中“SQLServerGroup”,单击右键,在对话框中选择“NewSQLServerRegistration”进入注册向导,,输入目标SQLServer的计算机名后,填写登录ID和密码,将目标SQLServer注册在本机的“SQLServerGroup”中。然后选择“Databases”中需要备份的数据库标志,单击右键,在对话框选择“所有任务”中的“ExportData...”选项。在弹出“DateTransferServicesExportWizard”的界面后,单击[下一步]按钮,选择需要备份的数据库,接着单击[下一步]按钮,选择目标服务器,选择SQLServer验证模式,填写用户名和密码,在“Database”一项中输入新的数据库名称(如图3),单击[下一步]按钮,进入导出方式的界面,设置好之后,单击[下一步]按钮,在下面的步骤中一般选择默认选项,可以顺利完成数据库的导出操作了。
    图3两个SQLServer中具有相同的数据库,当原来的数据库崩溃后,就可以直接启用另一个,只是修改一下计算机上ODBC数据源中所设置的SQLServer主机名称。
    网络数据库设计入门(一)SQL语言简介
    这一教程是对网络数据库设计的一个入门介绍,简要地介绍了SQL语言的基础以及如何使用MSACCESS和MSSQLSEVER建立网络数据库。通过本教程的学习,你可以建立、访问和操作你的数据库,可以学会如何使用SQL语句检索、增加、更新、删除数据库表中的内容。这对于任何有关数据库的操作和开发都具有重要意义。1.1SQL语言简介1.1.1SQL语言及其优点1.1.2SQL语言的分类及语法1.2中小型关系型数据库简介1.2.1关系型数据库简介1.2.2Access数据库及其基本操作1.2.3SQLServer数据库及其基本操作
     老代向大家推荐
    1.3ODBC与ADO对象1.3.1ASP访问数据库的几种方式1.3.2创建和配置ODBC数据源1.3.3用ADO实现访问数据库1.1SQL语言简介SQL是英文(StructuredQueryLanguage)的缩写,意思为结构化查询语言。SQL语言的主要功能就是同各种数据库建立联系,进行沟通。按照ANSI(美国国家标准协会)的规定,SQL被作为关系型数据库管理系统的标准语言。SQL语句可以用来执行各种各样的操作,例如更新数据库中的数据,从数据库中提取数据等。目前,绝大多数流行的关系型数据库管理系统,如Oracle,Sybase,MicrosoftSQLServer,Access等都采用了SQL语言标准。
    (二)SQL语言及其优点二
    1.1.1SQL语言及其优点首先,让我们来了解一下使用SQL语言的优点:●非过程化语言●统一的语言●是所有关系数据库的公共语言1.非过程化语言SQL是一个非过程
    化的语言,因为它一次处理一个记录,对数据提供自动导航。SQL允许用户在高层的数据结构上工作,而不对单个记录进行操作,可操作记录集,所有SQL语句接受集合作为输入,返回集合作为输出。SQL的集合特性允许一条SQL语句的结果作为另一条SQL语句的输入。SQL不要求用户指定对数据的存放方法,这种特性使用户更易集中精力于要得到的结果;所有SQL语句使用查询优化器,它是RDBMS的一部分,由它决定对指定数据存取的最快速度的手段,查询优化器知道存在什么索引,在哪儿使用索引合适,而用户则从不需要知道表是否有索引、有什么类型的索引。2.统一的语言SQL可用于所有用户的DB活动模型,包括系统管理员、数据库管理员、应用程序员、决策支持系统人员及许多其它类型的终端用户。基本的SQL命令只需很少时间就能学会,最高级的命令在几天内便可掌握。SQL为许多任务提供了命令,其中包括:●查询数据●在表中插入、修改和删除记录●建立、修改和删除数据对象●控制对数据和数据对象的存取●保证数据库一致性和完整性以前的数据库管理系统为上述各类操作提供单独的语言,而SQL将全部任务统一在一种语言中。3.是所有关系数据库的公共语言由于所有主要的关系数据库管理系统都支持SQL语言,用户可将使用SQL的技能从一个RDBMS(关系数据库管理系统)转到另一个,所有用SQL编写的程序都是可以移植的。
     老代向大家推荐
    (三)SQL语言的分类及语法三
    1.1.2SQL语言的分类及语法可执行的SQL语句的种类数目之多是惊人的。使用SQL,你可以执行任何功能:从一个简单的表查询,到创建表和存储过程,到设定用户权限。在这个章节中,我们将重点讲述如何从数据库中检索、更新和报告数据,也是基于这个目的,我们应该了解的最重要的SQL语句是:●SELCET●INSERT●UPDATE●DELETE●CREAT●DROP以上这些命令可简要描述如表1.1所示,这些命令看起来并不困难,在下面的例子中,我们将在实例中应用这些命令,了解其功能。表1.1重要的SQL语句命令SELECTINSERTUPDATEDELETECREATEDROP类别数据查询语言数据操纵语言数据操纵语言数据操纵语言数据定义语言数据定义语言说明从一个表或多个表中检索列和行向一个表中增加行更新表中已存在的行的某几列从一个表中删除行按特定的表模式创建一个新表删除一张表
    1.SELECT语句语法表1.2SELECT语句的组件组件SELECTFROMWHEREGROUPBYHAVINGORDERBY说明指明要检索的数据的列指明从哪(几)个表中进行检索指明返回数据必须满足的标准指明返回
    的列数据通过某些条件来形成组指明返回的集合必须满足的标准指明返回的行的排序顺序
    下面我们对这个重要的语句语法进行示例讲解,需要说明的是这一章节中所涉及到的例子都是基于图1.1描述的表结构。Authorsidnamephoneaddresszipsalarycontract
     老代向大家推荐
    图1.1在test数据库中的authors表的结构●一个简单的SELECT语句:SELECTid,name,phone,zipFromauthors这个简单的查询的结果得出的内容为authors表中返回的选定列的数据。在同样的检索情况下,如果你想缩小范围,比如只想知道住在福州鼓楼地区(邮编为350002)的作者的名字,你可以接着看后面的例子;●添加WHERE子句SELECTid,name,phone,zipFromauthorsWHEREzip=‘350002’在检索表行时,WHERE子句可以使用多个列作为约束内容,当然在检索约束内容中还可以加入通过AND、OR以实现多个约束。另外,在SELECT语句中我们还可以通过更改比较操作符来改变约束的条件,以达到我们需要的检索目的。我们再看一个例子;●完整约束查询SELECTid,name,phone,zipFromauthorsWHEREzip<>‘350002’ANDphone=‘1234567’这个例子查询结果返回的是住在福州鼓楼地区以外(邮编号不为350002)的且电话号码为1234567的作者的资料。表1.3SELECT语句中支持的比较操作符操作符=><>=<=<>INBETWWEEN..ANDLIKE说明等于大于小于大于等于小于等于不等于位于指定列表值中,或者指定的子查询的结果中位于两个值之间包含与指定串相同的模式。此模式将与一个或多个通配符的串相比较
    ●添加ORDERBY子句SELECTid,name,phone,zipFromauthorsWHEREzip=‘350002‘ORDERBYid这样,这条SQL语句返回的结果将id列的升序排序。1.1.2SQL语言的分类及语法2.INSERT语句语法表1.4INSERT语句的组件组件说明
     老代向大家推荐
    INSERTINTOVALUESSELECT
    指明要向哪个表中加入行同时列出指定加入的列,如未指定的对象为表中的每一列指明在列表中各列的填充值SELECT语句返回被加到表中的各行
    ●一个简单的INSERT语句:INSERTINTOauthorsVALUES(‘FZ1234’,’张三’,’1234567’,’深圳幸运计算机公司’,’350002’,’本文作者’)这样,便向表中加入了一条记录。我们也可以指明用哪几列来填充,看下面的例子;●一个简单的INSERT语句:INSERTINTOauthors(id,name,phone)VALUES(‘FZ3456’,’李四’,’7654321’)通过上面两个例子的方法,我们就可以往数据库中添加内容了,需要注意的是,我们插入值(包含在VALUES部分中的)要按照INSERTINTO部分中指明的列的顺序,或是在未指明的条件下按照数据库原始各列的顺序。3.UPDATE语句语法表1.3
    UPDATE语句的组件组件UPDATESETFROMWHERE说明指明要更新的表指明用来更新的列和分配给那些列的新值指明UPDATE语句所以处理的对象表指明要更新的数据所满足的标准
    ●将列设定为确定值:UPDATEauthorsSETzip=‘350003’WHEREid=‘FZ4567’通过这个语句我们可以把数据库中id为FZ4567的条记录的zip列的值改为350003。这时如果我们无法给出确定的值,比如我们要给id为FZ1234的那位作者加薪100元,则可以这样改写SQL语句语句;●基于已有的值来设置新的列值UPDATEauthorsSETsalary=salary+100WHEREid=‘FZ1234’这样,即使不知道authors表中的salary列值,也可以用一条简单的UPDATE语句成功地把薪水增加100。1.DELETE语句语法表1.4DELETE语句的组件组件DELETEFROMWHERE说明指明要执行删除操作的表指明要删除行所满足的标准
     老代向大家推荐
    ●删除一个表中的所有值:DELETEFROMauthors这条语句的执行结果是删除authors表中的所有行。●删除一个表中的指定的行DELETEFROMauthorsWHEREid=‘FZ1234’这条语句的执行结果是删表authors中id为FZ1234的行。在前面的一部分内容中我们讲述了最常用的SQL语句的基本方法,但这只是SQL语句的一部分,其它的SQL语句由于不常用就不一一讲述了。各位读者如果有兴趣可以参考一些专门的SQL语法资料,这将能使你更好地操纵数据库,更好地通过数据库来帮助你完成你的工作。
    (四)中小型关系型数据库简介四中小型关系型数据库简介
    1.2中小型关系型数据库简介1.2.1关系型数据库简介在我们对数据库操作进行讲解前,我们觉得有必要向大家介绍一下关系型数据库这个概念,因为我们觉得无论是你做什么样的系统,都或多或少要接触到数据库,而现在提到数据库,当然就是关系型数据库了。那么,什么是关系型数据库(RDB)呢?在关系型数据库中数据以行和列的形式存储,以便于用户理解,这一系列的行和列被称为表,一组表便组成了数据库。在关系数据库中:各数据项之间用关系来组织,关系(relationship)是表之间的一种连接,通过关系,我们可以更灵活地表示和操纵数据;另外,用户可以非常方便的用查询(Query)来检索数据库中的数据,一个Query是一个用于指定数据库中行和列的SELECT语句。关系型数据库通常包含下列组件:●客户端应用程序(Client)●数据库服务器(Server)●数据库(Database)SQL是Client端通往Server端的桥梁,Client用SQL来象Server端发送请求,Server返回Client端要求的结果。现在比较流行的大中型关系型数据库有IBMDB2、Oracle、SQLServer、SyBase、Informix等
    ,常用的小型数据库有Access、Pradox、Foxpro等,现在个人用户比较常用的主要是基于中小型数据库MSSQLServer和Access的,所以在以下的篇幅中我们介绍这两种数据库系统的简单操作。
    (五)Access数据库及其基本操作五
    1.2.2Access数据库及其基本操作Access是一个数据库管理系统,它之所以被集成到Office中而不是VisualStudio中,是因为它与其它的数据库管理系统(如VisualFoxPro)相比更加简单易学,一个普通的计算机用户即可掌握并使用它。而且最重要的一点是,Access的功能足够强大,足以应付一般的数据管理及处理需要。下面,让我们以用MSAccess创建一个数据库为例介绍这种数据库的基本用法,需要说明的
     老代向大家推荐
    是,该数据库中包含了一张结构如图1.1的表。1.新建数据库新建一个数据库有两种方法:一种是创建一个空数据库,即建立一个没有表、查询、窗体和报表等内容的数据库;另一种方法是使用Access中提供的数据库模板创建数据库,即通过对向导所提出的选项和不同选择来设计窗体、查询和报表等,从而建立一个完整的数据库。这里我们将使用第一种方法:Step1:在Access窗口中单击“文件(F)”菜单,在下拉菜单中选择“新建”项,将得到如图1.2所示的对话框。
    图1.2“新建”对话框Step2:双击“数据库”图标,即会显示“文件新建数据库”对话框,如图1.3所示
    图1.3“文件新建数据库”对话框Step3:在文件名文本框中输入要保存数据库的文件夹及新建的数据库名,如“C:\test”,然后选择“确定”。即可创建好一个名为“test”的数据库,并显示如图1.4。
     老代向大家推荐
    图1.4test数据库窗口二.添加数据表表是Access数据库的基础,是信息的载体。其它对象如查询、窗体和报表,也是将表中的信息以各种形式表现出来,方便用户使用这些信息。在Access中,创建表的方法有三种:一是使用设计器创建表;二是通过输入数据创建表;三是利用向导创建表。在这里,我们采用第一种方法创建表:Step4:在图1.4的窗体中,双击“使用设计器创建表”,则会出现如图1.5所示的对话框。
    图1.5表设计器对话框Step5:“字段名称”在列的第一行中输入authors表的第一个字段的名字id。然后按回车键,此时在“数据类型”列中会显示出一个按钮,单击按钮,在弹出的下拉列表中选择“文本”选项,设置id字段的类型为文本型。如图1.6所示。
     老代向大家推荐
    图1.6设置字段数据类型Step6:在“字段属性”域的“常规”选项卡中,可以设置字段的大小、格式和规则等。如我们可以把
    id字段的长度大小设置为12,并且规定其不能为空,因此,可以设置如下:“字在段大小”文本框中输入12,在“必填字段”文本框中输入“是”,在“允许空字符串”文本框中输入“否”。如图1.7所示。
    图1.7设置字段属性内容Step7:重复上述方法,添加其它字段,并设置其属性。Step8:设置完成后,单击“文件(F)”菜单,在下拉菜单中选择“保存”项,将会出现一个如图1.8的对话框,在“表名称”文本框中输入表名authors,单击确定按钮。
     老代向大家推荐
    图1.8“保存”对话框Step9:此时,系统会提示用户建立一关键字段。一般情况下单击“是”完成即可。1.2.2Access数据库及其基本操作三.表的操作在添加了数据表之后,我们实际上就初步地完成了一个数据库的建立工作,接下来我们就可以通过SQL语句对数据库进行操作。当然,在Access中,对表的操作十分的方便,可以浏览表;为表添加、删除备忘录;对表记录进行排序,因为Access是面向一些普通用户的,所以其操作方法不必要用户清楚SQL语句的语法及结构。在此,我们就简要地介绍一下在Access环境下表的操作。(1)浏览表打开原先建立的test数据库,在对象栏中双击authors表的图1.标即可打开表authors。如图1.9所示。
    图1.9查看表在打开了数据表之后,我们就可以通过记录选定器(图1.9中左边界的栏目),定位按钮(图1.9中左下方)和滚动条(在记录长度和数据超过一屏可以显示的范围时,窗体将自在右边界与右下边界出现滚动条)。(2)添加与编辑记录在打开了的查看窗体中即可添加与编辑记录,其方法如图1.10所示。
    图1.10添加与编辑表内容(3)删除表中的记录对表中记录的删除两种,一种是删一条的记录,其操作方法如图1.11所示,单击该条记录左边的记录选定器选定该记录,然后单击右键,在弹出的菜单中选择删除记录即可;另一种
     老代向大家推荐
    操作是删除多条记录,其方法如图1.12所示,单击第一条要删除的第一条记录的记录选定器,同时不要松开鼠标,继续向下拖动,直至覆盖要删除的其它记录为止,然后单击右键并在弹出菜单中选择删除记录。
    图1.11删除单条记录
    图1.12删除多条记录
    (六)SQLServer数据库及其基本操作六
    1.2.3SQLServer数据库及其基本操作SQLServer是一种高效的关系数据库系统,它与WindowsNT/2000及Windows9x等操作系统紧密集成。这种安排使SQLServer能充分利用操作系统所提供的特性。对于今天复杂的客户/服务器系统来说,SQLServer是一个很好的选择。下面,还是让我们以图1.1所示的表为例,
    在SQLServer中建立一个test数据库,test库中包含了该表。1.新建数据库Step1:启动SQLServerEnterpriseManager,单击服务器旁的加号(+),其中便包含了已有的
     老代向大家推荐
    数据库。Step2:在Databases文件夹上单击鼠票右键,选择NewDatabase菜单选项。系统会显示DatabaseProperties对话框,如图1.13所示。
    图1.13用EnterpriseManager创建一个数据库Step3:选择General标签(如图1.13,该标签在初始时已默认被选中),在Name的文本输入一个数据库名,我们这里输入的是test(即是创建后的数据库名)。Step4:在Databasefiles对话框的Databasefiles部分,输入文件名、位置、初始大小和文件组信息(一般按照默认的设置即可)。Step5:如果你想使SQLServer能够自动地按需要增加数据库文件的大小,就应该选择Automaticgrowfile选项,否则则不选取。Step6:在TransactionLog标签中的TransactionLog对话框部分,可以输入文件名、位置及服务日志的初始大小。而日志的大小也可能通过Automaticgrowfile选项来设置是否能按需要来增加日志文件的大小。Step7:单击“确定”以完成创建数据库。以上的(4)—(6)步聚均可按系统原来的默认设置来进行,这也是我们推荐的。在SQLServer中,当然也支持通过SQL语句来创建数据库,当然这对一个普通用户来说是没有必要的,并且也是烦琐的,在此,我们不进行详细讲述。2.创建数据表Step1:打开Databases文件夹,在新建的test数据库图1.点上单击鼠标右键,选择“新建”->“Table..”菜单项。如图1.14所示
     老代向大家推荐
    图1.14创建数据表Step2:在弹出的“选择”名称对话框的文本输入框中输入要创建的数据表名authors,然后单击确定以创建新表,如图1.15所示。Step3:设置该表的字段属性,如图1.16所示。Step4:保存设置并退出,新表即建立完成。
    图1.15设置新表的属性
     老代向大家推荐
    图1.16设置新表的字段属性3.表的操作在SQLServer中,有提供了类同于Access的界面予于用户进行对表的操作。限于篇幅,我们就不在这里进行讲述了。
    (七)ODBC与ADO对象1七
    1.3ODBC与ADO对象1.3.1ASP访问数据库的几种方式在我们介绍了数据库操作的基础知识后,我们接下来的任务是告诉大家如何用ASP访问数据库,因为一个系统不可能没有数据呀,所以我们就必须让ASP采用一个高效的方法通过Internet或Intranet来访问、操作数据库。我们知道在传统的HTML页面中,访问数据库一般是通过公用网关接口(CGI)来实现,这种方式不仅开发困难,而且在出现大量并发请求时会显著地降低服务器的运行效率,而采用ASP实现数据
    库访问可以说能较好地解决这个问题。在ASP脚本中可以通过三种方式访问数据库:●IDC(InternetDatabaseConnector)方式●ADO(ActiveXDataObjects)方式●RDS(RemoteDataService)方式从概念上来讲,这三种访问方式对数据库的访问是由InternetInformationServer来完成的。Web浏览器用HTTP协议向Internet信息服务器(IIS)递交请求。Internet信息服务器执行访问数据库的操作,并以一个HTML格式的文档作为回答。1.Internet数据库接口(IDC)IDC是一个传统的数据库查询工具,用来定义和执行数据库查询的SQL命令,并向浏览器返回一个指定数据格式的页面。使用IDC访问数据库最大的特点是简单,几乎不需要编程就能实现对数据库的访问。2.ActiveX数据对象(ADO)与IDC不同,用ADO访问数据库更类似于编写数据库应用程序,ADO把绝大部分的数据库操作封装在七个对象中,在ASP页面中编程调用这些对象执行相应的数据库操作。ADO
     老代向大家推荐
    是ASP技术的核心之一,它集中体现了ASP技术丰富而灵活的数据库访问功能。ADO建立了基于Web方式访问数据库的脚本编写模型,它不仅支持任何大型数据库的核心功能,而且支持许多数据库所专有的特性。ADO使用本机数据源,通过ODBC访问数据库。这些数据库可以是关系型数据库、文本型数据库、层次型数据库或者任何支持ODBC的数据库。ADO的主要优点是易用、高速、占用内存和磁盘空间少,所以非常适合于作为服务器端的数据库访问技术。相对于访问数据库的CGI程序而言,它是多线程的,在出现大量并发请求时,也同样可以保持服务器的运行效率,并且通过连接池(ConnectionPool)技术以及对数据库连接资源的完全控制,提供与远程数据库的高效连接与访问,同时它还支持事务处理(Transaction),以开发高效率、高可靠性的数据库应用程序。正是因为使用ADO需要编写脚本程序,所以ADO能够实现更复杂、更灵活的数据库访问逻辑。目前,ADO包括Command、Connection、Recordset等七个对象和一个动态的Properties集合,绝大部分的数据库访问任务都可以通过它们的组合来完成。1.3ODBC与ADO对象1.3.1ASP访问数据库的几种方式3.远程数据服务(RDS)RDS是IIS1.0中新提出的概念,它是由ASP中原来的AdvancedDataConnector(ADC)发展而来的。在IIS1.0中,RDS与ADO集成到一起,使用同样的编程模型,提供访问远程数据库的功能。ADO虽然能够提供非常强大的数据库访问功能,但是它不支持数据远程操作(DataRemoting)。换句话说,ADO只能执行查询并返回数据库查询的结
    果,这种结果是静态的,服务器上的数据库与客户端看到的数据没有“活的连接关系”。假如,客户端需要修改数据库中的数据,就必须构造修改数据的SQL语句,执行相应的查询动作。而RDS就比ADO更进一步,它支持数据远程操作。它不仅能执行查询并返回数据库查询结果,而且这种结果是“动态的”服务器上的数据库与客户端看到的数据保持“活的连接关系”,。即把服务器端的数据搬到客户端,在客户端修改数据后,调用一个数据库更新命令,就可以将客户端对数据的修改写回数据库,就象使用本地数据库一样。由于RDS与ADO集成,RDS的底层是调用ADO来完成的,所以也可以将RDS理解为ADO的RDS,ActiveX数据对象的远程数据服务。即RDS在ADO的基础上通过绑定的数据显示和操作控件,提供给客户端更强的数据表现力和远程数据操纵功能。可以说RDS是目前基于Web的最好的远程数据库访问方式。以上就是ASP访问数据库的三种方式,它们三者各有各的特色。IDC十分简单,使用.idc文件和.htx文件分别完成数据库的访问与输出任务,但是使用起来不灵活。ADO是ASP中推荐使用的方式,它功能强大,使用方便,是ASP的核心技术之一,但是它在提供用户远程操作数据库的功能时,比较复杂,实现起来有一定的难度。而RDS是基于ADO的,并提供远程操作数据库的强大工具。所以在需要提供高性能、高可靠性的远程数据操作功能时,RDS是更为理想的选择。而在以上的三种方式中,微软推荐的与现在常采用的都是通过ADO的方式访问数据库,因此接下来,我们就来讲述一下有关ADO的方案。1.3.2创建和配置ODBC数据源ADO可以与ASP结合,以建立提供数据库信息的主页内容,在主页画面执行SQL命令,让用户在浏览器画面中输入,更新和删除站点服务器的数据库信息;ADO使用RecordSets对象,作为数据的主要接口;ADO可使用Vbscript,JavaScript语言来控制数据库的访问,与查询结果的输出显示画面;ADO可连接多种的数据库,包括SQLServer、Oracle、Informix等支持ODBC的数据库。因此,在使用ADO访问数据库之前我们还有一项重要的工作要做,
     老代向大家推荐
    那就是创建和配置ODBC数据源。1.ODBC的定义首先,还是也让我们来解释一下有关ODBC的概念,这将有利于下面内容的理解。ODBC(OpenDatabaseConnectivity开放式数据库互联)是微软推出的一种工业标准,一种开放的独立于厂商的API应用程序接口,可以跨平台访问各种个人计算机、小型机以及主机系统。ODBC作为一个工业标准,绝大多数数据库厂商、大多数应用软件
    和工具软件厂商都为自己的产品提供了ODBC接口或提供了ODBC支持,这其中就包括常用的SQLSERVER、ORACAL、INFORMIX等,当然也包括了Access。数据库驱动程序使用DataSourceName(DSN)定位和标识特定的ODBC兼容数据库,将信息从Web应用程序传递给数据库。典型情况下,DSN包含数据库配置、用户安全性和定位信息,且可以获取WindowsNT注册表项中或文本文件的表格。通过ODBC,我们可以选择希望创建的DSN的类型:用户、系统或文件。为了更好地让大家理解上一段话,我们接下来来解释一下其中的几个名词:●DSN:根据MICROSOFT的官方文档,DSN的意思是“应用程序用以请求一个连到ODBC数据源的连接(CONNECTION)的名字”,换句话说,它是一个代表ODBC连接的符号。它隐藏了诸如数据库文件名、所在目录、数据库驱动程序、用户ID、密码等细节。因此,当建立一个连接时,你不用去考虑数据库文件名、它在哪儿等等,只要给出它在ODBC中的DSN即可。●FILEDSN:当我们讨论这个问题时,先看看其他的DSN类型●SYSTEMDSN:这种DSN可以被任何登录到系统中的用户使用。●USERDSN:这是为特定用户建立的DSN。只有建立这个DSN的用户才能看到并使用它。在上面的两种情况中,DSN的细节都储存在系统的注册表中。2.配置ODBC数据源接下来我们就讲述一下系统DSN的配置过程。首先在Windows的“开始”菜单打开“控制面板”,双击“ODBC”图1.标,然后选择“文件DSN”属性页,单击“添加”,如图1.17所示。接下来的操作将视我们要配置的数据库系统的不同而有不同的操作,由于我们介绍的主要是基于Access数据库和SQLServer数据库的,所以接下来的两个部分我们讲分别讲述Access数据库系统DSN和SQLServer数据库系统DSN的配置方法。
     老代向大家推荐
    图1.17配置系统DSN(1)Access数据库系统DSN的配置方法Step1:单击添加后弹出如图1.18所示的对话框,选择数据源为DriverdoMicrosoftAccess(*.mdb)单击完成。Step2:这时弹出一个“ODBCMicrosoftAccess安装”的对话框,在对话框的数据源名文本输入框中输入配置的DSN文件名,如果test_dsn然后单击“选择”按钮。如图1.19所示。Step3:这时将弹出一个如图1.20所示的对话框,在对话框的数据库名中输入“c:\test.mdb”(该数据库的建立方法请参看前边的章节),或是从右边的目录浏览器中选择“驱动器C”->“test.mdb”。选择数据库完成后,单击确定按钮将回到图1.19的界面。Step4:单击“确定”,这时出现的界面如图1.21所示,请注意,这时在系统数据源列表框中出现了“test_dsn”项。A
    ccess数据库系统DSN配置完成。
    图1.18选择配置Access数据库DSN
    图1.19ODBCMicrosoftAccess安装对话框
     老代向大家推荐
    图1.20选择Access数据库
    图1.21完成对test.mdb数据库系统DSN的配置
    (七)ODBC与ADO对象2七
    1.3ODBC与ADO对象1.3.2创建和配置ODBC数据源2.配置ODBC数据源(2)SQLServer数据库系统DSN的配置方法Step1:在图1.17所示的对话框中单击“添加”按钮,在弹出的对话框中的驱动程序中选择SQLServer项。如图1.22所示。
     老代向大家推荐
    图1.22选择配置SQLServer数据库DSNStep2:单击“完成”,这时将弹击一个对话框,在对话框的名称文本输入框中输入要配置的DSN文件名如“test_dsn_sql”在服务器文本输入框中输入SQLServer的服务器名或IP地址,如果SQLServer也是本机的话则输入“127.0.0.1”。如图1.23所示。
    图1.23建立数据源连接到SQLServer(1)Step3:单击“下一步”,这时弹出一个如图1.24的对话框,此时我们如果在第二步时选择的是通过IP地址连接服务器,请选择客户端配置选项,调出如图1.25所图示配置对话框。
     老代向大家推荐
    图1.24建立数据源连接到SQLServer(2)2.配置ODBC数据源(2)SQLServer数据库系统DSN的配置方法Step5:单击“下一步”,进入到如图1.26所示的对话框,在“改变默认的数据库”的复选框中打勾,并选择test数据库(该数据库的建立方法请参看前边的章节),如图所示。
    图1.26建立数据源连接到SQLServer(3)Step6:单击“下一步”,弹出如图1.27所示的对话框。Step7:单击“完成”,弹出如图1.28所示的对话框。Step8:通常,在设置完连接SQLServer数据库的DSN的时候都要进行数据源测试,所以我们要单击“测试数据库”按钮以进行测试,如果测试成功则会出现如果图1.29所示的对话框,否则请检查请边各步骤是否正确完成。
     老代向大家推荐
    图1.27建立数据源连接到SQLServer(4)
    图1.28建立数据源连接到SQLServer(5)
    图1.29测试数据源Step9:单击“确定”,这时在系统数据源列表框中出现了“test_dsn_sql”项,SQLServer数据库系统DSN配置完成。注意,在配置ODBC数据源以前,请确定数据库已建立完成,如果是配置SQLServer数据源的话还得确定SQLServer在运行状态。
     老代向大家推荐
    1.3.3用ADO实现访问数据库前面我们已经谈过有关ADO的概念,现在我们要开始讲述如何使用ADO来访问数据库,首先,让我们来看一下在服务器端所需要的ADO执行环境:●安装WindowsNT/2000Server或是PersonalWebSever●安装InternetInformationServer(IIS)3.0(含)以上版本●在用户端所需要的ADO执
    行环境,只需要一般的浏览器即可。接下来我们来看一下ADO包括的七个对象:●Command:定义对数据源进行操作的命令;●Connection:建立一个数据源的连接;●Error:提供数据访问错误的细节;●Field:表示一般数据类型的字段;●Parameter:表示Command对象的参数;●Property:表示由数据源定义ADO对象的动态特性;●Recordset:数据库命令结果集对象。灵活运用上述对象的属性、方法可以达到许多很好的效果。但通过ADO访问数据库的基本步骤通常都是以下五步:●创建数据库源名●创建数据库链接●创建数据对象●操作数据库●关闭数据对象和链接(1)创建数据库源名,即创建和配置ODBC数据源,该步骤在上一节我们已详细讲述。(2)创建数据库链接:ASP文件中如果要访问数据,必须首先创建与数据库的链接,其语法如下:SetConn=ServerCreateObject(“ADOBD.CONNECTION”)这条语句创建了链接对象Conn,接下来:Conn.Open“dsn_name”“username”“password”,,这条语句打开链接,用到了DSN,本例中DSN名为“dsn_name”。其后的两个参数分别是访问数据库的用户名和口令,为可选参数。如我们前边对系统DSN的设置,这一段代码可以写为:访问Access数据库系统DSN:SetConn=ServerCreateObject(“ADOBD.CONNECTION”)Conn.Open“test_dsn”访问SQLServer数据库系统DSN:SetConn=ServerCreateObject(“ADOBD.CONNECTION”)Conn.Open“test_dsn_sql”,“sa”,“passwd”其中的“sa”为访问SQLServer数据库的帐号,“passwd”为该帐号的访问口令,具体的内容创建数据库时的设定。在ADO中还可以不通过ODBC而直接与Access数据相连,这种方法在个人主页中大量使用(因为其用户无法进行服务器ODBC设置操作),我们这里只简单提一下方法:Connection.Open“driver={MicrosoftAccessDriver(*.mdb)};dbq=c:\test.mdb”(3)创建数据对象:RecordSet保存的是数据库命令结果集,并标有一个当前记录。以下是创建方法:
     老代向大家推荐
    SetRecordSet=Conn.Execute(sqtStr)这条语句创建并打开了对象RecordSet,其中Conn是先前创建的链接对象,SqlStr是一个串,代表一条标准的SQL语句,例如:SqlStr=“SELECT*FROMauthors”SetRecordSet=Conn.Execute(SqlStr)这条语句执行后,对象RecordSet中就保存了表authors中的所有记录。(4)操作数据库:Execute方法的参数是一个标准的SQL语句串,所以我们可以利用它方便地执行数据插入、修改、删除等操作,例如:qlStr="DELETEFROMauthors"Conn.Execute(SqlStr)/执行删除操作SqlStr="UPDATEauthorsSETsalary=3WHEREid=‘FZ0001’"Conn.Execute(SqlStr)/执行修改操
    作(5)关闭数据对象和链接:在使用了ADO对象之后,一定要记住关闭它,因为它使用了服务器的资源,如果不释放的话将导致服务器资源浪费并影响服务器性能。通过调用方法close实现关闭,然后再释放它,例如:Conn.Close
    
    
  • 上一篇资讯: 学习资料总结
  • 下一篇资讯: 学习资料
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师