第九章SQLServer数据库基础PPT课件

1第九章 SQL Server数据库基础2本章要点本章要点客户客户/服务器体系结构服务器体系结构SQL Server 2000应用环境概述应用环境概述Transact-SQL程序设计程序设计存储过程存储过程触发器触发器39.1 客户/服务器体系结构l从技术角度看,客户从技术角度看,客户/服务器结构本身是一个非常简单的概服务器结构本身是一个非常简单的概念它是将计算机应用的大任务分解成多个子任务,由多念它是将计算机应用的大任务分解成多个子任务,由多台计算机协同完成台计算机协同完成l客户机接收客户的数据和处理要求,执行相应程序,把其客户机接收客户的数据和处理要求,执行相应程序,把其中的服务请求发给服务器,即向服务器提出对某种信息或中的服务请求发给服务器,即向服务器提出对某种信息或数据的服务请求,系统将选择最适宜完成该任务的服务器数据的服务请求,系统将选择最适宜完成该任务的服务器完成处理,服务器将结果作为服务响应返回客户完成处理,服务器将结果作为服务响应返回客户l在这一过程中,多任务之间存在多种交互关系,即在这一过程中,多任务之间存在多种交互关系,即“服务服务请求请求/服务响应服务响应”关系因此客户关系。
因此客户/服务器不应理解为是一种服务器不应理解为是一种硬件结构,而是一种计算(处理)模式硬件结构,而是一种计算(处理)模式49.1 客户/服务器体系结构 客户客户/服务器具有以下几个特征:服务器具有以下几个特征:l服务服务l位置透明性位置透明性l可扩展性可扩展性59.2 SOL Server 2000 应用环境概述lSQL Server是一个关系数据库管理系统,最初由是一个关系数据库管理系统,最初由Microsoft,Sybase和和Ashton-Tate三家公司联合开发的,于三家公司联合开发的,于1988年推出了第年推出了第一个一个OS/2版本后来,版本后来,Ashton-Tate公司退出了公司退出了SQL Server的开的开发而在Windows NT推出后,推出后,Microsoft与与Sybase在在SQL Server的开发上就分道扬镳了,的开发上就分道扬镳了,Microsoft将将SQL Server移植到移植到 Windows NT系统上,专注于开发推广系统上,专注于开发推广SQL Server的的Windows NT版本;版本;Sybase则较专注于则较专注于SQL Server在在UNIX操作系统上的应操作系统上的应用。
用1996年,年,Microsoft推出了推出了SQL Server 6.5版本,版本,1998年,年,SQL Server 7.0版本和用户见面;我们介绍的版本和用户见面;我们介绍的SQL Server 2000是是Microsoft公司公司2000推出的最新版本推出的最新版本69.2 SOL Server 2000 应用环境概述Microsoft SQL Server 2000包括四个常见版本:包括四个常见版本:企业版(企业版(Enterprise Edition)标准版(标准版(Standard Edition)个人版(个人版(Personal Edition)开发者版(开发者版(Developer Edition)l此外,此外,SQL Server 2000还有还有Desktop Engine(桌面(桌面引擎)和在引擎)和在Windows CE设备上进行数据存储的设备上进行数据存储的Windows CE版,用户可以根据实际情况选择所要安版,用户可以根据实际情况选择所要安装的装的SQL Server 2000版本79.2.2 SQL Serve9.2.2 SQL Server数据库组成l每个每个SQL服务器都有两种类型的数据服务器都有两种类型的数据库:系统数据库(库:系统数据库(System Database)和用户数据库(和用户数据库(User Database),如图如图9.2所示。
系统数据库一般用于存所示系统数据库一般用于存储储SQL Server的系统信息,的系统信息,SQL Server用系统数据库来操作和管理系用系统数据库来操作和管理系统用户数据库是用户所创建的数据统用户数据库是用户所创建的数据库89.2.2 SQL Server数据库组成系统数据库mastermodeltempdbmsdbUser1Northwindpubs图9.2 Microsoft SQL Server数据库用户数据库9l系统数据库和用户数据库在结构上完全相同系统数据库和用户数据库在结构上完全相同Microsoft SQL Server数据库有两种主要的结构:物理结构和逻辑结数据库有两种主要的结构:物理结构和逻辑结构数据库的物理存储结构是讨论数据库文件是如何在磁构数据库的物理存储结构是讨论数据库文件是如何在磁盘上存储的,数据库的逻辑存储结构指的是数据库是由哪盘上存储的,数据库的逻辑存储结构指的是数据库是由哪些性质的信息组成图些性质的信息组成图9.3中的中的Table就是组成数据库的逻就是组成数据库的逻辑成分,而物理实现部分的辑成分,而物理实现部分的mdf文件构成了数据库的物理文件构成了数据库的物理结构。
结构10物理结构是指实际存储的数据,其构架包括文件,文件组,页,盘区物理结构是指实际存储的数据,其构架包括文件,文件组,页,盘区等文件包括数据库文件和事物日志文件,等文件包括数据库文件和事物日志文件,SQL Server的数据和日的数据和日志文件可以放置在志文件可以放置在FAT或或NTFS文件系统中,但不能放在压缩文件系文件系统中,但不能放在压缩文件系统中物理结构物理结构图9.3 Microsoft SQL Server数据库结构简化示意图11 页和盘区页和盘区l页是基本存储单位,大小为页是基本存储单位,大小为8KB/页页包含页页包含了数据本身以及数据的物理存放位置的信息了数据本身以及数据的物理存放位置的信息每页的开始每页的开始96字节就是用于存储系统信息的,字节就是用于存储系统信息的,如页大小,剩余空间大小和该页所属对象的如页大小,剩余空间大小和该页所属对象的IDl在在SQL Server 2000 数据库系统中,页的类数据库系统中,页的类型有型有8种,如表种,如表9.1所示l表表9.1 SQL Server 2000页的类型页的类型12表表9.1 SQL Server 2000页的类型页的类型页类型内容数据引擎文本和图象全局分配图,辅助全局分配图页剩余空间索引分配图批修改图变化图包含数据行中除text,ntext和image数据外的所有数据索引属性text,ntext和image数据有关盘区分配的信息关于页剩余空间的信息有关表或索引所使用的盘区的信息从上次执行BASKUP LOG语句到批操作之间所修改的盘区信息从上次执行BACKUP DATABASE到现在的更改的盘区的信息13l在数据页上,数据行紧接着页首按顺序放置。
在页尾有一个行偏在数据页上,数据行紧接着页首按顺序放置在页尾有一个行偏表在行偏表中,页面上的每一行都有一个条目,每个条目记录表在行偏表中,页面上的每一行都有一个条目,每个条目记录那一行的第一个字节与页首的距离行偏移的条目序列与页中行那一行的第一个字节与页首的距离行偏移的条目序列与页中行的序列相反,见图的序列相反,见图9.4在SQL Server中,行不能跨页中,行不能跨页数据页结构数据页结构首页数据1数据2可用空间123数据3图9.4 Microsoft SQL Server数据页的结构14盘区盘区l首页数据1数据2可用空间123数据3图9.4 Microsoft SQL Server数据页的结构l盘区是为表和索引分配存储空间的基本单元,大小为8个相邻的页,即64KB为了使空间指派更有效SQL Server 2000对只含少量数据的表不分配完整的盘区SQL Server 2000有两种类型的盘区:统一扩展盘区,由单个对象所有,8页全部只能由拥有该盘区的对象使用;混合扩展盘区,最多可由8个对象共享l通常从混合扩展盘区中向新表或新索引分配页当表或索引增长到8页时,就变成统一扩展盘区,如果在现有表上创建索引,并且该表包含的行足以在索引中生成8页,则对该索引的所有分配都在统一扩展盘区内进行。
15l数据库文件(数据库文件(Database File)是存放数据库和数据库对象的文件是存放数据库和数据库对象的文件一个数据库可以有一个或多个数据库文件,一个数据库文件只属一个数据库可以有一个或多个数据库文件,一个数据库文件只属于一个数据库当有多个数据库文件时,有一个文件被定义为主于一个数据库当有多个数据库文件时,有一个文件被定义为主数据库文件(数据库文件(Primary Database File),扩展名为),扩展名为.mdf,它用来,它用来存储数据库的启动信息和部分或全部信息一个数据库只能有一存储数据库的启动信息和部分或全部信息一个数据库只能有一个 主 数 据 库 文 件其 他 数 据 库 文 件 被 称 为 次 数 据 库 文 件个 主 数 据 库 文 件其 他 数 据 库 文 件 被 称 为 次 数 据 库 文 件(Secondary Database File),扩展名为扩展名为.ndf,用来存储主文件没用来存储主文件没存储的其他数据在数据庞大时,次数据库文件可以帮助存储数存储的其他数据在数据庞大时,次数据库文件可以帮助存储数据数据库文件数据库文件16l采用多个数据库文件来存储数据的优点体现在:采用多个数据库文件来存储数据的优点体现在:l数据库文件可以不断扩充而不受操作系统文件大小的限制。
数据库文件可以不断扩充而不受操作系统文件大小的限制l可以将数据库文件存储在不同的硬盘中,这样可以同时对几个硬可以将数据库文件存储在不同的硬盘中,这样可以同时对几个硬盘做数据存取,提高了数据处理的效率,这对于服务型的计算机盘做数据存取,提高了数据处理的效率,这对于服务型的计算机尤为有用尤为有用l事务日志文件事务日志文件l事务日志文件(事务日志文件(Transaction Log File)是用来记录数据库更新)是用来记录数据库更新情况的文件,扩展名情况的文件,扩展名.ldf例如,使用例如,使用INSERT,UPDATE,DELETE等对数据库进行更改的操作都会记录在此文件中,而如等对数据库进行更改的操作都会记录在此文件中,而如SELECT等对数据库内容不会有影响的操作则不会记录在案一等对数据库内容不会有影响的操作则不会记录在案一个数据库可以有一个或多个事务日志文件个数据库可以有一个或多个事务日志文件lSQL Server中采用中采用“提前写日志(提前写日志(Write-Ahead Logging)”方式,即对数据库的修改先写入事务日志中,再写入数据库方式,即对数据库的修改先写入事务日志中,再写入数据库。
数据库文件数据库文件17l为了便于分配和管理,为了便于分配和管理,SQL Server允许将多个文件归纳为一组,允许将多个文件归纳为一组,并赋予此组一个名称,这就是文件组(并赋予此组一个名称,这就是文件组(File Group),文件组是),文件组是将多个数据库文件集合起来形成的一个整体每个文件组有一个将多个数据库文件集合起来形成的一个整体每个文件组有一个组名一个文件只能存在于一个文件组中,一个文件组也只能被组名一个文件只能存在于一个文件组中,一个文件组也只能被一个数据库使用一个数据库使用l与数据库文件一样,文件组也分为主文件组和次文件组,主文件与数据库文件一样,文件组也分为主文件组和次文件组,主文件中包含了所有的系统表当建立数据库时,主文件组包括主数据中包含了所有的系统表当建立数据库时,主文件组包括主数据库文件和未明确指定组的其他文件文件组中可以指定一个缺省库文件和未明确指定组的其他文件文件组中可以指定一个缺省文件组,那么在创建数据库文件时,如果没有指定将其放在哪一文件组,那么在创建数据库文件时,如果没有指定将其放在哪一个文件组中,就会将它放在缺省文件组中如果没有指定缺省文个文件组中,就会将它放在缺省文件组中。
如果没有指定缺省文件组,则主文件组为缺省文件组件组,则主文件组为缺省文件组l只有数据文件才能作为文件组的成员,日志文件不能作为文件组只有数据文件才能作为文件组的成员,日志文件不能作为文件组的成员3)(3)文件组文件组18l逻辑结构对应存储数据的抽象表示逻辑结构对应存储数据的抽象表示SQL Server的数据库不仅仅的数据库不仅仅是数据的存储,所有与数据处理操作相关的信息都存储在数据库是数据的存储,所有与数据处理操作相关的信息都存储在数据库中,是一个存放数据的表和支持这些数据的存储、检索、安全性中,是一个存放数据的表和支持这些数据的存储、检索、安全性和完整性的逻辑成分所组成的集合组成数据库的所有逻辑成分和完整性的逻辑成分所组成的集合组成数据库的所有逻辑成分称为数据库的对象,如:关系图、表、视图、存储过程、用户、称为数据库的对象,如:关系图、表、视图、存储过程、用户、角色、规则、默认值、用户自定义数据类型和用户自定义函数等角色、规则、默认值、用户自定义数据类型和用户自定义函数等lSQL Server的对象名可以是对象的全名(完全限定名),也可以的对象名可以是对象的全名(完全限定名),也可以是对象的省略名(部分限定名)。
完全限定名包含四个标识符:是对象的省略名(部分限定名)完全限定名包含四个标识符:服务器名,数据库名,所有者名和数据库对象名,顺序如下:服服务器名,数据库名,所有者名和数据库对象名,顺序如下:服务 器 名、数 据 库 名、所 有 者 名、数 据 库 对 象 名务 器 名、数 据 库 名、所 有 者 名、数 据 库 对 象 名(Server.database.owner.object),包含全部这四部分的对象名包含全部这四部分的对象名叫做全名叫做全名逻辑结构逻辑结构19 表结构和视图表结构和视图表9.2 常用的系统表sysloginssysdatadasessysmessagessysuserssysobjectsmastermastermaster全部全部系统表数据库功能每个连接到SQL服务器的登录帐号,都有相应的一行每个SQL服务器返回的警告或系统错误,都有相应的一行SQL服务器中每个数据库,都有相应的一行每个Windows用户,Windows工作组,SQL服务器用户和SQL服务器角色,都有相应的一行数据库中每个对象,都有相应的一行20 数据类型数据类型 lSQL Server 2000的数据类型分为系统数据类型与自定义数据类型。
l系统数据类型如表9.3(详见教材)所示,只有字符与二进制数据类型需要指定长度,其他如整型,日期时间,浮点数据类型,定义时不用指定长度,即长度是默认值l自定义数据类型是建立在SQL Server系统数据类型基础上的需要指定该类型的名称,建立在其上的系统数据类型及是否允许为空21 存储过程l存储过程是一组编译在单个执行计划中的Transat-SQL语句可以从客户端应用程序,或从其他存储过程和触发器来调用它l存储过程帮助在不同的应用程序之间实现一致的逻辑在一个存储过程中,可以设计,编码和测试执行某个常用任务所需的SQL语句和逻辑之后,每个需要执行该任务的应用程序只须执行此存储过程即可将业务逻辑编入单个存储过程还提供了单个控制点,以确保业务规则正确执行l存储过程还可以提高性能许多任务以一系列SQL语句来执行对前面SQL语句的结果所应用的条件逻辑决定后面执行的SQL语句如果将这些SQL语句和条件逻辑写入一个存储过程,它们就成为服务器上一个执行计划的一部分,所有工作都可以在服务器上完成l应用程序不必传输存储过程中的所有SQL语句:它们只需传输包含过程名和参数值的EXECUTE22 用户自定义函数l在SQL Server 2000 中,用户可以创建自定义函数。
在SQL Server 2000中用户自定义函数是作为一个数据库对象来管理的可以使用企业管理器或Transat-SQL命令来创建,修改,删除23 约束,规则,默认值和触发器l表中列的属性除了包含数据类型和长度外,还有一些重要的信息,共同维护数据完整性用于维护数据完整性的对象包括:约束,规则,默认值和触发器其中,约束在第三章有简单的介绍l规则是一个向后兼容的功能,用于执行一些与CHECK约束相同的功能CHECK约束是用来限制列值的首选标准方法CHECK约束比规则更简明,一个列只能应用一个规则,但可以应用多个CHECK约束CHECK约束作为CREATE TABLE语句的一部分进行指定,而规则以单独的对象创建,然后绑定到列上l如果在插入行时没有指定列的值,那么将使用默认值默认值可以是任何取值为常量的对象,例如,常量,内置函数和数学表达式l在Microsoft SQL Server 2000 中,触发器是一类特殊的存储过程,被定义为在表或视图发出UPDATE,INSERT或DELETE语句时自动执行触发器是功能强大的工具,使每个站点可以在有数据修改时自动强制执行其业务规则触发器可以扩展SQL Server约束,默认值和规则的完整性逻辑检查,但只要约束和默认值提供了全部所需的功能,就应使用约束和默认值。
在9.5节将详细介绍触发器24l企业管理器企业管理器l查询分析器查询分析器l服务管理器(服务管理器(Server Manager)l客户端网络实用工具(客户端网络实用工具(Client Network Utility)l服务器网络实用工具(服务器网络实用工具(Server Network Utility)l导入和导出数据(导入和导出数据(Import and Export Data)l在在IIS中设置中设置SQL XML支持(支持(Configure SQL XML Support in IIS)l事件探查器(事件探查器(Profiler)l联机丛书(联机丛书(Book Online)lSQL Server的升级向导的升级向导9.2.3 SQL Server工具259.3 Transact-SQL 程序设计lTransact-SQL是是SQL Server 2000支持的数据库语言,不支持的数据库语言,不但遵从入门级的但遵从入门级的SQL-92标准而且还支持标准而且还支持SQL-92标准的标准的一些强大的扩展一些强大的扩展Transact-SQL也有类似于也有类似于SQL语言的分语言的分类,不过做了许多扩充,包括数据定义语言类,不过做了许多扩充,包括数据定义语言DDL(Data Definition Language)、数据操纵语言)、数据操纵语言DML(Data Manipulation Language)、数据控制语言)、数据控制语言DCL(Data Control Language)、系统存储过程)、系统存储过程(System Stored Procedure)和一些附加的语言元素等。
和一些附加的语言元素等l在第在第3章中,我们曾介绍了标准章中,我们曾介绍了标准SQL语言的语法及其基本语言的语法及其基本使用方法(包括使用方法(包括DDL、DML和和DCL)在此只介绍)在此只介绍Transact-SQL语言中与语言中与SQL-92不同的一些语句及格式,不同的一些语句及格式,此外还介绍一些附加的语言元素,包括注释、变量、运算此外还介绍一些附加的语言元素,包括注释、变量、运算符、函数和流程控制语句符、函数和流程控制语句261.创建和管理数据库创建和管理数据库l创建数据库包括:定义数据库名;确定数据创建数据库包括:定义数据库名;确定数据库文件及其大小;确定事务日志文件的位置库文件及其大小;确定事务日志文件的位置和大小创建数据库使用和大小创建数据库使用CREATE DATABASE语句,其语法为:语句,其语法为:9.3.1 Transact-SQL的数据定义功能及实例27CREATE DATABASEON PRIMARY(NAME=FILENAME=,SIZE=,MAXSIZE=,FILEROWTH=),nLOG ON(NAME=,FILENAME=,SIZE=,FILEROWTH=),nFOR RESTORE9.3.1 Transact-SQL的数据定义功能及实例28Create Database 学生选课学生选课on(Name=学生选课学生选课_DAT,FileName=d:学生选课学生选课学生选课学生选课_DAT.MDF,Size=2MB,FileGrowth=10%)Log on(Name=学生选课学生选课_LOG,FileName=d:学生选课学生选课学生选课学生选课_LOG.LDF,Size=1MB,FileGrowth=10%)例9.1 创建一个学生选课数据库29数据库的选择使用数据库的选择使用USE命令,其格式为:命令,其格式为:lUSE 注意:在注意:在Transact SQL中没有语法结束符号。
中没有语法结束符号语句结束后按语句结束后按键,并另起一行输入键,并另起一行输入GO语句,再按语句,再按键否则语句不会执键否则语句不会执行2)选择数据库30删除数据库的语法为:删除数据库的语法为:DROP DATABASE ,.数数据库名据库名n(3)删除数据库312.2.定义表定义表定义基本表使用定义基本表使用CREATE TABLE 命令,其功能命令,其功能是定义表名、列名、数据类型、初始值和步长是定义表名、列名、数据类型、初始值和步长等,还包括定义表的完整性约束和缺省值等,还包括定义表的完整性约束和缺省值定义基本表的格式为:定义基本表的格式为:CTEATE TABLE(|AS ,)上述格式有以下问题需要说明上述格式有以下问题需要说明322.2.定义表定义表上述格式有以下问题需要说明上述格式有以下问题需要说明1)字段级约束)字段级约束字段级约束指只涉及到单个字段的约束,可以使用以下短语定义:字段级约束指只涉及到单个字段的约束,可以使用以下短语定义:1)NOT NULL|NULL:定义不允许或允许字段值为空定义不允许或允许字段值为空2)PRIMATY KEY CLUSTERED|NON CLUSTERED:定义该字:定义该字段为主码并建立聚集或非聚集索引。
段为主码并建立聚集或非聚集索引3)REFERENCES ():定义该字段为:定义该字段为外码,并指出被参照表及对应字段外码,并指出被参照表及对应字段4)DEFAULT :定义字段的缺省值定义字段的缺省值5)CHECK():定义字段应满足的条件表达式定义字段应满足的条件表达式6)IDENTITY(,):定义字段为数值型数据,:定义字段为数值型数据,并指出它的初始值和逐步增加的步长值并指出它的初始值和逐步增加的步长值332.2.定义表定义表(2)记录级约束)记录级约束 记录级约束指涉及到表中多个字段的约束,其格式为:记录级约束指涉及到表中多个字段的约束,其格式为:CONSTRAINT 约束式主要有以下几种约束式主要有以下几种1)PRIMARY KEY CLUSTERED|NONCLUSTERED():定义表的主码并建立主码的聚集或非聚集索引定义表的主码并建立主码的聚集或非聚集索引2)FOREIGN KEY()REFERENCES ():指出表的外码和被参照表指出表的外码和被参照表3)CHECK():定义记录应满足的条件定义记录应满足的条件4)UNIQUE():定义不允许重复值的字段组定义不允许重复值的字段组。
34(1)修改基本表)修改基本表修改基本表是指修改列的数据类型、长度、列的完整性约修改基本表是指修改列的数据类型、长度、列的完整性约束、增加一个新列或删除列,修改表还包括对修改记录束、增加一个新列或删除列,修改表还包括对修改记录级完整性约束修改表的语法可分为级完整性约束修改表的语法可分为4种1)修改字段的定义修改字段的定义修改字段的定义主要为修改字段宽度和字段约束,不能改修改字段的定义主要为修改字段宽度和字段约束,不能改动字段名称修改字段的语法为:动字段名称修改字段的语法为:ALTER TABLE ALTER COLUMN NULL|NOT NULL 3.基本表的维护基本表的维护352)增加字段和表约束规则增加字段和表约束规则增加字段和表约束规则的格式为:增加字段和表约束规则的格式为:ALTER TABLE ADD|.3)删除字段或约束规则删除字段或约束规则删除字段或表级约束规则的格式为:删除字段或表级约束规则的格式为:ALTER TABLE DROPCONSTRAINT|COLUMN 4)使约束有效或无效使约束有效或无效使原表定义的约束暂时有效或无效的格式为:使原表定义的约束暂时有效或无效的格式为:ALTER TABLE CHECK|NOCHECKCONSTRAINTALL|其中:其中:CHECK为使约束有效,为使约束有效,NOCHECK为使约束无效;为使约束无效;ALL指全部约束。
指全部约束2)删除基本表)删除基本表删除基本表的语法为:删除基本表的语法为:DROP TABLE 3.基本表的维护基本表的维护36数据操纵语句主要包括数据操纵语句主要包括SELECT(查询)、(查询)、INSERT(插入)、(插入)、UPDATE(修改)和(修改)和DELETE(删除)(删除)4种语句Transact-SQL对对SQL-92的数据操纵语句细节作了改进,使之的数据操纵语句细节作了改进,使之功能更强大,使用更方便本节对其扩展部分功能更强大,使用更方便本节对其扩展部分着重讲述着重讲述9.3.2 Transact-SQL的数据操纵功能及实例的数据操纵功能及实例371.数据检索语句的语句格式数据检索语句的语句格式在在SQL-92中,组成中,组成SELECT语句的子句有语句的子句有SELECT、FROM、WHERE、GROUP BY 和和ORDER BY,其作用分别是指定列、表、,其作用分别是指定列、表、元组条件、分组条件和排序要求元组条件、分组条件和排序要求Transact-SQL语句则有更多的语句则有更多的子句,其语法为:子句,其语法为:SELECT INTO FROM WHERE GROUP BY HAVING ORDER BY COMPUTE BY 9.3.2 Transact-SQL的数据操纵功能及实例的数据操纵功能及实例38下面以子句为例,对上述语句进行解释。
下面以子句为例,对上述语句进行解释1)SELECT子句子句SELECT子句的功能是确定结果列子句的功能是确定结果列SELECT子句的语法为:子句的语法为:SELECTALL|DISTINCTTOP PERCENT 其中的查询列可以表示为:其中的查询列可以表示为::=*|.*|AS|=上述上述SELECT子句语法中:子句语法中:1)ALL|DISTINCT选项:选项:ALL为返回结果集中的所有行;为返回结果集中的所有行;DISTINCT为仅显示结果集中的唯一行该项不选时,为仅显示结果集中的唯一行该项不选时,ALL是缺省是缺省值9.3.2 Transact-SQL的数据操纵功能及实例的数据操纵功能及实例392)TOP 选项:仅返回结果集中的前选项:仅返回结果集中的前 行如果有如果有PERCENT,则返回结果集中的百分之,则返回结果集中的百分之 行记录3)“*”:指明返回在:指明返回在FROM子句中包括的表和视图的子句中包括的表和视图的全部列4).*:指明返回指定表或视图的全部列指明返回指定表或视图的全部列5):结果列表达式可以是一个由列名、常量、:结果列表达式可以是一个由列名、常量、函数,通过操作符(或者子查询)连接起来的数据表函数,通过操作符(或者子查询)连接起来的数据表达式。
达式6):用来代替出现在结果集中的列名或表达:用来代替出现在结果集中的列名或表达式,别名可以在式,别名可以在ORDER BY 子句中出现,但不能在子句中出现,但不能在WHERE、GROUP BY或或HAVING子句中出现子句中出现9.3.2 Transact-SQL的数据操纵功能及实例的数据操纵功能及实例40(2)INTO子句子句INTO子句用于创建一个表,并将查询结果添加子句用于创建一个表,并将查询结果添加到该表中到该表中INTO不能与不能与COMPUTE子句同时使子句同时使用如果创建的是临时表,则在表名前加用如果创建的是临时表,则在表名前加“#”字符3)FROM子句子句FORM子句用于指定查询的数据源表,子句用于指定查询的数据源表,FROM子子句一般为必选子句,其语法格式为:句一般为必选子句,其语法格式为:FROM 9.3.2 Transact-SQL的数据操纵功能及实例的数据操纵功能及实例41数据源的语法为:数据源的语法为::=AS WITH()|AS|AS|AS|上面的语法中,数据源包括表、视图、行集合函数表示的数据集合、上面的语法中,数据源包括表、视图、行集合函数表示的数据集合、嵌套的嵌套的SELECT语句表示的结果集以及数据连接表的结果集。
连语句表示的结果集以及数据连接表的结果集连接表的语法为:接表的语法为::=ON|CROSSJOIN|:=INNER|LEFT|RIGHT|FULLOUTERJOIN9.3.2 Transact-SQL的数据操纵功能及实例的数据操纵功能及实例42其中:其中:1)INNER为内连接,它返回所有连接匹配的行内连接是连接类型为内连接,它返回所有连接匹配的行内连接是连接类型的缺省值的缺省值2)LEFT OUTER为左外连接左外连接的结果集中不但包括了内为左外连接左外连接的结果集中不但包括了内连接返回的行,而且还包括了左边表中不满足连接条件的行那连接返回的行,而且还包括了左边表中不满足连接条件的行那些不满足连接条件的行所对应的右边表的列将会显示些不满足连接条件的行所对应的右边表的列将会显示NULL值3)RIGHT OUTER为右外连接右外连接的结果集中不但包括内为右外连接右外连接的结果集中不但包括内连接返回的行,而且还包括右边表中不满足连接条件的行那些连接返回的行,而且还包括右边表中不满足连接条件的行那些不满足连接条件的行所对应的左边表的列将会显示不满足连接条件的行所对应的左边表的列将会显示NULL值。
值4)FULL OUTER为完全外连接完全外连接的结果集中不但包括为完全外连接完全外连接的结果集中不但包括了内连接返回的行,同时也包括左边表和右边表中的所有不满足了内连接返回的行,同时也包括左边表和右边表中的所有不满足条件的行,但是与其对应的右边表或左边表的列将会显示条件的行,但是与其对应的右边表或左边表的列将会显示NULL值9.3.2 Transact-SQL的数据操纵功能及实例的数据操纵功能及实例435)ON 用于指定连接条件连接条件表达用于指定连接条件连接条件表达式为:式为:条件表达式中的两个列名并不一定是相同的名字或具有条件表达式中的两个列名并不一定是相同的名字或具有相同的数据类型,但是两者必须是相兼容的或者相同的数据类型,但是两者必须是相兼容的或者SQL Server可以对它们做隐式转换的如果它们不可以进可以对它们做隐式转换的如果它们不可以进行隐式转换,则必须使用专门的函数(如行隐式转换,则必须使用专门的函数(如CAST函数)函数)进行显式转换进行显式转换6)CROSS JOIN为交叉连接,即对两个表进行笛卡儿为交叉连接,即对两个表进行笛卡儿积运算其结果是返回两个表的交叉匹配结果。
交叉积运算其结果是返回两个表的交叉匹配结果交叉连接也可以通过在连接也可以通过在FROM子句中指定连接表而在子句中指定连接表而在WHERE子句中不指明连接条件来表达子句中不指明连接条件来表达9.3.2 Transact-SQL的数据操纵功能及实例的数据操纵功能及实例44(4)WHERE子句子句WHERE子句用于指定查询条件以及数据连接条件子句用于指定查询条件以及数据连接条件WHERE子句的语法为:子句的语法为:WHERE|:=*=|=*虽然旧格式的外连接条件也可以表示表间的左连接(虽然旧格式的外连接条件也可以表示表间的左连接(*=)或右连接(或右连接(=*),但由于这种表示存在二义性,所以),但由于这种表示存在二义性,所以外连接最好通过外连接最好通过FROM子句表示子句表示9.3.2 Transact-SQL的数据操纵功能及实例的数据操纵功能及实例45(5)GROUP BY子句子句GROUP BY子句用于对结果集分组分组会影响到统计子句用于对结果集分组分组会影响到统计函数的结果:如果有函数的结果:如果有GROUP BY子句,则按组进行数子句,则按组进行数据统计;否则,对全部数据统计据统计;否则,对全部数据统计。
GROUP BY的语法为:的语法为:GROUP BYALL 其中:其中:1)ALL为在结果集中包括所有的组,其中包括一组不为在结果集中包括所有的组,其中包括一组不满足满足WHERE子句指定条件的记录这个由不满足条子句指定条件的记录这个由不满足条件的元组构成的组,其总和将返回一个空值件的元组构成的组,其总和将返回一个空值2)分组表达式是分组所基于的表达式,该表达式一般)分组表达式是分组所基于的表达式,该表达式一般为列名SELECT语句可以有多个分组表达式语句可以有多个分组表达式9.3.2 Transact-SQL的数据操纵功能及实例的数据操纵功能及实例46(6)HAVING子句子句HAVING子句用于指定分组或汇总筛选条件,子句用于指定分组或汇总筛选条件,HAVING子句的格式为:子句的格式为:HAVING(7)ORDER BYORDER BY子句用于指明排序项和排序要求,其语法为:子句用于指明排序项和排序要求,其语法为:ORDER BY ASC|DESC,n(8)COMPUTE子句子句COMPUTE子句的作用是产生汇总值,并在结果集后将汇总值放入摘子句的作用是产生汇总值,并在结果集后将汇总值放入摘要列,要列,COMPUTE与与BY配合,将起到换行控制和分段小计的作用。
配合,将起到换行控制和分段小计的作用COMPUTE子句的语法如下:子句的语法如下:COMPUTE BY 其中:其中:BY 表示在结果集中产生换行控制及分段小计表示在结果集中产生换行控制及分段小计COMPUTE BY必须和必须和ORDER BY配合使用,分组项应完全等于配合使用,分组项应完全等于排序项9.3.2 Transact-SQL的数据操纵功能及实例的数据操纵功能及实例47查询语句中使用的运算符号查询语句中使用的运算符号Transact-SQL的查询语句中使用的运算符,如表的查询语句中使用的运算符,如表9.4所示9.3.2 Transact-SQL的数据操纵功能及实例的数据操纵功能及实例类别类别符号符号算术运算符+(加),(减),*(乘),/(除),%(取余或模)比较运算符=(等于),(大于),=(大于等于或不小于),!(不小于),(不小于),(不等于),!=(不等于)范围运算符BETWEENAND.(在.之间),NOT BETWEEN.AND.(不在.之间)子查询运算符IN(在之中),NOT IN(不在之中),ALL(全部),ANY(任一),SOME(一些),EXISTS(存在),NOT EXISTS(不存在)字符串查询符+(连接),LIKE(匹配),NOT LIKE(匹配)未知值运算符IS NULL(是空值),NOT IS NULL(不是空值)逻辑运算符NOT(非),AND(与),OR(或)组合运算符UNION(并),NUION ALL(并,允许重复的元组)48LIKE是字符模式匹配操作符。
是字符模式匹配操作符LIKE操作符使用的通配符如表操作符使用的通配符如表9.5所示9.3.2 Transact-SQL的数据操纵功能及实例的数据操纵功能及实例通配符通配符描述描述示例示例%包含零个或更多字符的任意字符串WHERE title LIKE%computer%将查找处于书名任意位置的包含单词 computer 的所有书名下划线)任何单个字符WHERE au_fname LIKE _ean 将查找以 ean 结尾的所有 4 个字母的名字(Dean、Sean 等)指定字符范围(a-f)或集合(abcdef)中的任何单个字符WHERE au_lname LIKE C-Parsen 将查找以arsen 结尾且以介于 C 与 P 之间的任何单个字符开始的作者姓氏,例如,Carsen、Larsen、Karsen 等不属于指定范围(a-f)或集合(abcdef)的任何单个字符WHERE au_lname LIKE del%将查找以 de 开始且其后的字母不为 l 的所有作者的姓氏49在Transact-SQL还提供了一些常用函数以供表达式使用,见表9.6所示9.3.2 Transact-SQL的数据操纵功能及实例的数据操纵功能及实例函数参数意义AVG(ALL|DISTINCT)求数值表达式的值,可以针对全部值或不重复值两种情况COUNT(ALL|DISTINCT)统计表达式的值,可以针对全部值或不重复值两种情况COUNT(*)统计记录数MAX()求表达式的最大值MIN()求表达式的最小值SUM(ALL|DISTINCT)求算术表达式的和,可有针对全部值或不重复值两种情况STDEV()求表中所有值的标准偏差STDEVP()求所有涉及数值的标准偏差VAR()求表中所有值的方差VARP()求所涉及数值的方差50例例9.2 9.2 在学生选课数据库中定义学生表在学生选课数据库中定义学生表S Suse 学生选课学生选课-如果在如果在sysobjects表中存在表中存在S表的定义,则首先进行删除处理表的定义,则首先进行删除处理if(select count(*)from sysobjects where name=S and Xtype=U)0drop table dbo.sGOCREATE TABLE s(snum char(7)primary key,sname char(8)NOT NULL,ssex char(2)default 男男 check(ssex in(男男,女女),sbirth datetime,sphone char(10),dnum char(7)go51select*into S_1 from S where SSex=女女go例例9.3 选择出选择出S表中的女同学,并存入到表中的女同学,并存入到S_1表中表中52例例9.4 9.4 在在SCSC表中使用表中使用ComputeComputeByBy子句子句select Snum,Scorefrom SCorder by Snumcompute AVG(Score)by Snum539.3.39.3.3 注释符与运算符注释是程序代码中不执行的文本字符串(也称为注释)。
在注释是程序代码中不执行的文本字符串(也称为注释)在SQL Server中,中,可以使用两种类型的注释字符:可以使用两种类型的注释字符:ANSI标准的注释符标准的注释符“-”用于单行注释用于单行注释与与C语言相同的程序注释符号,即语言相同的程序注释符号,即“/*/”,“/*”用于注释文字的开头,用于注释文字的开头,“*/”用于注释文字的结尾,可在程序中标识多行文字为注释用于注释文字的结尾,可在程序中标识多行文字为注释例如:例如:-单行注释单行注释/*多行注释多行注释 Snum VARCHAR(4):存放学号:存放学号 Snum VARCHAR(4):存放姓名:存放姓名*/运算符是在关系的属性或变量之间进行各种运算的符号,包括算术运算符、运算符是在关系的属性或变量之间进行各种运算的符号,包括算术运算符、位运算符、比较运算符、逻辑运算符等,另外,位运算符、比较运算符、逻辑运算符等,另外,SQL Server使用算使用算术运算符加(术运算符加(+)作字符串的连接运算作字符串的连接运算54变量是一种语言中必不可少的组成部分变量是一种语言中必不可少的组成部分Transact-SQL语言中有两种形式的变量:一语言中有两种形式的变量:一种是用户自己定义的局部变量;另外一种是系种是用户自己定义的局部变量;另外一种是系统提供的全局变量。
统提供的全局变量局部变量局部变量局部变量被引用时要在其名称前加上标志局部变量被引用时要在其名称前加上标志“”,而且必须先用而且必须先用DECLARE命令定义后才可以使命令定义后才可以使用其说明形式如下:用其说明形式如下:DECLARE 变量名变量名 变量类型变量类型,变量名变量名 变量变量类型类型9.3.4 变量55同时,在同时,在Transact-SQL中不能像在一般的程序语言中中不能像在一般的程序语言中一样使用一样使用“变量变量=变量值变量值”来给变量赋值,必须使用来给变量赋值,必须使用SELECT 或或SET命令来设定变量的值其语法如下:命令来设定变量的值其语法如下:SELECT 局部变量局部变量1=变量值变量值1,局部变量局部变量n=变量值变量值nSET 局部变量局部变量=变量值变量值例例9.5 声明一个长度为声明一个长度为4个字符的变量个字符的变量Snum,并赋值一并赋值一个学号个学号“S003”解:解:declare Snum char(4)-存放学号存放学号 select Snum=S003-赋值赋值9.3.4 变量56全局变量全局变量 全局变量是全局变量是SQL Server系统内部使用的变量,其作用范围并不仅仅系统内部使用的变量,其作用范围并不仅仅局限于某一程序,而是任何程序均可以随时调用。
全局变量通局限于某一程序,而是任何程序均可以随时调用全局变量通常存储一些常存储一些SQL Server的配置设定值和统计数据用户可以在的配置设定值和统计数据用户可以在程序中用全局变量来测试系统的设定值或者是程序中用全局变量来测试系统的设定值或者是Transact-SQL命命令执行后的状态值令执行后的状态值全局变量不是由用户的程序定义的,它们是在服务器级定义的,只全局变量不是由用户的程序定义的,它们是在服务器级定义的,只能使用预先说明及定义的全局变量局部变量的名称不能与全能使用预先说明及定义的全局变量局部变量的名称不能与全局变量的名称相同,否则会在应用中出错局变量的名称相同,否则会在应用中出错引用全局变量时必须以引用全局变量时必须以“”开头例例9.6 输出当前版本信息输出当前版本信息解:解:print version-输出当前版本信息输出当前版本信息9.3.4 变量579.3.59.3.5 流程控制语句流程控制语句是指那些用来控制程序执行和流程分支的命令,在流程控制语句是指那些用来控制程序执行和流程分支的命令,在SQL Server 2000中,流程控制语句主要用来控制中,流程控制语句主要用来控制SQL语句、语语句、语句块或者存储过程的执行流程。
句块或者存储过程的执行流程Transact-SQL语言使用的流程控制命令与常见的程序设计语言类语言使用的流程控制命令与常见的程序设计语言类似,主要有以下几种控制命令似,主要有以下几种控制命令BEGINENDBEGINEND语句能够将多个语句能够将多个Transact-SQL语句组合成一个语句语句组合成一个语句块,并将在块,并将在BEGINEND内的所有程序视为一个单元处理在内的所有程序视为一个单元处理在条件语句(如条件语句(如IFELSE)和循环等控制流程语句中,当符合特)和循环等控制流程语句中,当符合特定条件便要执行两个或者多个语句时,就需要使用定条件便要执行两个或者多个语句时,就需要使用BEGINEND语句,其语法形式为:语句,其语法形式为:BEGINEND在在BEGINEND中可嵌套另外的中可嵌套另外的BEGINEND来定义另一程序块来定义另一程序块58Begin end 说明一个语句块循环语句whiledeclare position int,string varchar(8)set position=1set string=china while position=datalength(string)begin select ascii(substring(string,position,1),char(ascii(substring(string,position,1)set position=position+1 end599.3.59.3.5 流程控制语句IFELSEIFELSE语句是条件判断语句。
语句是条件判断语句IFELSE语句用来判断当语句用来判断当某一条件成立时执行某段程序,条件不成立时执行另一段某一条件成立时执行某段程序,条件不成立时执行另一段程序其语法如下:程序其语法如下:IF ELSE条件表达式条件表达式其中,其中,可以是各种表达式的组合,但表达式的可以是各种表达式的组合,但表达式的值必须是逻辑值值必须是逻辑值“真真”或或“假假”;ELSE子句是可选的,子句是可选的,最简单的最简单的IF语句没有语句没有ELSE子句部分子句部分IFELSE可以进行嵌套,在可以进行嵌套,在Transact-SQL中最多可嵌套中最多可嵌套32级609.3.59.3.5 流程控制语句例例9.7 从从SC(选修表)中求出学号为(选修表)中求出学号为“S030101”的同学的平均成绩,如果此平均成绩大于或等的同学的平均成绩,如果此平均成绩大于或等于于90分,则输出分,则输出“优秀优秀”字样解:解:IF(select avg(Score)from SC where Snum=S030101 group by Snum)=90BEGINprint优秀优秀END619.3.59.3.5 流程控制语句CASECASE 命令有两种语句格式:命令有两种语句格式:(1)CASE WHEN THEN WHEN THEN ELSE END该语句的执行过程是:该语句的执行过程是:将将CASE后面表达式的值与各后面表达式的值与各WHEN子句中的表达式的值进行比较,子句中的表达式的值进行比较,如果二者相等,则返回如果二者相等,则返回THEN后的表达式的值,然后跳出后的表达式的值,然后跳出CASE语句,否则返回语句,否则返回ELSE子句中的表达式的值。
子句中的表达式的值ELSE子句是可选项当子句是可选项当CASE语句中不包含语句中不包含ELSE子句时,如果所子句时,如果所有比较失败时,有比较失败时,CASE语句将返回语句将返回NULL629.3.59.3.5 流程控制语句例例9.8 从学生表从学生表S中,选取中,选取Snum,Ssex,如果,如果Ssex为为“男男”则显示则显示“M”,如果为,如果为“女女”,显示,显示“F”解:解:lSELECT Snum,l CASE Ssexl WHEN 男男 THEN Ml WHEN 女女 THEN Fl END AS 性别性别l FROM S639.3.59.3.5 流程控制语句(2)CASEWHEN THEN WHEN THEN ELSE END该语句的执行过程是:该语句的执行过程是:首先测试首先测试WHEN后的表达式的值如果其值为真,则返回后的表达式的值如果其值为真,则返回THEN后面的表达式的值,否则测试下一个后面的表达式的值,否则测试下一个WHEN子句中子句中的表达式的值如果所有的表达式的值如果所有WHEN子句后的表达式的值都子句后的表达式的值都为假,则返回为假,则返回ELSE后的表达式的值。