第3章 关系数据库标准语言SQL
3.1 SQL语言的基本概念与特点 3.1.1 语言的发展及标准化 在70年代初,E.F.Codd首先提出了关系模型。70年代中期,IBM公司在研制 SYSTEM R关系数据库管理系统中研制了SQL语言,最早的SQL语言(叫SEQUEL2)是在1976 年 11 月的IBM Journal of R&D上公布的。 1979年ORACLE公司首先提供商用的SQL,IBM公司在DB2 和SQL/DS数据库系统中也实现了SQL。 1986年10月,美国ANSI采用SQL作为关系数据库管理系统的标准语言(ANSI X3. 135-1986),后为国际标准化组织(ISO)采纳为国际标准。
1989年,美国ANSI采纳在ANSI X3.135-1989报告中定义的关系数据库管理系统的SQL标准语言,称为ANSI SQL 89。 1992年,ISO又推出了SQL92标准,也称为SQL2。 目前SQL99(也称为SQL3)在起草中,增加了面向对象的功能。 结构化查询语言SQL(Structured Query Language)是一种介于关系代数与关系演算之间的语言,其功能包括查询、操纵、定义和控制四个方面,是一个通用的、功能极强的关系数据库语言。目前已成为关系数据库的标准语言,广泛应用于各种数据库。
3.1.2 SQL语言的基本概念 SQL 视图1 基本表2 视图2 基本表3 基本表4 基本表1 存储文件1 存储文件2 外模式 模式 一、关系数据库三级模式结构 SQL 视图1 基本表2 视图2 基本表3 基本表4 基本表1 存储文件1 存储文件2 外模式 模式 内模式
外模式对应于视图(View)和部分基本表(Base Table); 模式对应于基本表; 内模式对应于存储文件。 基本表是本身独立存在的表,在SQL中一个关系就对应一个表。一些基本表对应一个存储文件,一个表可以有若干索引,索引也存放在存储文件中。 视图是从基本表或其他视图中导出的表,它本身不独立存储在数据库中,也就是说数据库中只存放视图的定义而不存放视图对应的数据,这些数据仍存放在导出视图的基本表中,因此视图是一个虚表。 存储文件的物理结构及存储方式等组成了关系数据库的内模式。存储文件的物理结构及存储方式等不同数据库管理系统往往是不同的,一般也是不公开的。 视图和基本表是SQL语言的主要操作对象,用户可以用SQL语言对视图和基本表进行各种操作。在用户眼中,视图和基本表都是关系表,而存储文件对用户是透明的。
3.1.3 SQL语言的主要特点 1、综合统一 SQL集数据查询、数据操纵、数据定义 和数据控制功能于一体,主要特点包括: SQL集数据定义语言DDL、数据操纵语言DML、数据控制语言DCL的功能于一体,语言风格统一,可以独立完成数据库生命周期中的全部活动,包括: 定义关系模式,插入数据,建立数据库; 对数据库中的数据进行查询和更新; 数据库重构和维护; 数据库安全性、完整性控制。
2、高度非过程化 3、面向集合的操作方式 非关系数据模型的数据操纵语言是“面向过程”的,用“过程化”语言完成某项请求,必须指定存储路径。 SQL进行数据操作,只要提出“做什么”,而无须指明“怎么做”,因此无需了解存储路径。存储路径的选择以及SQL的操作过程由系统自动完成。这样可以减轻用户的负担,也提高了数据独立性。 3、面向集合的操作方式 非关系数据模型得采用提面向记录的操作方式,操作对象是一条记录。 SQL采用集合操作方式,不仅操作对象、查找结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合。
4、以同一种语法结构提供多种使用方式 5、语言简洁,易学易用 数据查询 数据定义 数据操纵 数据控制 SQL既是独立的语言,又是嵌入式语言。 作为独立的语言,它能够独立地用于联机交互的使用方式,用户可以在终端键盘上直接键入SQL命令对数据库进行操作; 作为嵌入式语言,SQL语句能够嵌入到高级语言(如C、C++、Java)程序中,供程序员设计程序时使用。 而在两种不同的使用方式下,SQL的语法结构基本上是一致的。 5、语言简洁,易学易用 SQL功能极强,完成核心功能只用了9个动词,接近英语口语,所以容易学习,易于使用。 数据查询 数据定义 数据操纵 数据控制 SELECT CREATE DROP ALTER INSERT UPDATE DELETE GRANT REVOKE
3.2 数据定义 3.3.1 字段数据类型 所谓数据类型就是以数据的表现方式和存储方式来划分的数据的种类。 在SQL Server 中每个变量、参数、表达式等都有数据类型。
整数数据类型 select @a=-12345 --为该局部变量赋值为-12345 select @a --在屏幕上输出该局部变量的值 1. INT (INTEGER) 说明: (1)取值范围: -2 31(-2 147483648) ~2 31 -1 (2147 483647)之间的所有正负整数。 (2)存储大小: 4个字节,其中1位表示整数值的正负号,其它31 位表示整数值的长度和大小。 例: declare @a int --定义一个整型局部变量a select @a=-12345 --为该局部变量赋值为-12345 select @a --在屏幕上输出该局部变量的值 go --整个程序段结束
2. SMALLINT 说明: (1)取值范围:-2 15(-32768) ~2 15 -1(32767)之间的所有正负整数。 (2)存储大小:2个字节,其中1位表示整数的正负号,其它15位表示整数值的长度和大小
3. TINYINT 说明: (1)取值范围: 0 ~255 之间的所有正整数。 (2)存储大小:1 个字节 例: declare @b tinyint set @b=12345 select @b go 结果:出错
4. BIGINT 说明: (1)取值范围: -263 (-9223372036854775807) ~263-1( 9223372036854775807)之间的所有正负整数。 (2)存储大小:每个BIGINT 类型的数据占用8个字节的存储空间。
浮点数据类型 (一)近似数值类型:指在其范围内不是所有的数都能精确表示 REAL 数据类型: (一)近似数值类型:指在其范围内不是所有的数都能精确表示 REAL 数据类型: REAL数据类型以指数形式表示时可精确到第7 位小数, (1)取值范围:从-3.40E -38 到3.40E +38。 (2)存储大小:占用4 个字节的存储空间。 (3)若以小数点表示,则可精确到小数点后第(8-整数位)位; (4)当整数位达到8位时,系统自动以指数形式表示
2. FLOAT: 说明: (1)取值范围:可精确到第15 位小数,其范围为从-1.79E -308 到1.79E +308。 (2)存储大小:占用8 个字节的存储空间。 (3)当整数位数达到17位时,系统自动以指数形式表示。
(二)精确小数: 1. DECIMAL 说明: (1)取值范围:存储从-1038-1到1038-1的固定精度和范围的数值型数据; (2)存储大小:2~17个字节不等; (3)可用格式: DECIMAL[(p,[s])],P指范围是小数点左右所能存储的数字的总位数,不包括小数点; S是精度是小数点右边存储的数字的位数,缺省为0。 例如:decimal(15,5),表示共有15 位数,其中整数10 位,小数5位。
DECIMAL数据占用的字节数取决于P中的整数位数 介于 1~9位 占5个字节 10~19位 占9个字节 20~28位 占13个字节 29~38位 占17个字节
2. NUMERIC NUMERIC数据类型与DECIMAL数据类型完全相同。
二进制数据类型 1 . BINARY:固定长度的二进制数据类型。 (1) 格式:BINARY( n), n 表示数据的长度,取值为1 到8000 ,必须指定BINARY 类型数据的大小。 (2) 存储大小:占用n+4 个字节的存储空间。 注:输入数据时必须在数据前加上字符“0X” 作为二进制标识,且数据输入时为十六进制数字,若输入的数据过长将会截掉其超出部分,若输入的数据位数为奇数,则会在符号“0X ”后添加一个0。
例: declare @a binary(5) set @a=0xabc select @a --定义局部变量a为二进制数据,长度为5 --为a赋值为0xabc --值为0x0abc000000
2 . VARBINARY: 可变长度的二进制数据类型 (1) 格式:VARBINARY(n)。 n 的取值也为1 到8000, (2) 存储大小:实际数值长度+4个字节
逻辑数据类型 BIT (1) 存储大小:占用1 个字节的存储空间; (2)取值范围:0 或1 ,如果输入0 或1以外的值,将被视为1 (3)说明: BIT 类型不能定义为NULL 值(所谓NULL 值是指空值或无意义的值)。 例:declare @a bit --定义局部变量a为BIT型 set @a=2 --为a赋值为2 select @a --输出结果为1
字符数据类型 1. CHAR: 固定长度的非UNICODE字符 (1) 定义形式:CHAR[ (n) ]; (2)存储大小:字符串中每个字符和符号占一个字节的存储空间,汉字占2个字节的空间n 表示所有字符占的总存储空间,n 的取值为1 ~8000, 即可容纳8000 个ANSI 字符。 (3) 说明:省略N系统默认值为1, 若输入数据的字符数小于n,则系统自动在其后添加空格来填满设定好的空间。若输入的数据过长,将会截掉其超出部分。
例1:declare @a char set @a='123' select @a 输出结果为: 1 例2:declare @a char(5) set @a='123' select @a 输出结果为: 123空格空格
例3:declare @a char(2) set @a=‘1中国' select @a select datalength(@a) --返回@a所占用的字节长度 输出结果: 1 --输出字符1未输出‘中’字的左半部分 2 --变量长度为2个字节 例4:若将长度改为3、4、7,该题输出结果和长度是什么?
2 . VARCHAR: 可变长度的非Unicode字符 (1) 定义形式:VARCHAR [ (n) ],n 的取值为1 到8000 (2) 存储大小:实际数值长度,若输入数据的字符数小于n ,则系统不会在其后添加空格来填充空间。
例:declare @a varchar(2) set @a=‘1中国' select @a select datalength(@a) --返回@a所占用的字节长度 输出结果: 1 --输出字符1未输出‘中’字的左半部分 1 --变量长度为屏幕显示的实际字节,1个字节 考虑:若长度改为3、4、7,则输出结果和长度是什么?
. NCHAR: 固定长度的UNICODE字符 (1)定义形式:NCHAR[ (n) ]。
例:declare @a Nchar(2) set @a=‘1中国' select @a select datalength(@a) --返回@a所占用的字节长度 输出结果: 1中 --输出字符1和‘中’字 4 --变量长度为2个字节 考虑:若将长度改为3、4、7,该题输出结果和长度是什么?
. NVARCHAR: 可变长度的UNICODE字符 (1) 定义形式:NVARCHAR [ (n) ]。 它与VARCHAR 类型相似。不同的是,NVARCHAR数据类型采用UNICODE 标准字符集(Character Set), n 的取值为1 到4000。 (2) 存储大小:实际数值长度,超出N的部分截去,不足N的部分不补空格。
例:declare @a Nvarchar(2) set @a=‘1中国' select @a select datalength(@a) --返回@a所占用的字节长度 输出结果: 1中 --输出字符1和‘中’字 4 --变量长度为2个字节 考虑:若将长度改为3、4、7,该题输出结果和长度是什么?
文本和图形数据类型 1、TEXT:用于存储大量文本数据 (1) 容量:理论上为1~231 –1(2147483647)个字节,实际应用时需要视硬盘的存储空间而定。 (2) 说明:SQL SERVER存储此类数据时,将TEXT 和IMAGE 类型的数据直接存放到表的数据行中,而不是存放到不同的数据页中。 这就减少了用于存储TEXT 和IMAGE 类型的空间,并相应减少了磁盘处理这类数据的I/O 数量。
2 、NTEXT NTEXT数据类型与TEXT类型相似,不同的是NTEXT 类型采用UNICODE 标准字符集(Character Set), 因此其理论容量为230-1(1, 073, 741, 823)个字节。
3、 IMAGE IMAGE数据类型用于存储大量的二进制数据Binary Data。 其理论容量为2 31 -1(2,147,483,647)个字节。 通常用来存储图形等OLE (Object Linking and Embedding,对象连接和嵌入)对象,该类型不指定长度,可用来输入任何二进制数据。在输入数据时必须在数据前加上字符“0X”作为二进制标识
日期和时间数据类型 1. DATETIME (1)日期范围:从 1753 年 1 月 1 日至 9999 年 12 月 31 日的日期; (2) 存储大小:每个数值要求 8 个字节的存储空间。 (3) 说明:如果省略了日期部分,则系统将1900 年1 月1 日作为日期缺省值。
例:declare @a datetime --定义类型 set @a=‘1989-2-23’ --为变量a赋值 select @a select datalength(@a) go 输出结果: 1989-02-23 00:00:00.000 8 --长度为8个字节
2. SMALLDATETIME (1) 日期范围:从1900年1月1日到2079年6月6日的日期和时间数据,精确到分钟; (2) 存储大小:使用4 个字节存储数据。 (3) 日期输入格式: 允许用斜杠(/)、连接符(-)和小数点(.)作为用数字表示的年、月、日之间的分隔符。 如: YMD:2000/6/22 2000-6-22 2000.6.22 MDY:3/5/2000 3-5-2000 3.5.2000 DMY:31/12/1999 31-12-1999 31.12.2000
(2)时间输入格式: 顺序为“小时、分钟、秒、毫秒”,中间用冒号“:”隔开,秒和毫秒之间可用小数点“.”隔开,隔开后的第一位数字代表十分之一秒,第二位数字代表百分之一秒,第三位数字代表千分之一秒。Am表示午前12小时 、PM表示午后12小时,默认情况为AM。AM 与PM 均不区分大小写。如: 3:5:7.2pm---下午3 时5 分7 秒200 毫秒 10:23:5.123Am---上午10 时23 分5 秒123 毫秒
例:declare @a smalldatetime --定义数据类型 set @a=‘11:30 pM’ --输出下午时间 select @a --输出a go 输出结果: 1900-01-01 23:30:00
货币数据类型 货币数据类型用于存储货币值。在使用货币数据类型时,应在数据前加上货币符号,系统才能辨识其为哪国的货币,如果不加货币符号,则默认为“¥”
1 MONEY (1) 精确值:货币单位的万分之一,即4 位小数 (2) 取值范围:-2 63(-922337203685477.5808 ~2 63 -1(+922337203685477.5807)。 (3) 存储大上:使用8个字节存储。
2. SMALLMONEY 类似于MONEY 类型,存储的货币值范围较小. (1)取值:从-214,748.3648到+214,748.3647, (2)存储空间:4 个字节
特定数据类型 1 TIMESTAMP 提供数据库范围内的惟一值,此类型相当于BINARY8或VARBINARY(8),但当它所定义的列在更新或插入数据行时,此列的值会被自动更新,一个计数值将自动地添加到此TIMESTAMP数据列中。每个数据库表中只能有一个TIMESTAMP数据列。如果建立一个名为“TIMESTAMP”的列,则该列的类型将被自动设为TIMESTAMP数据类型
UNIQUEIDENTIFIER 存储一个16 位的二进制数字。此数字称为(GUIDGlobally Unique Identifier ,即全球惟一鉴别号)。 此数字由SQLServer 的NEWID函数产生的全球惟一的编码,在全球各地的计算机经由此函数产生的数字不会相同
7.11 局部变量与全局变量 局部变量 局部变量是用户定义的变量,作用范围仅在程序内部。在程序中通常用来储存从表中查询到的数据,或当作程序执行过程中暂存变量使用。,而且必须先用DECLARE命令说明后才可使用。 1. 格式:DECLARE @变量名 变量类型 [,@变量名 变量类型…]
2.说明: (1)局部变量必须以“@”开头,遵循命名规范,且不能使用保留字,不能和全局变量同名; (2) 变量类型可以是系统数据类型,也可以是用户自定义的数据类型; (3)未赋值前,变量值为null。
3. 给变量赋值格式: 必须使用SELECT或SET命令来设定变量的值,其语法如下: 格式1:SELECT @局部变量1=变量值1 [,@局部变量2=变量值2] /*可为多个变量赋值,中间用逗号隔开*/ 格式2:SET @局部变量=变量值 /*一次只能为一个变量赋值 */
4.赋值的注意事项: (1)若赋值长度超出声明长度则自动截去超出长度; (2)可以用select语句将从表中查询出的结果给局部变量赋值; (3)若变量值和局部变量类型不匹配,则系统隐式的将被赋值转化为局部变量的类型
5.变量的显示: select @局部变量名 例:声明一个长度为10 个字符的变量“id”,赋值并将值显示在屏幕上。 declare @id char(10) select @id=‘10010001’ select @id go 结果为10010001空格空格
全局变量 全局变量是SQL Server系统内部使用的变量,其作用范围并不局限于某一程序,而是任何程序均可随时调用全局变量。 用户只能调用全局变量,而不能定义和赋值给全局变量。全局变量通常存储一些SQL Server的配置设定值和统计数据。用户可在程序中用全局变量来测试系统的设定值或Transact-SQL命令执行后的状态值。 如,@@rowcount 功能是存储前一条命令影响到的记录总数。
局部变量和全局变量的区别 1. 局部变量名以@开头,而全局变量名以@@开头; 2. 局部变量是由用户定义的,而全局变量是由系统定义的 3. 局部变量作用范围为某一程序,而全局变量作用范围为所有程序。
3.5运算符及优先级 1. 算术运算符 包括:+(加)、―(减)、*(乘)、/(除)、%(取余):返回两个整数除法的余数, 例如:12%5=2 2. 比较运算符 包括:>(大于)、<(小于)、= (等于)、>=(大于等于)、<=(小于等于)、<>(不等于)、!=(不等于)、!>(不大于)!<( 不小于) 其中!=、!>、!<不是ANSI标准的运算符, 结果为布尔型
3. 逻辑运算符 包括:AND(与)、OR(或)、NOT(非) 结果为布尔型 4. 一元运算符: 包括:+(正):返回表达式的正值; -(负):返回表达式的负值; ~(按位NOT):将给定的整型数值转换为二进制形式,然后按位进行逻辑非运算。
5. 赋值运算符: =(等号),用于为字段或变量赋值。 例如:定义一个int变量@xyz,并为其赋值为123。 declare @xyz int set @xyz=123 6. 连接运算符:使用加号(+)将两个字符串连接成一个字符串,加号作为字符串连接符。 例如,'abc' +'123'结果为'abc123'
7.优先顺序 计算时,从左向右计算,先计算优先级高的运算,再计算优先级低的运算。 下面列出了运算符的顺序。 +(正)、-(负)、~(按位取反) *(乘)、/(除)、%(求余) +(加)、+(字符串连接)、-(减) 比较运算符:=,>,<,>=,<=,<>,!=,!>,!< 位运算:^(位异或)、&(位与)、|(位或) NOT AND ALL、ANY、BETWEEN、IN、LIKE、OR、SOME =(赋值) 同一级别中的运算符优先级相同
函数 数学函数 abs(x):求绝对值; select abs(-3) 值为3 sqrt(x):求平方根; select sqrt(4) 值为2.0 rand([0]):返回0~1之间的随机float值; floor(X):返回小于或等于X值的最大整数; 例: select floor(78.5), floor(123), floor(-78.5)
ceiling(X):返回大于或等于X值的最小整数;例:ceiling(78. 5), ceiling(123), ceiling(-78 round(x,length):四舍五入函数,length为正,则对X小数位数四舍五入,length为负,则对X从小数点左边length位起四舍五入,若length既为负数且其绝对值大于X整数部分数字个数,则函数值为0。例: ROUND(63.567, 1) ROUND(63.567, 0) ROUND(63.567, -1) ROUND(63.567, -2) ROUND(63.567, -3) ROUND(63.567, -4)
Sign(X):求符号函数,X>0则sign(x)=1; X=0 则sign(X)=0;X<0 则sign(X)=-1 Power(X,y):求表达式的y次方, 例:power(3,2) 例1:计算3的4次方及16的平方根 例:select round(76.512565,3),round(23.3234357,3), round(78.74236,-2),round(34.213456,-2)
例: Select ceiling(343),floor(879),ceiling(96.98), floor(33.5),ceiling(-55.8),floor(-55.2)
字符串函数 ASCII(串):返回字符表达式最左端字符的ASCII 码值,例:ASCII(‘abc’)=97 CHAR(ASCII码):用于将ASCII 码转换为字符,如果没有输入0 ~ 255 之间的ASCII 码值,返回值为NULL 。例:char(97)=’a’
STR(X[,length[,<decimal>]]):把数值型数据转换为字符型数据,说明: (1) length 和decimal 必须是非负值,length 指定返回的字符串的长度,decimal 指定返回的小数位数。 (2) 如果没有指定长度,缺省的length 值为10, decimal 缺省值为0。 (3) 小数位数大于decimal 值时,将其下一位四舍五入; (4) 指定长度应大于或等于符号位+整数位+小数点位+小数位,如果<float _expression>小数点前的位数超过了指定的长度,则返回指定长度的“*”
例: select str(123.45,6,1),str(123.45,2,2), str(floor(123.45),8,3) ,str(123.45,4,0) 结果:
Lower(串):把字符串全部转换为小写,例:select lower(‘SmallFish’),lower(‘SMALLFISH’) Upper(串) :把字符串全部转换为大写,例:select upper(‘SmallFish’),upper(‘SMALLFISH’) LTrim(串), RTrim(串):去掉引导空格或者尾空格;例: select ‘MICROSOFT’+ rtrim(‘ sql_server ’)+’2000’ ‘MICROSOFT’+ Ltrim(‘ sql_server ’)+’2000’
space(个数):返回指定个数的空格。 replicate(串,次数):将串重复指定次数 例:replicate(‘中国’,2) 返回值’中国中国’ Left(串, 个数):返回已知串从左边开始指定个数的字符。 例:select left('我的祖国abc', 4) select replicate(left(‘abc’,2),4)
Right(串, 个数):返回已知串从右边开始指定个数的字符。 例:select right('我的祖国abc', 4) 结果为: 国abc DataLength(串):返回串的字节数长度,计算串尾空格。可以用它检查varchar,text等的动态长度。 例:select datalength('我的祖国abc ') 返回值为12
SubString(串, 开始位置, 长度):返回从字符串左边’开始位置’起数量为’长度’的字符串。其中表达式可以是字符串或二进制串或含字段名或字符型变量的表达式。SUBSTRING()函数不能用于TEXT 和IMAGE 数据类型 select substring(‘我的祖国abc', 5, 2) 结果为: ab Len(串) :返回表达式的长度。注意它返回的是字符数,而不是字节数。不计算串尾空格。 Select len(‘Windows2000 ’)
Replace(‘串1’,’串2’,’串3’):用串3替换串1中出现的所有串2字符,例: 返回值为‘长春理工大学’ Stuff(串1, 开始位置, 长度, 串2):删除串1指定位置开始指定长度的字符串,并在指定位置插入串2. select stuff('我的祖国abc',5,2,'小花') 结果是:我的祖国小花c 思考:将REPLACE函数示例用STUFF函数表示 将STUFF函数示例用REPLACE函数表示。
reverse(串) :将指定的字符串的字符排列顺序颠倒,例: select reverse(‘123’) 返回值为’321’ charindex(串1,串2[,开始位置]):返回串1在串2的开始位置,可从所给出的‘开始位置’进行查找。 例: charindex(‘ef’,’abcdeef’) 返回值为6
例 2:求出‘数据库’在‘大型数据库技术’中的位置 例 3:计算ASCII(‘Alklk’) 串可以是字符串常量、字符串变量、值为字符的函数、字符型表达式 例 1: select lower(‘abc’)+space(5)+ rtrim(ltrim(‘ 你好! ’)) 例 2:求出‘数据库’在‘大型数据库技术’中的位置 例 3:计算ASCII(‘Alklk’)
例 4:计算字符串’SQL Server数据库管理系统’的长度: 例 5:查找字符串’wo’在‘MY wonderful’中的开始位置: 例 6:select stuff(‘He rld’,3,1,’llo wo’)
转换函数 1.功能:用于将某种数据类型的表达式显式转换为另一种数据类型的函数。 1 . CAST(): CAST(表达式 AS 数据类型[(长度)]) 例: select ‘今天是:’ + Cast(GetDate() as char(10)) 2 . CONVERT(): CONVERT(转换后的目标数据类型[(length)],表达式 [, style]) select ‘今天是:’ +convert(char(10),getdate())
2.提醒: 1)、data_type为SQL Server系统定义的数据类型。 2)、Length用于指定数据的长度,缺省值为30。 3)、style为将日期型数据和小数转换为字符型数据时的格式样式。
日期时间函数 1).DATEADD函数格式: DATEADD(datepart,n,date) 2).功能:在date指定日期时间的datepart部分加上n,得到一个新的日期时间值。 3).返回值数据类型:datetime,如果参数date为smalldatetime,则返回值为smalldatetime类型。
例如: dateadd(yy,2,'1993-3-4') --结果为‘1995-03-04 00:00:00.000’ dateadd(m,2,'1993-3-4') --结果为'1993-05-04 00:00:00.000' dateadd(d,2,'1993-3-4') --结果为'1993-03-06 00:00:00.000'
2. DATENAME函数 1).格式: DATENAME(datepart,date) 2).功能:返回日期date中由datepart指定的日期部分的字符串。 3).返回值数据类型:nvarchar 例如: datename(yy,'1993-3-4') --结果为'1993' datename (mm,'1993-3-4') --结果为'03' datename (dd,'1993-3-4') --结果为'4'
3. DATEPART函数 1).格式:DATEPART(datepart,date) 2).功能:与DATENAME类似,只是返回值为整数。 3).返回值数据类型:int 例如: datepart(yy,'1993-3-4') --结果为1993 datepart (m,'1993-3-4') --结果为3 datepart (d,'1993-3-4') --结果为4
4. DATEDIFF函数 1).格式:DATEDIFF(datepart,date1,date2) 2).功能:返回两个日期间的差值并转换为指定日期元素的形式。 3).返回值数据类型:整型 例: Select datediff (yy,’1989.03.03’,’2003.04.05’) --值为14 Select datediff (mm,’1989.03.03’,’2003.04.05’) --值为170
日期元素及其取值范围 元素名称 缩写 取值范围 Year yy 1753--9999 Quarter qq 1-4 Month mm 1-12 Dayofyear dy 1-366 Day dd 1-31 Week wk 0-51 Hour hh 0-23 Minute mi 1-59 Second ss Millisecond ms 0-999
5. GETDATE函数 1).格式:GETDATE() 2).功能:按SQL Server 2000内部标准格式返回系统日期和时间。 3).返回值数据类型:datetime 例如: getdate() --结果为2004-03-13 21:51:32.390
6. YEAR函数 1).格式:YEAR(date) 2).功能:返回指定日期date中年的整数。 3).返回值数据类型:int --结果为2004
7.MONTH函数 1)格式:MONTH(date) 2)功能:返回指定日期date中月份的整数。 3)返回值数据类型:int
8. DAY函数 1)格式:DAY(date) 2)功能:返回指定日期date中天的整数。 3)返回值数据类型:int 注:date参数可以为日期格式的字符串常量、变量 、datetime和smalldatetime类型的列值或GETDATE函数的返回值
例1:求服务器当前的系统日期与时间. 例2:求出系统当前的月份和月份名字. 例3:Mary的生日为1979/12/23日,请用日期函数计算Mary现在的年龄.
集合函数 也称为统计函数,它对一组值进行计算并返回一个数值,经常与SELECT语句的子句一起使用。 1 Sum([all |distinct] expression)):计算一组数据的和 2 Min([all |distinct] expression)):给出一组数据中的最小值 3 Max([all |distinct] expression)):给出一组数据中的最大值
4 Count([all |distinct] expression|*)): 5 Avg([all |distinct] expression)):计算一组的平均值 注: ALL:默认选项,指计算除开NULL值外所有的值; DICTINCT:去掉重复值 *计算包含有空值的所有的行
例:设学生选课表course中choosenum列有一空值,计算该表的总行数,分别用*和all计算。 select * from course go select count(*) from course --包含空值行数据 select count(all choosenum) from course -- 不包含空值行数据
例:计算teacher表的总行数 select count(*) from teacher 例:计算studentgrade表中chinese列的总成绩:select sum(Chinese) from studentgrade 例:select count(all birth) from student
简单的select语句 1.格式: select <列名表> from <表名或视图名> where <查询限定条件> 2.说明: (1)列名表可以是星号、表达式、列表、变量等; (2)from指定这些数据来自哪些表或视图; (3)where指定了用户想看哪些行。 例:select * from 职工 where 性别=’男’ /*查询‘职工’表中性别为‘男’的所有行(记录)*/
批处理和流程控制语言 批 1.批定义:批是包含一个或多个SQL语句的语句集,这些语句被一次性地发送到SQL Server中执用。 2.批结束符:GO 该命令用来通知SQL一批语句的结束
流程控制语句 PRINT (1)语法如下: PRINT 'any ASCII text'|@local_variable| @@FUNCTION|string_expression (2)说明: A .PRINT 命令向客户端返回用户信息,即显示一个字符串(最长为255个字符)、局部变量或全局变量。 B .如果变量值不是字符串的话,必须先用数据类型转换函数CONVERT(),将其转换为字符串。其中,string_expression 是可返回一个字符串的表达式。表达式的长度可以超过8000 个字符,但超过8000 的字符将不会显示。
例 declare @x char(10), @y char(10) --定义两个字符型变量 select @x = ‘SQL’, @y = ‘Server’ --为变量赋值 print ‘科技’ --从屏幕上输出‘科技’字符串 print @x + @y --将两个字符串连接后从屏幕上输出
2. IF…ELSE <命令行或程序块>] (1)语法如下:IF <条件表达式> <命令行或程序块> (2)说明: 其中<条件表达式>值必须是逻辑值“真”或“假”,ELSE子句可省的,最简单的IF语句没有ELSE子句部分。 IF…ELSE用来判断当某一条件成立时执行某段程序,条件不成立时执行另一段程序。 如果不使用程序块,IF或ELSE只能执行一条命令。IF…ELSE可以进行嵌套。
例: declare@x int,@y int,@z int--定义三个整型变量 select @x=1,@y=2, @z=3 --给三个变量赋值 if @x>@y --判断@x是不是大于@y print 'x>y' --为真则打印字符串'x>y‘ else if @y>@z --若小于 @y则判断y是不是大于z print 'y>z' --为真则打印字符串'y>z' else print'z>y' --为假则打印字符串'z<y' 运行结果如下: z>y
例1:求一个数是奇数还是偶数; 例2:求x,y,z三数的最大数;
declare @x int select @x=3 if @x%2=1 print convert(char(1),@x)+'是奇数' else print convert(char(1),@x)+'是偶数'
declare @x int,@y int,@z int,@max int select @x=1,@y=2, @z=3 if @x>@y select @max=@x else select @max=@y if @max<@z select @max=@z print @max
例3:判断商品表goods中商品编号supplier_id为S001的商品的平均单价unit_price是否大于9000。 If ( select avg(unit_price) from goods where supplier_id=‘S001’)>9000 Select ‘S001的商品平均单价大于9000’ Else select ‘S001的商品平均单价比9000小’
3. BEGIN (1)格式:BEGIN <命令行或程序块> END (2)说明:BEGIN…END用来设定一个程序块,将在BEGIN…END内的所有程序视为一个单元执行。
例:用Exists确定student表中是否存在“李晓东” Declare @name varchar(20),@msg varchar(200)| select @name=‘李晓东’ if exists(select * from student where 姓名=@name) begin select @msg=‘有人名为’+@name select @msg end else begin select @msg=‘没有人名为’+@name select @msg end
4. CASE (1)格式: CASE <运算式> WHEN <运算式1> THEN <结果1> … WHEN<运算式n> THEN <结果n> [ELSE <结果n+1>] END (2)说明:根据‘运算式’的值的不同,取相应的结果值
例1: 根据+、-、*、/符号分别求值 declare @x char,@y int Set @x='*' Select @y= Case @x when '+' then 10+5 when '-' then 10-5 when '*‘ then 10*5 when '/' then 10/5 end print @y go --定义两个变量,X存储运算符,Y存储值 --分别为X和Y赋初值 --设置根据运算符不同,采取不同程序分支 输出结果为:50
例2.求: y= X<0 X+10 X X=0 X-10 X>0
declare @x int,@y int select @x=20 select @y= case when @x<0 then @x+10 when @x=0 then @x when @x>0 then @x-10 end select @y
5 . while循环结构 (1)语法如下: WHILE <条件表达式> BEGIN <命令行或程序块> [BREAK] [CONTINUE] [命令行或程序块] END
(2)说明: 条件成立时重复执行命令行或程序块。 CONTINUE命令使程序跳过CONTINUE 命令之后的语句,直接回到WHILE 循环的第一行。 BREAK 命令让程序完全跳出循环,结束WHILE 命令的执行。 WHILE 语句也可以嵌套 。
例:求1!+2!+3!+….+10! 例:
declare @s int,@n int,@t int,@c int select @s=0,@n=1 while @n<=4 begin select @c=1,@t=1 while @c<=@n set @t=@t*@c set @c=@c+1 end set @s=@s+@t set @n=@n+1 select @s,@n
6. RETURN (1)语法如下 RETURN [整数值]
后接调用过程 例:create proc a1 --定义一个存储过程 as declare @x int, @y int --声明两个整型变量 select @x = 1 ,@y = 2 --为变量赋值 if @x>@y --判断大小 return 1 --若条件为真返回1 else return 2 --若条件为假返回2,该例中条件为假 后接调用过程
调用过程 declare @re_code int --定义一个整型变量用来存储RETUREN返回的值 exec @re_code=a1 --调用存储过程并把值返回给变量 print @re_code --打印变量的值 Go
7. GOTO (1)语法:GOTO 标识符 (2)说明: 作为跳转目标的标识符可为数字与字符的组合,但必须以“:”结尾,如‘12:’或‘a_1:’。在GOTO 命令行,标识符后不必跟“:”。
例1:分行打印字符‘1’、‘2’、‘3’、‘4’、‘5’ declare @x int --定义一个整型变量 select @x = 1 --为该变量赋值 label_1: --语句标号行,行号后有: print @x --打印变量X的值 select @x = @x + 1 --变量@x自增1 while @x < 6 --判断X是不是小于6 goto label_1 --若小于6则将语句转向Label_1语句行,行号后无: ;若大于6则退出循环 例2:将n!用GOTO语句求出来
8. USE (1)语法:USE {databasename} (2)说明: 用于改变当前使用的数据库为指定的数据库。 用户必须是目标数据库的用户成员或目标数据库建有GUEST 用户账号时,使用USE 命令才能成功切换到目标数据库。
9.注释行 (1)功能:为SQL语句加上说明,说明该句代码的功能,不能被程序执行。 (2)语法: 格式一:/*….*/:用于注释多行语句; 格式二:--(两个减号):只能用于一行的注释,回车后自动取消注释
10、WAITFOR语句 1、功能: 用来暂停程序执行,直到等待指定时间之后,或所设定的时间已到才继续往下运行程序。 2、语法: wait for {delay ‘时间’|time ‘时间’} 3、说明: (1)‘时间’必须为DATETIME类型数据,且不能包括日期,如’11:07:03’ (2)DELAY:用来设定等待的时间长短,最多为24小时。(是一个时间间隔) (3)TIME:用来设定等待结束的时间点(是一个具体的时间)
例: 1、等待3秒钟后显示‘时间已过了3秒钟了’ Waitfor delay ’00:00:03’ Print ‘时间已过了3秒钟了’ GO 2、等到凌晨00:00显示字符串“鬼来了!” Waitfor time ’00:00:00’ Print ‘鬼来了!’ go