《第5章TransactSQL.ppt》由会员分享,可在线阅读,更多相关《第5章TransactSQL.ppt(99页珍藏版)》请在三一办公上搜索。
1、第5章 Transact-SQL,学习导读 数据库语言是数据库与应用的重要接口,是操作数据库的重要工具。结构化查询语言SQL(Structured Query Language)是一个具有国际标准和国家标准的关系数据库语言。通过本章的学习,应掌握以下内容:SQL的功能和特点 Transact-SQL的特点和组成 使用Transact-SQL语言实现数据查询、插入、修改、删除的方法 Transact-SQL流程控制语句的使用,5.1 SQL语言,5.1.1 概述 1.SQL的主要标准 SQL-86。SQL的第一个标准是1986年10月由美国国家标准化组织(ANSI)公布的。SQL-89。ANSI
2、以后通过对SQL-86的不断修改和完善,于1989年第二次公布了SQL标准,即SQL-89,该标准增强了完整性的语言特征。SQL-92(SQL2)。1992年又公布了SQL-92标准,该标准增加了支持对远程数据库的访问,扩充了数据类型、操作类型、动态SQL等许多新的特征。SQL-99(SQL3)。完成于1999年的SQL-99修订本具有更高级的特征。引入了支持对象-关系DBMS模型的SQL,扩展了对象、递归、触发等许多新的特征,支持用户自定义函数、自定义数据类型。,SQL 语言,2.SQL的特点 一体化。SQL具有数据定义、数据操纵、数据控制多种功能与一体。非过程化。用户只需提出“做什么”,而
3、不必指明“怎么做”。集合式操作。灵活的使用方式(交互式、嵌入式)。简洁、方便、功能强。,SQL 语言的分类,5.1.2 SQL 语言分类 数据查询语言(DQL-Data Query Language)。数据定义语言(DDL-Data Definition Language)。数据操纵语言(DML-Data Manipulation Language)。数据控制语言(DCL-Data Control Language)。,5.2 Transact-SQL 基础,微软公司在SQL标准的基础上做了大幅度扩充,作为SQL Server的结构化查询语言,并将 SQL Server 使用的 SQL 语言称
4、为Transact-SQL语言。Transact-SQL不仅包含了标准的SQL语言部分,而且还发展了许多新的特性,增强了可编程性和灵活性。SQL Server 2000的查询分析器可以使用户交互地输入和执行各种Transact-SQL语句,并且迅速地查看这些语句的执行结果,来完成对数据库的分析和处理。这是一个非常实用的工具。,查询分析器,5.2.1 查询分析器 启动SQL查询分析器的操作步骤如下:(1)在“开始”菜单的“程序”级联菜单中,选择Microsoft SQL Server程序组中的“查询分析器”选项,即可启动SQL查询分析器。(2)在启动SQL查询分析器时,系统首先打开“连接到SQL
5、 Server”对话框。,查询分析器,(3)选择SQL Server服务器后,然后设置正确的验证模式,即可连接到SQL Server服务器,并打开SQL查询分析器。,对象浏览窗口中,“对象”选项卡显示了连接到的SQL Server服务器中所包含的数据库以及数据库对象,而“模板”选项卡则显示了查询分析器中所包含的各种 Transact-SQL语句模板,可以使用这些模板方便地创建自己的SQL语句。,对象浏览窗口,SQL语句输入窗口,数据库的操作语句,5.2.2 数据库的操作语句1.创建数据库格式:CREATE DATABASE database_name ONfilespec-数据文件的定义 LO
6、G ON filespec-日志文件的定义 filespec定义为(NAME=logical_file_name,-逻辑文件名 FILENAME=os_file_name-物理文件名,SIZE=size-文件大小,MAXSIZE=max_size|UNLIMITED-文件可以增长的最大大小,FILEGROWTH=growth_increment)-文件的增长增量其中:表示其中的成分为任选项。:表示其中的成分由用户具体给定。|:表示其中并列的成分只能择一。,数据库的操作语句,例:CREATE DATABASE test1ON(NAME=测试数据1,-数据文件逻辑文件名 FILENAME=E:SQ
7、L Server测试数据1.MDF,-数据文件物理文件名 SIZE=10MB,MAXSIZE=50MB,FILEGROWTH=5MB)LOG ON(NAME=测试数据1日志,-日志文件逻辑文件名 FILENAME=E:SQL Server测试数据1日志.LDF,-日志文件物理文件名 SIZE=10MB,MAXSIZE=20MB,FILEGROWTH=5MB),数据库的操作语句,2.修改数据库格式:ALTER DATABASE database_name ADD FILE filespec-指定要添加的文件|ADD LOG FILE filespec-指定要添加的日志文件|REMOVE FILE
8、 logical_file_name-指定要删除的数据文件名|MODIFY FILE filespec-指定要更改的文件|MODIFY NAME=new_dbname-重命名数据库 功能:可以添加、删除、更改给定的文件。例:ALTER DATABASE test1 ADD FILE(NAME=测试数据2,FILENAME=E:SQL Server测试数据2.MDF,SIZE=10MB,MAXSIZE=50MB,FILEGROWTH=5MB),数据库的操作语句,3.使用和删除数据库打开数据库格式:USE database_name删除数据库格式:DROP DATABASE database_na
9、me例:DROP DATABASE test1-删除test1数据库注意:当数据库正在使用、数据库正在恢复、数据库包含用于复制的对象时不能删除。,表的操作语句,5.2.3 表的操作语句1.表的创建格式:CREATE TABLE table_name(column_namel data_type NULL|NOT NULL PRIMARY|UNIQUE FOREIGN KEY(column_name)REFERENCES ref_table(ref_column)column_name2 data_type),表的操作语句,例:USE test-打开数据库 CREATE TABLE client
10、s(cid int,cname char(8),address char(50),表的操作语句,注意:创建表时还可以利用一些属性参数对字段作出限定。如,将字段设置为主键,限制字段不能为空等。有关在SQL Server 2000中所提供的数据完整性的机制将在第9章讨论。例:CREATE TABLE book(bid int NOT NULL PRIMARY KEY,bname char(8)NOT NULL,authorid char(10),表的操作语句,2.表的修改 当数据库中的表创建完成后,可以根据需要改变表中原先定义的许多项,以更改表的结构。用户可以增加、删除和修改字段等。格式:ALTE
11、R TABLE table_name ADD column_name data_type-增加字段或主键、外键约束 PRIMARY KEY|CONSTRAIN FOREIGN KEY(column_name)REFERENCES ref_table(ref_column)DROP CONSTRAINT constraint_name|COLUMN column_name-删除约束或字段例:在test数据库中给book表增加一个“price”字段。ALTER TABLE book ADD price int,表的操作语句,3.删除表格式:DROP TABLE table_name例:删除book
12、表。DROP TABLE book,数据查询,5.2.4 数据查询语句格式:SELECT DISTINCT|ALL FROM WHERE GROUP BY HAVING ORDER BY ASC|DESC说明:SELECT:指出要查询输出的属性名或值表达式。ALL:表示保留满足条件的所有元组(缺省)。DISTINCT:表示去掉重复元组。目标列表:可以使用通配符“*”,表示所有的属性列。,数据查询,FROM:查询所涉及的表名或视图名。WHERE:查询满足的条件。GROUP BY:按指定的属性进行分组,在指定的属性上值相同的分为一组。HAVING:对一个组的限定条件(与GROUP BY一起使用)。
13、ORDER BY:按指定的属性进行排序输出。ASC 升序(缺省)DESC 降序 目标列中可使用SQL提供的聚合函数。COUNT、SUM、AVG、MAX、MIN,数据查询,常用的查询条件查询条件谓词比较=、=、确定范围NOT BETWEEN.AND 确定集合 NOT IN 字符匹配NOT LIKE 空值检测IS NOT NULL 多重条件AND、OR、NOT,数据查询,下面所有的操作是在已建立的school数据库上进行的。在school数据库中建立了下列四个表:student(sno,sname,ssex,sbirthday,class)teacher(tno,tname,tsex,tbirth
14、day,prof,depart)course(cno,cname,tno)score(sno,cno,degree),数据查询,1.投影查询例5.1 查询student表中所有记录的sname、ssex和class列。SELECT sname,ssex,class FROM student 例5.2 查询教师所有的单位即不重复的depart列。SELECT DISTINCT depart FROM teacher 例5.3 查询student表的所有记录。SELECT sno AS 学号,sname AS 姓名,ssex AS 性别,sbirthday AS 出生日期,class AS 班号
15、FROM student,数据查询,2.选择查询例5.4 查询score表中成绩在60到80之间的所有记录。SELECT*FROM score WHERE degree BETWEEN 60 AND 80例5.5 查询score表中成绩为85、86或88的记录。SELECT*FROM score WHERE degree IN(85,86,88)例5.6 查询student表中“95031”班或性别为“女”的学生记录。SELECT*FROM student WHERE class=95031 OR ssex=女,数据查询,3.排序查询例5.7 按class降序显示student表的所有记录。S
16、ELECT*FROM student ORDER BY class DESC例5.8 按cno升序、degree降序显示score表的所有记录。SELECT*FROM score ORDER BY cno,degree DESC,数据查询,4.使用聚合函数 COUNT(DISTINCT|ALL*)统计元组个数 COUNT(DISTINCT|ALL)统计一列中值的个数 SUM(DISTINCT|ALL)计算一数值型列值的总和 AVG(DISTINCT|ALL)计算一数值型列值的平均值 MAX(DISTINCT|ALL)求一列值的最大值 MIN(DISTINCT|ALL)求一列值的最小值,数据查询
17、,例5.9 查询“95031”班的学生人数。SELECT COUNT(*)AS 95031班人数 FROM student WHERE class=95031例5.10 查询score表中的最高分的学生学号和课程号。SELECT sno AS 学号,cno AS 课程号,MAX(degree)AS 最高分 FROM score 例5.11 查询编号为“3-105”的课程的平均分。SELECT AVG(degree)AS 课程平均分 FROM score WHERE cno=3-105,数据查询,字符匹配(LIKE)常用于模糊查询。格式:NOTLIKE 匹配串其中匹配串可含:代表任意长度(可为0
18、)的字符串。_:代表任意单个字符。含义:是查找指定的属性列值与相匹配的元组。,字符匹配查询之例,例1:查找所有姓刘的学生姓名、学号和性别。SELECT sname AS 姓名,sno AS 学号,ssex AS 性别 FROM student WHERE sname LIKE 刘例2:查找所有不姓刘的学生姓名。SELECT sname AS 姓名 FROM student WHERE snameNOT LIKE 刘,字符匹配之例,例3:查找姓“欧阳”且全名为三个汉字的学生姓名。SELECT sname AS 姓名 FROM student WHERE sname LIKE 欧阳_例4:查找名字
19、中第二个字为阳的学生姓名。SELECT sname AS 姓名 FROM student WHERE sname LIKE _阳%,数据查询,GROUP BY 子句:将查询结果表按某一(多)列值分组,值相等的为一组。目的:细化集函数的作用对象。注意:使用GROUP BY后,集函数是对分组进行统计。例:求每个学生的平均成绩。SELECT sno as 学号,AVG(degree)as 平均分 FROM score GROUP BY sno,HAVING短语:在各组中选择满足条件的小组。WHERE子句:在表中选择满足条件的元组。,WHERE?,并将其超过88分的输出。,HAVING AVG(deg
20、ree)88,数据查询,例5.12 查询score表中至少有5名学生选修的并以3开头的课程号的平均分数。SELECT cno,AVG(degree)AS 平均分 FROM score WHERE cno LIKE 3%GROUP BY cno HAVING COUNT(*)=5 例5.13 查询最低分大于70,最高分小于90的sno列。SELECT sno FROM score GROUP BY sno HAVING MIN(degree)70 and MAX(degree)90,数据查询,5.表的连接查询 涉及两个或以上表的查询。连接条件的一般格式为:.当连接运算符为=时,称为等值连接。,例
21、5.14 查询所有学生的sname、cno和degree列。SELECT student.sname,o,score.degree FROM student,score WHERE student.sno=score.sno 说明:当FROM子句后跟着多个表名时,它先将这些表进行笛卡儿积运算。,数据查询,例5.15 查询所有学生的sno、cname和degree列。SELECT x.sno,ame,x.degree FROM score x,course y WHERE o=o注意:当输出的列涉及多个表时必须使用连接查询。例5.16 查询“95033”班所选课程的平均分。SELECT o,AV
22、G(y.degree)AS 平均分 FROM student x,score y WHERE x.sno=y.sno and x.class=95033 GROUP BY o,数据查询,自身连接查询 涉及同一个表的连接查询。例5.18 查询选学“3-105”课程的成绩高于“109”号学生成绩的所有学生记录,并按成绩从高到低排列。SELECT o,x.sno,x.degree FROM score x,score y WHERE o=3-105 and x.degreey.degree and y.sno=109 and o=3-105 ORDER BY x.degree DESC,数据查询,6
23、.子查询(嵌套查询)查询块:SELECT FROM WHERE 子查询(嵌套查询):一个查询块嵌套在另一查询块中作为条件的查询。子查询一般跟在IN、SOME(ANY)、ALL和EXIST等谓词后面。注意:SOME、ALL必须与关系比较符同时使用。子查询的执行由内到外。,数据查询,例5.20 查询和学号为105的学生同年出生的所有学生的sno、sname和sbirthday列。SELECT sno,sname,sbirthday FROM student WHERE year(sbirthday)=(SELECT year(sbirthday)FROM student WHERE sno=105
24、),数据查询,例5.21 查询“张旭”教师任课的学生成绩,并按成绩递减排列。方法一:SELECT cno,sno,degree FROM score WHERE cno=(SELECT o FROM course x,teacher y WHERE x.tno=y.tno and y.tname=张旭)ORDER BY degree DESC,数据查询,例5.21 的另一方法(用三层嵌套)。SELECT cno,sno,degree FROM score WHERE cno=(SELECT cno FROM course WHERE tno=(SELECT tno FROM teacher W
25、HERE tname=张旭)ORDER BY degree DESC,数据查询,例5.22 查询选修某课程的学生人数多于5人的教师姓名。方法一:SELECT tname FROM teacher WHERE tno IN(SELECT x.tno FROM course x,score y WHERE o=o GROUP BY x.tno HAVING COUNT(x.tno)5),数据查询,例5.22 的另一方法(用三层嵌套)。SELECT tname FROM teacher WHERE tno IN(SELECT tno FROM course WHERE cno IN(SELECT c
26、no FROM score GROUP BY cno HAVING COUNT(*)5),数据查询,例5.23 查询存在有85分以上成绩的课程cno。SELECT DISTINCT cno FROM score WHERE degree IN(SELECT degree FROM score WHERE degree85)说明:该查询没有必要使用子查询,可直接写成:SELECT DISTINCT cno FROM score WHERE degree85,数据查询,例5.24 查询“计算机系”中与“电子工程系”不同职称的教师tname和prof。SELECT tname,prof FROM t
27、eacher WHERE depart=计算机系 AND prof NOT IN(SELECT prof FROM teacher WHERE depart=电子工程系),数据查询,例5.25 查询选修编号为“3-105”的课程,且成绩至少高于编号为“3-245”的学生的cno、sno和degree,并按degree从高到低次序排列。SELECT cno,sno,degree FROM score WHERE cno=3-105 AND degreeANY(SELECT degree FROM score WHERE cno=3-245)ORDER BY degree DESC,数据查询,例5
28、.26 查询选修编号为“3-105”的课程,且成绩高于所有编号为“3-245”成绩的学生的cno、sno和degree,并按degree从高到低次序排列。SELECT cno,sno,degree FROM score WHERE cno=3-105 AND degreeALL(SELECT degree FROM score WHERE cno=3-245)ORDER BY degree DESC,数据查询,并运算(UNION):将多个SELECT查询的结果连接起来生成单个结果集合。例5.27 查询所有教师和学生的name、sex和birthday。SELECT tname AS 姓名,ts
29、ex AS 性别,tbirthday AS 出生日期 FROM teacher UNION SELECT sname,ssex,sbirthday FROM student 注意:使用UNION连接的SELECT必须有相同的输出表达式格式,即对应栏目具有相同的数据类型的宽度。,数据查询,例5.28 查询所有“女”教师和“女”学生的姓名、性别和出生日期。SELECT tname AS 姓名,tsex AS 性别,tbirthday AS 出生日期 FROM teacher WHERE tsex=女 UNION SELECT sname,ssex,sbirthday FROM student WH
30、ERE ssex=女注意:SQL没有提供交和差运算。,数据查询,7.相关子查询 当一个子查询的判断条件涉及到一个来自外部查询的列时,称为相关子查询。相关子查询执行过程为由外到内交替执行。,数据查询,例5.29 查询成绩比该课程平均成绩低的学生成绩表。SELECT sno,cno,degree FROM score aWHERE degree(SELECT AVG(degree)FROM score b WHERE o=o),数据查询,8.带EXISTS测试的子查询 EXISTS x:判断x是否为空集,若不是,则表达式为真,否则为假。例5.30 查询所有任课教师的tname和depart。方法一
31、:相关子查询。SELECT tname,depart FROM teacher a WHERE EXISTS(SELECT*FROM course b WHERE a.tno=b.tno),方法二:不相关子查询。SELECT tname,depart FROM teacher WHERE tno IN(SELECT tno FROM course),数据查询,例5.31 查询所有未讲课的教师的tname和depart。方法一:相关子查询。SELECT tname,depart FROM teacher a WHERE NOT EXISTS(SELECT*FROM course b WHERE
32、a.tno=b.tno),方法二:不相关子查询。SELECT tname,depart FROM teacher WHERE tno NOT IN(SELECT tno FROM course),数据插入,5.2.5 数据插入 INSERT语句用于向数据库表或者视图中加入一行数据。格式:INSERT INTO table_name|view_name column_list)VALUES(DEFAULT|NULL|expression,.n)|derived_table 其中各参数说明如下:INTO:一个可选关键字,使用这个关键字可以使语句的意义清晰。table_name:要插入数据的表名称。
33、view_name:要插入数据的视图名称。column_list:要插入数据的一列或多列的列表。VALUES:插入的数据值的列表。DEFAULT:使用默认值填充。NULL:使用空值填充。expression:使用常量、变量或表达式填充。derived_table:任何有效的SELECT语句,它返回将插入到表中的数据行。,数据插入,例1:利用INSERT语句向表student中插入一数据行,该行只有部分列包含值。USE school INSERT INTO student(sno,sname,sbirthday)VALUES(201,张力,78-3-15)例2:利用INSERT语句向表stude
34、nt中插入一数据行,该行包含所有列的值。USE school INSERT INTO student VALUES(201,刘红,女,78-3-15,96031)例3:利用INSERT语句向表student中插入一些数据行,这些数据通过子查询获得。USE school INSERT INTO student(sno,sname)SELECT tno,tname FROM teacher,数据修改,5.2.6 数据修改 UPDATE语句用于修改数据库表中特定记录或者字段的数据。格式:UPDATE table_name|view_name SET column_name=DEFAULT|NULL|
35、expression,.n WHERE search_condition其中各参数说明如下:table_name:要修改数据的表名称。view_name:要修改数据的视图名称。column_name:要修改数据的列名。DEFAULT:使用默认值修改。NULL:使用空值修改。expression:使用常量、变量或表达式修改。search_condition:只对满足条件的记录进行修改。,数据修改,例1:将学生刘红的学号修改为202,班级修改为96032。USE school UPDATE student SET sno=202,class=96032 WHERE sname=刘红例2:将选修了操
36、作系统课程的成绩提高5%。USE school UPDATE score SET degree=degree*1.05 WHERE cno=(SELECT cno FROM course WHERE cname=操作系统),数据修改,例3:学生“李军”在数字电路课程考试中作弊,该课成绩应作零分计。USE school UPDATE score SET degree=0 WHERE sno=(SELECT sno FROM student WHERE sname=李军)AND cno=(SELECT cno FROM course WHERE cname=数字电路),数据删除,5.2.7 数据删
37、除 DELETE语句用于删除数据库表中的数据。格式:DELETE FROM table_name|view_name WHERE search_condition其中各参数说明如下:FROM:一个可选关键字,使用这个关键字可以使语句的意义清晰。table_name:要删除数据的表名称。view_name:要删除数据的视图名称。search_condition:只对满足条件的记录进行删除。,数据删除,例1:删除学生张力的数据。USE school DELETE FROM student WHERE sname=张力例2:删除选修了王萍教师课程的选课记录。USE school DELETE FRO
38、M score WHERE cno=(SELECT cno FROM course WHERE tno=(SELECT tno FROM teacher WHERE tname=王萍),5.3 Transact-SQL程序设计基础,Transact-SQL语言为满足实际应用中的编程需要,另增加了一些语言元素,包括注释、变量、运算符、函数和流程控制语句等。,标识符,5.3.1 标识符1.常规标识符 常规标识符就是不需要使用分隔标识符进行分隔的标识符。其规则如下:第一个字符必须是Unicode 2.0标准所定义的字母、下划线(_)、at符号()和数字符号(#)。后续字符可以是Unicode 2.0
39、所定义的字母、来自基本拉丁字母或其他国家地区脚本的十进制数字、at符号()、美元符号($)、数字符号(#)或下划线(_)。标识符不能是Transact-SQL的保留字。不允许嵌入空格或其他特殊字符。常规标识符和分隔标识符包含的字符数必须在1128之间。对于本地临时表,标识符最多可以有116个字符。,标识符,2.分隔标识符在Transact-SQL语句中,对不符合所有标识符规则的标识符必须进行分隔。分隔标识符类型:用双引号分隔开。(仅当QUOTED_IDENTIFIER选项设置为ON时才有效)用方括号分隔。例1:SELECT*FROM My Table 例2:SELECT*FROM My Tab
40、le 3.使用标识符一个对象的全称语法格式为:server.database.owner.object说明:也可以使用简写格式,没有指明的部分使用默认值。,数据类型,5.3.2 数据类型 数据类型决定了数据的存储格式,代表了各种不同的信息类型。1.系统数据类型 系统数据类型是SQL Server预先定义好的,可以直接使用。整数型。bigint(8字节)、int(4字节)、smallint(2字节)、tinyint(1字节)。小数数据类型。decimal(p,s)和 numeric(p,s)p(精度)指定小数点左边和右边可以存储的十进制数字的最大个数。s(小数位数)指定小数点右边可以存储的十进制
41、数字的最大个数。说明:numeric数据类型可以带有identity标识列。,数据类型,近似数值型。float(精度7位)、real(精度15位)。字符型。char(1-8000字节,定长)、varchar(1-8000字节,可变长)、text(1-231-1,可变长)。逻辑数值型。bit(可以存储整型数据1、0或NULL。如果输入0以外的其他值时,SQL Server均将它们当作1看待)货币型(精确为4位小数)。money(8字节)、smallmoney(4字节)。说明:货币数值之前必须带有适当的货币符号(例:$1234,100美元)二进制数据类型。binary(固定长度,1-8000字节)
42、、varbinary(可变长度,1-8000字节)、image(可变长度,0-231-1字节),数据类型,日期时间类型。datetime(1753.1.1-9999.12.31)、smalldatetime(1900.1.1-2079.6.6)格式:yyyy-mm-dd hh:mm:ss AM/PM说明:输入的形式不一定按上列格式,系统可调整。Unicode字符型。nchar、nvarchar、ntext。说明:(1)Unicode为统一字符编码。Unicode标准用于支持国际上的非英语语种,每个Unicode字符用两个字节存储。(2)使用Unicode字符时,应该在前面加一个标识符N。例:D
43、ECLARE MyUnicodeVar nchar(25)SET MyUnicodeVar=NThis is a Unicode string.PRINT MyUnicodeVar,数据类型,2.用户定义数据类型 用户自定义数据类型是建立在SQL Server系统数据类型基础上的。创建用户自定义数据类型要提供的参数:要定义的数据类型名称要继承的系统数据类型选择长度及设置是否允许为NULL值等属性。创建用户自定义数据类型的方法使用企业管理器 利用sp_addtype系统存储过程,数据类型,使用企业管理器创建用户定义的数据类型的操作步骤如下:(1)展开服务器组,然后展开服务器。(2)展开“数据库”
44、文件夹,再展开要在其中创建用户定义的数据类型的数据库,例如test。(3)右击“用户定义数据类型”选项,然后选择“新建用户定义数据类型”命令。,数据类型,(4)此时,会打开“用户定义的数据类型属性”对话框。,在“名称”文本框中输入新建数据类型的名称;在“数据类型”下拉列表中,选择基数据类型。如“长度”处于活动状态,若要更改此数据类型可存储的最大数据长度,请键入另外的值。长度可变的数据类型有binary、char、nchar、nvarchar、varbinary和varchar。若要允许此数据类型接受空值,请选中“允许NULL值”复选框。在“规则”和“默认值”下拉列表中选择一个规则或默认值(若有
45、),以将其绑定到用户定义数据类型上。(5)设置完成后,单击“确定”按钮,即可创建一个用户定义数据类型。,数据类型,可以使用存储过程sp_addtype来创建用户定义数据类型。格式:sp_addtype typename=type,phystype=system_data_type,nulltype=null_type,owner=owner_name 例:EXEC sp_addtype telephone,varchar(24),NOT NULL例:EXEC sp_addtype fax,varchar(24),NULL,数据类型,删除用户自定义数据类型的方法 使用企业管理器 利用sp_dro
46、ptype系统存储过程 在企业管理器中,在要删除的用户定义数据类型上右击鼠标,然后选择“删除”命令,在打开的“除去对象”对话框中,单击“全部除去”按钮,即可删除用户定义数据类型。删除用户定义数据类型可以使用sp_droptype存储过程。格式:sp_droptype typename=type 例:EXEC sp_droptype fax,运算符,5.3.3 运算符1.算术运算符+、-、*、/、%注意:日期时间型数据也能进行+、-运算。表示日期加上或减去整数天数的日期。例:SELECT CAST(2005-1-1 AS smalldatetime)+_ 100 AS 2005.1.1 加上10
47、0天的日期 CAST(expression AS data_type):将指定的expression的值转换为由data_type所指定的数据类型的函数。执行的结果如下:2005.1.1加上100天的日期-2005-04-11 00:00:00,运算符,2.赋值运算符=例:DECLARE MyCounter INT SET MyCounter=23%4 PRINT CONVERT(varchar(20),MyCounter)CONVERT(data_type(length),expression,style):将指定的expression的值转换为由data_type所指定的数据类型的函数。执
48、行结果为:3,运算符,3.按位运算符&、|、例:DECLARE a INT,b INT SET a=3 SET b=8 SELECT a&b AS a&b,a|b AS a|b,ab AS ab分析:3的二进制数为00000011,8的二进制数为00001000。3&8为00000000 3|8为00001011 38为00001011执行结果为:a&b a|b ab-0 11 11,运算符,4.比较运算符、=、!=、!5.逻辑运算符 AND、OR、NOT 逻辑运算返回布尔值,值为TRUE或FALSE。6.字符串连接运算符+例:SELECT(abc+def)AS 串连接注意:对其他数据类型,在
49、与字符串连接之前必须使用CAST转换函数将其转换成字符串。执行结果如下:串连接-abcdef,运算符,7.一元运算符+(正)、-(负)、(位反)例:DECLARE Num1 INT SET Num1=5 SELECT Num1 AS 位反运算分析:5的二进制数为00.0000101(4个字节)5的二进制数为11.1111010由于最高位为1,表示这是一个负数。计算机中负数是按它的补码进行存放的,我们应求出它的原码。先将补码求反,得00.0000101,再对反码加1,得原码00.0000110。执行结果如下:位反运算-6,运算符,8.运算符优先级在SQL Server中,运算符的优先级如下:+(
50、正)、-(负)、(按位NOT)*(乘)、/(除)、%(模)+(加)、+(连接)、-(减)=、=、!=、!、!(位异或)、&(位与)、|(位或)NOTANDALL、ANY、BETWEEN、IN、LIKE、OR、SOME=(赋值),运算符优先级之例,例1:DECLARE MyNumber INT SET MyNumber=6-1+2*2 SELECT MyNumber AS 计算结果 计算结果:9例2:DECLARE MyNumber INT SET MyNumber=3*(5+(7-3)SELECT MyNumber AS 计算结果计算结果:27,变量,5.3.4 变量 变量可用来保存程序运行过