《数据库应用技术》PPT课件_第1页
《数据库应用技术》PPT课件_第2页
《数据库应用技术》PPT课件_第3页
《数据库应用技术》PPT课件_第4页
《数据库应用技术》PPT课件_第5页
已阅读5页,还剩198页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据库应用技术,总复习,SqlServer数据库中常见的数据库对象主要包括表、存储过程、触发器、视图、规则、默认值、索引等。,第一章SQLServer2000高级安装,1.1SQLServer2000版本信息1.2使用SQLServer命名实例和多实例1.3确定启动服务的帐户1.4选择安全机制1.5SQLServer2000的排序规则1.6网络库1.7验证安装的正确性1.8无人值守安装1.9升级SQLServer1.10故障排除,1.1SQLServer2000版本信息,共有6个版本:企业版、企业评估板、标准版、个人版、开发版、WindowsCE版每个版本支持的操作系统,1.2使用SQLServer命名实例和多实例,实例是关系数据库引擎,是SQLSERVER2000的工作单元。每一个实例都由系统数据库和用户数据库组成,拥有独立的管理和运行环境。默认实例:一台计算机只能存在一个默认实例命名实例:除默认实例以外,其他所有的实例都称为命名实例,1.2使用SQLServer命名实例和多实例,多实例:一台计算机允许安装多个SQLServer2000实例。一台计算机最多可以运行16个命名实例。实例名称及命名规则:必须将实例名限制为16个字符等等(P5)。,1.3确定启动服务的帐户,帐户类型为本地系统帐户或域用户帐户。可使用同一帐户启动两个服务,也可以为每个服务分别指定帐户。,1.4选择安全机制,在安装SQLServer的过程中,用户可以选择Windows身份验证模式或者选择混和身份验证模式作为安全机制,限制和验证用户对SQLServer的访问。,1.5SQLServer2000的排序规则,排序规则是SQLServer对字符数据进行存储和排序的方式。SQLServer具有两种类型的排序规则:Windows排序规则和SQL排序规则。,1.6网络库,网络库也称作通讯协议,用于在运行SQLServer的客户端和服务器之间传递网络数据包。SQLServer默认实例网络库为命名管道和TCP/IP协议网络库,1.7验证安装的正确性,数据库的类型:系统数据库和用户数据库。master数据库tempdb数据库model数据库msdb数据库northwind数据库pubs数据库,第二章Transact-SQL程序设计逻辑,系统提供的数据类型2.1数据定义语言(DDL)2.2使用SELECT语句查询数据2.3使用Insert向表中插入数据2.4使用Update修改表中的数据2.5使用Delete删除表中的数据2.6大对象数据的访问控制2.7T-SQL中数据库对象的引用,系统提供的数据类型,整数数据类型int、smallint、tinyint、bigint浮点数据类型单精度类型(real)、双精度类型(float)、精确数值类型(decimal、numeric)字符数据类型char、nchar、varchar、nvarchar,系统提供的数据类型,日期和时间数据类型datetime、smalldatetime二进制数据类型binary、varbinary逻辑数据类型bit数据类型占用1个字节的存储空间,其值为0或1。如果输入0或1以外的值,将被视为1。bit类型不能定义为NULL值。,系统提供的数据类型,文本和图形数据类型text、ntext、image货币数据类型money、smallmoney,2.1数据定义语言(DDL),数据定义语言用来定义数据的结构,如创建、修改或者删除数据库对象,常用的数据定义语言有:CREATE、ALTER、DROP等。,创建一张表合同表Contract,该表中含有五个字段,分别是合同号ContractID字符型数据、单位代码CompanyID字符型数据,来源于公司信息表、合同名称ContractName字符型数据、合同总金额ContractVolume数值型数据、签定日期SignDate日期型数据,SQL语句如下:CREATETABLEContract(ContractIDvarchar(10)NOTNULL,CompanyIDvarchar(10)NOTNULL,ContractNamevarchar(30)NULL,ContractVolumenumeric(18,2)NULL,SignDateDatetimeNULL),CreateTable语句,创建一个临时表MyTempQuery,用来保存当前用户的合同号与合同总金额CREATETABLE#MyTempQuery(ContractIDVarchar(10)PRIMARYKEY,ContractVolumeNumeric(18,0),AlterTable语句,例程2.4:为表Contract增加一个新的字段CompanyID,数据类型为Varchar,数据长度为20个字符,允许空值。SQL语句如下:ALTERTABLEContractADDCompanyIDVARCHAR(20)NULL例程2.5:改变表Contract中的字段ContractVolume的数据类型,使其数据类型为Money类型,SQL语句如下:ALTERTABLEContractALTERCOLUMNContractVolumemoney,DropTable语句,例程2.6:从当前数据库中删除Contract表及其数据和索引,SQL语句如下:DROPTABLEContract注:DROPTABLE不能用于除去由FOREIGNKEY约束引用的表。必须先除去引用的FOREIGNKEY约束或引用的表。除去表时,表上的规则或默认值将解除绑定,任何与表关联的约束或触发器将自动除去。,DropTable语句,例程2.6:从当前数据库中删除Contract表及其数据和索引,SQL语句如下:DROPTABLEContract注:DROPTABLE不能用于除去由FOREIGNKEY约束引用的表。必须先除去引用的FOREIGNKEY约束或引用的表。除去表时,表上的规则或默认值将解除绑定,任何与表关联的约束或触发器将自动除去。,SELECT子句,例程2.7:要查询Contract表中前50条记录,要求返回两列数据:合同名称和合同总金额,SQL语句如下:SelectTOP50ContractNameas合同名称,ContractVolumeas合同总金额FromContract例程2.8:查询与多少个单位签了合同,需要查询Contract表中的CompanyID列,按要求不能显示重复的列,需要使用DISTINCT关键字,SQL语句如下:SELECTDISTINCTCompanyIDFROMContract,FROM子句,例程2.9:查询每个合同的合同明细金额之和,要求返回列合同号与合同明细金额之和,合同表与合同明细表是主子表的关系。合同明细表有三个字段分别是:ContractID、ContractDetailID、Volume。SELECTa.ContractID,sum(Volume)FROMContractaLEFTJOINContractDetailbONa.ContractID=b.ContractIDGROUPBYa.ContractID,WHERE子句,例程2.10:查询合同表中所有签订日期在2002年1月1日以后的记录,SQL语句如下:SELECTContractID,ContractName,ContractVolume,SignDateFROMContractWHERESignDate2002-01-01,WHERE子句,例程2.11:查询与“北京怡神工贸公司”签定的合同总金额大于100万的所有合同。此查询需要公司信息表,该表有两个字段:CompanyID、CompanyName,与合同表是主子表的关系,每个单位对应多个合同。SQL语句如下:SELECTContractID,ContractName,ContractVolume,SignDateFROMContract,CompanyWHEREContract.CompanyID=Company.CompanyIDANDCompanyName=北京怡神工贸公司ANDContractVolume1000000,WHERE子句,例程2.12:查询总金额小于10万的合同,或者签定日期在2002年5月1日与2002年8月1日之间的合同。因为查询条件限定词AND和OR的执行顺序是按先后顺序执行,因此需要先执行的部分应加括号。SQL语句如下:SELECTContractID,ContractName,ContractVolume,SignDateFROMContractWHEREContractVolume2002-05-01ANDSignDate2002-01-01,ORDERBY子句,例程2.17:按合同总金额从小到大的顺序,对于所有合同排序输出。SQL语句如下:SELECTContractID,ContractName,ContractVolume,SignDateFROMContractORDERBYContractVolumeASC,ORDERBY子句,例程2.18:查询每个单位每个合同明细金额之和,要求该合同为2002年1月1日之后签名册定的合同,并且按单位名称和签定日期升序排序,SQL语句如下:SELECTCompanyName,ContractName,SUM(Volume)FROMContract,ContractDetail,CompanyWHEREContract.ContractID=ContractDetail.ContractIDANDContract.CompanyID=Company.CompanyIDGROUPBYCompanyName,ContractName,SignDateHAVINGSignDate2002-01-01ORDERBYCompanyName,SignDate,NULL关键字,例程2.19:检查合同表中SignDate为NULL的记录,SQL语句如下:SELECT*FROMContractWHERESignDateISNULL,LIKE关键字,例程2.20:查询所有公司名称中含有“北京”的合同,可以使用%通配符,SQL语句下如:SELECTContractID,ContractName,ContractVolumeFROMContract,CompanyWHEREContract.CompanyID=Company.CompanyIDANDCompanyNameLIKE%北京%,例程2.21:查询所有合同号以“01”结尾的合同,并且该合同号为四位字符长度,可以使用_通配符,_通配符代表一个字符位置,SQL语句下如:SELECTContractID,ContractName,ContractVolumeFROMContractWHEREContractIDLIKE_01例程2.22:查询所有合同号以“01”结尾的合同,并且该合同号为三位字符长度,且第一位介于0-9之间,SQL语句下如:SELECTContractID,ContractName,ContractVolumeFROMContractWHEREContractIDLIKE0-901,CUBE关键字,例程2.23:查询与各公司签定的所有合同的总金额之和,并且要显示汇总行,SQL语句如下:SELECTCompanyName,SUM(ContractVolume)FROMContract,CompanyWHEREContract.CompanyID=Company.CompanyIDGROUPBYCompanyNameWITHCUBE,CASE关键字,例程2.24:查询所有公司的合同,如果合同总金额之和小于10000元,则显示该公司为“小公司”,如果大于10000则显示为“大公司”,使用CASE关键字,SQL语句如下:SELECTCompanyName,公司规模=CASEWHENSUM(ContractVolume)10000THEN大公司WHENSUM(ContractVolume)2002-01-01,使用SelectInto语句,例程2.32:创建一个新的表,把合同表中合同总金额大于10万元的合同记录添加到新表中,新表名为NewContract,SQL语句如下:SELECTContractID,CompanyID,ContractName,ContractVolume,SignDateINTONewContractFROMContractWHEREContractVolume100000,2.4使用Update修改表中的数据,例程2.33:更新合同表中所有单位代码为“0001”的合同记录,使其单位代码为“0002”,SQL语句如下:UPDATEContractSETCompanyID=0002WHERECompanyID=0001,基于其他表更新数据行,例程2.34:把合同明细表中金额添加到合同表中的合同总金额中,以反应合同表中最新的合同明细金额,SQL语句下:UPDATEContractSETContractVolume=Contract.ContractVolume+ContractDetail.VolumeFROMContract,ContractDetailWHEREContract.ContractID=ContractDetail.ContractID,使用子查询更新指定的行,例程2.35:更新合同表中合同总金额字段,条件是如果在合同明细中该合同没有记录,则使其合同总金额为0,SQL语句如下:UPDATEContractSETContractVolume=0WHEREContractIDNOTIN(SELECTContractIDFROMContractDetail),2.5使用Delete删除表中的数据,例程2.36:用DELETE删除表的所有行,删除合同明细表中的所有记录,SQL语句如下:DELETEFROMContractDetail例程2.37:用DELETE删除表的指定行,删除合同表中所有合同总金额为0并且签定日期在2002年5月1日之前的合同记录,SQL语句如下:DELETEFROMContractWHEREContractVolume=0ANDSignDateany(SELECTVolumeFROMContractDetail),带有EXISTS关键字的子查询,查询所有合同明细中,明细金额中有一条记录是10000元的合同,列出合同号、合同名称,SQL语句如下:SELECTContractID,ContractNameFROMContractWHEREexists(SELECTVolumeFROMContractDetailWHEREVolume=10000ANDContractID=Contract.ContractID),子查询的限制(P39),查询所有合同明细中,明细金额中有一条记录是10000元的合同,可以用如下SQL语句实现:SELECTContract.ContractID,ContractNameFROMContract,ContractDetailWHEREContract.CompanyID=Company.CompanyIDANDVolume=10000,3.3联合查询,3.3.1使用UNION创建联合查询3.3.2联合查询的关键字ALL3.3.3使用INNERJOIN3.3.4使用LEFTJOIN和RIGHTJOIN建立连接3.3.5使用交叉连接(CROSSJOIN),3.3.1使用UNION创建联合查询,查询在2002年5月1日签定的合同以及在合同总金额大于10000元的合同,SQL语句如下:SELECT*FROMContractWHERESignDate=2002-05-01UNIONSELECT*FROMContractWHREContractVolume10000,3.3.1使用UNION创建联合查询,查询在与“北京怡神工贸公司”签定的合同以及在合同明细金额中有一条记录是10000元的合同,显示公司名称、合同号,SQL语句如下:SELECTCompanyName,ContractIDFROMContract,CompanyWHEREContract.CompanyID=Company.CompanyIDANDCompanyName=北京怡神工贸公司UNIONSELECTCompanyName,Contract.ContractIDFROMContract,Company,ContractDetailWHEREContract.CompanyID=Company.CompanyIDANDContract.ContractID=ContractDetail.ContractIDANDVolume=10000,3.3.2联合查询的关键字ALL,查询在2002年5月1日签定的合同以及在合同总金额大于10000元的合同,如果使用了ALL关键字,SQL语句如下:SELECT*FROMContractWHERESignDate=2002-05-01UNIONALLSELECT*FROMContractWHREContractVolume10000,3.3.3使用INNERJOIN,查询在合同表中存在的公司的基本信息,为此需要建立合同表与公司信息表的连接,SQL语句如下:SELECTCompany.CompanyID,CompanyNameFROMCompanyINNERJOINContractONCompany.CompanyID=Contract.CompanyID,3.3.4使用LEFTJOIN和RIGHTJOIN建立连接,查询所有公司的合同签定总额,不管该公司有没有签定合同,分别使用LEFTJOIN和ROGHTJOIN,SQL语句如下用LEFTJOINSELECTCompanyName,SUM(ContractVolume)FROMCompanyLEFTJOINContractONCompany.CompanyID=Contract.CompanyIDGROUPBYCompanyName用RIGHTJOINSELECTCompanyName,SUM(ContractVolume)FROMContractRIGHTJOINCOMPANYONContract.CompanyID=Company.CompanyIDGROUPBYCompanyName,3.3.5使用交叉连接(CROSSJOIN),现有部门表(Depart)与职员表(Employee),现在要生成一张新的表NewTable,要求在新表中包括每个部门的每个职员,部门表结构:Depart(DepartID,DepartName),职员表结构:Employee(EmployeeID,EmployeeName),SQL语句如下:SELECTDepartName,EmployeeNameINTONewTableFROMDepartCROSSJOINEmployee,3.4其他复杂应用,3.4.1使用Compute(By)子句3.4.2交叉表查询,3.4.1使用Compute(By)子句,COMPUTEBY子句使您得以用同一SELECT语句既查看明细行,又查看汇总行。可以计算子组的汇总值,也可以计算整个结果集的汇总值。这对于需要是显示查询的总计与小计非常有用。COMPUTE所生成的汇总值在查询结果中显示为分离的结果。,3.4.2交叉表查询,以合同表为例,查询各公司在本年的付款金额,要求每公司用一行记录显示,每个月用一列显示,SQL语句如下:SELECTCompany.CompanyNameas公司名称,SUM(CASEWHENMONTH(PaymentDate)=1THENContractPayment.VolumeELSE0END)as1月,SUM(CASEWHENMONTH(PaymentDate)=2THENContractPayment.VolumeELSE0END)as2月,SUM(CASEWHENMONTH(PaymentDate)=3THENContractPayment.VolumeELSE0END)as3月,SUM(CASEWHENMONTH(PaymentDate)=4THENContractPayment.VolumeELSE0END)as4月,SUM(CASEWHENMONTH(PaymentDate)=5THENContractPayment.VolumeELSE0END)as5月,SUM(CASEWHENMONTH(PaymentDate)=6THENContractPayment.VolumeELSE0END)as6月,SUM(CASEWHENMONTH(PaymentDate)=7THENContractPayment.VolumeELSE0END)as7月,SUM(CASEWHENMONTH(PaymentDate)=8THENContractPayment.VolumeELSE0END)as8月,SUM(CASEWHENMONTH(PaymentDate)=9THENContractPayment.VolumeELSE0END)as9月,SUM(CASEWHENMONTH(PaymentDate)=10THENContractPayment.VolumeELSE0END)as10月,SUM(CASEWHENMONTH(PaymentDate)=11THENContractPayment.VolumeELSE0END)as11月,SUM(CASEWHENMONTH(PaymentDate)=12THENContractPayment.VolumeELSE0END)as12月FROMCompanyLEFTJOINContractONCompany.CompanyID=Contract.CompanyIDLEFTJOINContractDetailONContract.ContractID=ContractDetail.ContractIDLEFTJOINContractPaymentONContractDetail.ContractDetailID=ContractPayment.ContractDetailIDWHEREYEAR(PaymentDate)=2002GROUPBYCompanyName,3.5查询语句的性能优化,当数据量不是很大的时候,SQL语句的优劣基本无法比较,但是当数据达到海量以后,劣质的SQL语句与优质的SQL语句的执行效率可能会相差几十倍甚至几百倍。因此提高SQL语句的执行效率,也就是提高了应用程序的性能。当然,只有在实际应用中才能分出SQL语句的优劣,不过还是有一些优化经验,它可以使我们避免在新系统犯低级的错误。,3.5查询语句的性能优化,3.5.1通配符%的使用3.5.2Orderby语句3.5.3尽量不用NOT3.5.4尽量不要连接列3.5.5表连接需要注意的地方,第四章视图的灵活应用,4.1视图的用途和需要4.2创建和管理视图4.3利用视图简化查询操作4.4更新视图中的数据4.5加密视图4.6利用视图加强数据安全,4.1视图的用途和需要,视图作为一种基本的数据库对象,是查询一个表或多个表的一种另方法,通过把预先定义的查询存储在数据库中,然后就可以在查询语句中调用它。视图是虚拟的表,它只包含表的一部分。,4.2创建和管理视图,4.2.1定义视图4.2.2修改视图定义4.2.3删除视图,4.2.1定义视图,例程4.1:创建一个视图,该视图用于显示2002年1月1日以后签定的所有合同。CREATEVIEWView_Contract1ASSELECT*FROMContractWHERESignDate2002-01-01例程4.2:创建一个视图,用于显示各单位签定的所有合同。CREATEVIEWView_Contract2ASSELECTCompanyName,ContractID,ContractNameFROMContract,CompanyWHEREContract.CompanyID=Company.CompanyID,4.2.1定义视图,例程4.3:创建一个视图,用于显示各单位的付款总额。CREATEVIEWView_Contract3ASSELECTCompanyName,SUM(ContractPayment.Volume)asTotalPaymentFROMCompanyLEFTJOINContractONContract.CompanyID=Company.CompanyIDLEFTJOINContractDetailONContract.ContractID=ContractDetail.ContractIDLEFTJOINContractPaymentONContractDetail.ContractDetailID=ContractPayment.ContractDetailIDGROUPBYCompanyName,4.2.2修改视图定义,例如要更新上一节中例程一中的创建的视图View_Contract1,使其显示所有在2002年1月份签定的合同,用如下的SQL语句:ALTERVIEWView_Contract1ASSELECT*FROMContractWHERESignDate=2002-01-01ANDSignDate10000PRINT该合同金额超过1万元ELSEPRINT该合同金额不足1万元,5.1.1流程控制语句,用BEGIN.END定义语句块例程5.3:在单位信息表的触发器中的一段语句块如下:BEGINROLLBACKTRANSACTIONPRINT不能删除当前单位!END,5.1.1流程控制语句,用WHILE语句实现循环例程5.4:简单WHILE语句,打印从1到10的整数DECLAREiINTEGERDECLAREiMAXINTEGERSETiMAX=10SETi=1WHILEi=iMAXBEGINPRINTiSETi=i+1END,5.1.1流程控制语句,例程5.5:判断一个数是否素数DECLAREiINTEGERDECLAREiTestINTEGERSETiTest=59SETi=2WHILEiiTestBEGINIFiTest%i=0BEGINPRINT该数不是素数BREAKENDSETi=i+1IFItest=iPRINT该数是素数END,5.1.1流程控制语句,GOTO语句例程5.6:判断一个数是否素数,用GOTO语句来实现DECLAREiINTEGERDECLAREiTestINTEGERSETiTest=58SETi=2goto_Loop:BEGINIFiTest%i=0BEGINPRINT该数不是素数GOTOloop_OverENDSETi=i+1IFItest=iPRINT该数是素数ENDIFi10000PRINTstr(DetailVolume),5.2.5带参数的存储过程,通过RETURN参数返回状态用户可以通过使用RETURN语句返回状态值,RETURN返回值是整型值,在存储过程中,RETURN不能返回空值。例程5.19:创建一个存储过程,检查公司信息表中是否有记录,如果有,返回1,否则返回0。CREATEPROCEDUREget_co_recASDECLAREcountintegerSELECTcount=count(*)FROMCompanyIFcount=0RETURN(0)ELSERETURN(1),5.2.6存储过程的加密,如果用户不想让其他人查看存储过程的定义文本,可以在定义存储过程时,对其进行加密。加密存储过程的关键字是:WITHENCRYPTION,使用ENCRYPTION可防止将过程作为SQLServer复制的一部分发布。,5.2.7修改和删除存储过程,例程5.21:创建一个存储过程,返回所有公司的合同号,然后修改存储过程,只返回公司名称为“北京怡神工贸有限公司”的合同号。创建存储过程CREATEPROCEDUREget_Co_ContractASSELECTCompanyName,ContractIDFROMCompanyINNERJOINContractONCompany.CompanyID=Contract.CompanyID修改存储过程ALTERPROCEDUREget_Co_ContractASSELECTCompanyName,ContractIDFROMCompanyINNERJOINContractONCompany.CompanyID=Contract.CompanyIDWHERECompanyName=北京怡神工贸有限公司,5.2.7修改和删除存储过程,例程5.22:删除存储过程get_Co_Contract。DROPPROCEDUREget_Co_Contract,5.3触发器的创建与管理,触发器是一种特殊的存储过程,常常用于实现强制业务规则和数据完整性。触发器在对表进行操作时(UPDATE、INSERT或DELETE)激活。SQLSERVER不支持在系统表上添加用户定义触发器。,5.3触发器的创建与管理,例程5.24:先创建一个触发器,当有用户向公司信息表Company中添加记录时,向客户端打印一条用户定义消息,然后,使用ALTERTRIGGER语句使该触发器不仅对INSERT活动有效,而且当有用户删除或修改公司信息表中的数据时,触发器仍有效。创建触发器CREATETRIGGERCompany_attentionONCompanyWITHENCRYPTIONFORINSERTASRAISERROR(50001,16,10),5.3触发器的创建与管理,修改触发器ALTERTRIGGERCompany_attentionONCompanyWITHENCRYPTIONFORINSERT,DELETE,UPDATEASRAISERROR(50001,16,10)例程5.25:删除触发器单位信息表上的触发器Company_attention。DROPTRIGGERCompany_attention,第六章用户定义数据类型与自定义函数,6.1用户定义数据类型简介6.2创建用户定义数据类型6.3删除用户定义数据类型6.4更改用户定义数据类型6.5使用数据类型6.6用户定义函数简介,6.1用户定义数据类型简介,SQLSERVER2000允许用户自己定义数据类型,用户定义的数据类型基于SQLServer2000中的系统数据类型。在创建了用户数据类型之后,可以在CREATETABLE或ALTERTABLE中使用它,也可以将默认值和规则绑定到用户定义的数据类型。,6.2创建用户定义数据类型,例程6.1:创建一个数据类型合同签定日期SignDate,基于日期型数据Datatime,要求数据不可空,代码如下:EXECsp_addtypeSignDate,datetime,NOTNULL例程6.2:创建一个数据类型邮政编码PostCode,基于字符型Varchar创建,要求最大数据长度为6位,可以为空,代码如下:EXECsp_addtypePostCode,Varchar(6),NULL,6.3删除用户定义数据类型,例程6.3:删除用户创建的数据类型SignDate,代码如下:EXECsp_droptypeSignDate,6.4更改用户定义数据类型,例程6.4:更改用户定义的数据类型SignDate为ContractDate,代码如下:EXECsp_renameSignDate,ContractDate,USERDATATYPE,6.5使用数据类型,EXECsp_addtypeContractDate,datetime,NOTNULLCREATETABLEContract(ContractIDvarchar(10),ContractNamevarchar(30),SignDatecontractdateNULL,6.6用户定义函数简介,SQLSERVER2000有三种自定义函数:标量函数内嵌表值函数多语句表值函数,第七章维护数据的完整性,7.1数据完整性概述7.2利用约束维护数据的完整性7.3利用规则维护数据的完整性7.4标识列Identity,7.1数据完整性概述,数据完整性包括实体完整性、域完整性、引用完整性、用户定义完整性。每种完整性的定义。(P96),7.2利用约束维护数据的完整性,利用约束可以实现数据完整性,约束包括:DEFAULT约束、CHECK约束、UNIQUE约束、PROMARYKEY约束、FOREIGNKEY约束和级联引用完整性约束。,DEFAULT约束,例程7.1:在Contract表中有一列币种(MoneyType),如果在新建一个合同时,没有指定币种,则系统自动填充为人民币(RMB),为此需要建立一个DEFAULT约束如下:ALTERTABLEContractADDCONSTRAINTdef_ContractDEFAULTRMBFORMoneyType,CHECK约束,例程7.2:在单位信息表中有一个字段邮政编码(PostCode),要求输入的数据格式为六位的数字,因此需要建立一个CHECL约束,防止输入非法的数据。ALTERTABLECompanyADDCONSTRAINTchk_PostCodeCHECK(PostCodeLIKE0-90-90-90-90-90-9),UNIQUE约束,例程7.3:公司基本信息表中,公司代码(CompanyID)是主键,要求公司名称(CompanyName)也不允许重复。建立一个UNIQUE约束,以保证公司的唯一性。ALTERTABLECompanyADDCONSTRAINTuni_CompanyNameUNIQUENONCLUSTERED(CompanyName),PRIMARYKEY约束,例程7.4:公司信息表中,要求公司代码(CompanyID)不能有空值,不能有重复的值,因此需要建立一个PRIMARYKEY约束。ALTERTABLECompanyADDCONSTRAINTpk_CompanyIDPRIMARYKEYCLUSTERED(CompanyID),FOREIGNKEY约束,例程7.5:在合同表中,CompanyID引用的公司信息表中的CompanyID,要求保证在每个合同表中的CompanyID都能在公司信息表中找到相关的信息。因此需要在合同表中建立一个FOREIGNKEY约束。ALTERTABLEContractADDCONSTRAINTFK_CompanyIDFOREIGNKEY(CompanyID)REFERENCESCompany(CompanyID),7.3利用规则维护数据的完整性,还可以利用DEFAULT对象和RULES对象实现数据的完整性。,7.4标识列Identity,例程7.9:创建公司信息表,使公司代码为自动增加,编号从1开始,后面的代码依次加1。CREATETABLECompany(CompanyIDintIDENTITY(1,1),CompanyNamevarchar(20)当用INSERT语句添加新的数据时,CompanyID就会自动编号,例如:INSERTINTOCompany(CompanyName)VALUES(北京大华电子集团),7.5使用触发器和存储过程实现数据完整性,使用触发器和存储过程可以强制实现数据完整性,可以实现比用CHECK约束定义的约束更为复杂的约束。,第八章规划和维护索引,8.1概述8.2索引的类型8.3使用索引的准则,8.1概述,数据库中的索引是一个表中所包含的值的列表,其中注明了表中包含各个值的行所在的存储位置,索引使得数据库程序无须对整个表进行扫描,就可以在表中找到所需数据。使用索引能够快速访问表中的记录,提高查询速度。SQLServer以两种方法访问数据:使用表扫描访问数据使用索引访问数据,8.2索引的类型,SQLServer的两种类型为聚集索引和非聚集索引。(P110),8.3使用索引的准则,业务规则、数据特征和数据的使用决定了创建索引的列。一般情况下,应当在经常被查询的列上创建索引。索引将占用磁盘空间,并且降低添加、删除和更新行的速度。不过在多数情况下,索引对于的数据检索速度的提高大大超过它的不足之处。,8.4创建和管理索引,例程8.1:在Customers表的CompanyName列上创建非聚集索引USENorthwindGOCREATEINDEXCompanyName_indONCustomers(CompanyName)GO例程8.2:在Products表的ProductID列上创建唯一聚集索引USENorthwindGOCREATEUNIQUECLUSTEREDINDEXemployeeID_indONProducts(ProductId)GO,8.4创建和管理索引,例程8.3:在Employees表的LastName和FirstName列上创建组合索引。USENorthwindGOCREATEINDEXEmployeeName_indONEmployees(LastName,FirstName),8.5维护索引,创建索引后,必须对索引进行维护,确保索引的统计信息是的有效的,才能够提高查找速度。随着更新操作不断的执行,数据会变得支离破碎,这些数据碎片会导致额外的页读取,防碍数据的并行扫描。应该定期整理索引清除数据碎片,提高数据读取的性能。,第九章SQLSERVER应用程序设计基础,可以通过多种方式访问SQLSERVER数据库,比较常见的有ADO、OLEDB、ODBC和JDBC,每一种方式都有各自的环境支持,需要一定的编程接口。要决定使用哪种接口来编程,要视具体的应用程序对数据库的性能要求,根据不同的情况选用不同的编程接口。,第十章SQLSERVER高级程序设计,SQL分布式管理对象(SQLDistributedManagementobjects,SQL-DMO)提供了用程序来进行数据库的管理功能,SQL-DMO针对的对象是数据库本身的结构,它并不是象ADO那样对数据访问感兴趣,它提供OLE自动化接口来完成数据库的管理任务,就象在程序中通过代码来完成EnterpriseManager的功能一样。,第十一章SQLSERVER服务器高级管理,11.1SQLServer的管理工具企业管理器11.2控制SQLServer服务11.3SQLSERVER服务器高级配置11.4网络连接方式的选择与配置11.5配置链接服务器实现分布式数据环境,11.1SQLServer的管理工具企业管理器,如果是默认实例,那么实例名显示为计算机的网络名,如果是命名实例那么实例名称显示为计算机名实例名,11.2控制SQLServer服务,SQLServer服务的三个选项:启动、暂停和停止。,11.3SQLSERVER服务器高级配置,11.3.1注册和删除SQLServer服务器11.3.2编辑SQLServer注册属性11.3.3常规选项11.3.4内存选项11.3.5安全选项11.3.6连接选项11.3.7服务器设置选项,11.4网络连接方式的选择与配置,客户端与SQLServer服务器使用网络库进行通讯。SQLServer可以同时监听多种类型的网络库,处理不同类型的客户端的数据请求,并且能够通过调整网络库的配置保证数据传输时的安全性。,11.5配置链接服务器实现分布式数据环境,在分布式数据处理系统中,通过网络把计算机联结起来,数据分布在这些计算机上,每个结点都有独立维护本地数据能力,在某个结点的服务器数据遭到破坏时能够保证业务处理不间断的运行。,第十二章SQLServer高级安全管理,12.1SQLServer的安全模型12.2SQLServer身份验证模式12.3创建登录帐号12.4分配服务器角色给登录12.5创建数据库用户12.6数据库角色12.7许可权限管理,12.1SQLServer的安全模型,SQLServer2000的安全模型分为三层结构。分别为服务器安全管理、数据库安全管理、数据库对象的访问权限管理。1.服务器安全管理2.数据库安全管理3.对象安全管理,12.2SQLServer身份验证模式,身份验证阶段用来识别用户的登录帐号和验证用户与SQLServer相连接的能力。如果验证成功,用户就能连接到SQLServer上。SQLServer使用两种身份验证模式WindowsOnly身份验证模式混和模式,12.3创建登录帐号,创建登录帐号时需要指出该帐号使用Windows身份验证还是使用SQLServer身份验证登录SQLServer。,12.4分配服务器角色给登录,当即个用户共同完成一个公共的活动时,管理员可以将他们集中到一个称为“角色”的单元中,并且给指定的角色分配一次权限既可。用户不能增加、修改和删除固定的服务器角色。,12.5创建数据库用户,一般情况下,用户登录SQLServer实例后,还不具备访问数据库的条件。在用户可以访问数据库之前,管理员必须为该用户在数据库中建立一个数据库帐号,作为访问数据库的ID。这个过程是,将SQLServer登录帐号映射到需要访问的每个数据库中,才能够访问数据库。缺省的数据库用户:guest用户dbo用户,12.6数据库角色,数据库角色分为固定数据库角色和用户定义角色,固定数据库角色预定义了数据库的安全管理权限和对数据对象的访问权限,用户定义角色由管理员创建并且定义对数据对象的访问权限。用户不能增加、修改和删除固定数据角色。,12.7许可权限管理,许可权限指明用户获得哪些数据库对象的使用权,以及用户能够对这些对象执行何种操作。在SQLServer中存在三种许可权限的类型:语句许可、对象许可、预定义许可。,权限的授予、拒绝和废除,例如,分别用下列三段语句授予、废除和拒绝数据库用户James和public角色对表authors的INSERT,UPDATE,DELETE权限:USEpubsGOGRANTINSERT,UPDATE,DELETEONauthorsTOJames,publicGODENYINSERT,UPDATE,DELETEONauthorsTOJames,publicGOREVOKEINSERT,UPDATE,DELETEONauthorsTOJames,publicGO,第十三章SQLSERVER数据库架构分析,13.1SQLSERVER2000数据库的系统目录13.2SQLSERVER数据库的逻辑架构13.3SQLSERVER存储空间分配13.4事务日志的体系结构,13.1SQLSERVER2000数据库的系统目录,SQLServer的目录分为公用文件目录和数据实例文件目录。,13.2SQLSERVER数据库的逻辑架构,数据库系统的结构一般划分为三个层次(也叫作三级模式),分别为模式、子模式和存储模式。,13.3SQLSER

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论