|
加入收藏
|
设为首页
|
证书查询
|
首页
|
中心简介
学院简介
中心简介
教学环境
教学模式
课程优势
清华风采
社会形象
大事记
清华声明
|
形象展示
视频下载
|
专业介绍
预科课程
软件工程师
网络工程师
短期课程
职业素养训练
学术专家在线
|
在线学习
net培训
java培训
sql数据库培训
|
证书展示
清华大学证书
工信部证书
学历证书
|
讲师风范
网络专业讲师
软件专业讲师
教务老师
职业规划师
就业指导教师
|
就业指导
网络招聘会
签约流程
战略合作企业
就业心得
就业成果
就业保障体系
面试试题
就业兵法
|
学员社区
学习心得
拓展活动
学生会成员
软件下载
|
班主任群
班主任通知
班主任工作
班主任介绍
班主任心得
|
报名咨询
咨询问题解答
我要报名
清华贴吧
|
就业联盟
免费体验
当前位置:
首页
>>
在线学习
>>
sql数据库培训
Transact-SQL语言
繁简对译:[
繁
简
] 字体设置:[
大
中
小
]
2008-09-26 阅读 次
3.1
数据定义语言
数据定义语言(
DDL
)是指用来定义和管理数据库以及数据库中各种对象的语句,这些语句包括
CREATE
、
ALTER
和
DROP
等。在
SQL Server 2005
中,数据库对象包括表、视图、触发器、存储过程、规则、默认、用户自定义的数据类型等。这些对象的创建、修改和删除等都可以通过使用
CREATE
,
ALTER
,
DROP
等语句来完成。
3.1
数据定义语言
例
3-1
创建数据库表
/*
下面的例子将创建表
S
。
*
/
CREATE TABLE S
(
sno
char(10)
NOT NULL
/*
学号字段
*
/
CONSTRAINT PK_sno PRIMARY KEY CLUSTERED/*
主键约束
*
/
CHECK (sno like '31300501[0-9][0-9]')/*
检查约束
*
/,
sname
char(8)
NULL, /*
姓名字段
*/
sex
char(2)
NULL, /*
性别字段
*/
age
int
NULL, /*
年龄字段
*/
dept
varchar(20)
NULL/*
系别字段
*/
)
3.1
数据定义语言
例
3-2
修改
S
表
,
增加一个班号列
程序清单如下
:
ALTER TABLE S
ADD
CLASS_NO CHAR(6)
3.1
数据定义语言
例
3-3
删除
S
表
程序清单如下
:
•
DROP table S
3.2
数据操纵语言(
DML
)
•
数据操纵语言是指用来查询、添加、修改和删除数据库中数据的语句,这些语句包括
SELECT
、
INSERT
、
UPDATE
、
DELETE
等。
•
将在第
6
章详细讲解
SELECT
语句的语法及实例。
3.2.2
INSERT
语句
•
INSERT
语句用于向数据库表或者视图中加入一行数据。
INSERT
语句的语法形式如下:
INSERT [INTO] table_or_view [(column_list)] VALUES(data_values)
•
其中
,
table_or_view
是指要插入新记录的表或视图
;
column_list
是可选项
,
指定待添加数据的列
;
VALUES
子句指定待添加数据的具体值。列名的排列顺序不一定要和表定义时的顺序一致。但当指定列名表时
VALUES
子句值的排列顺序必须和列名表中的列名排列顺序一致,个数相等,数据类型一一对应。
3.2.2
INSERT
语句
在进行数据插入操作时须注意以下几点:
(
1
)必须用逗号将各个数据分开,字符型数据要用单引号括起来。
(
2
)
INTO
子句中没有指定列名,则新插入的记录必须在每个属性列上均有值,且
VALUES
子句中值的排列顺序要和表中各属性列的排列顺序一致。
(
3
)将
VALUES
子句中的值按照
INTO
子句中指定列名的顺序插入到表中。
(
4
)对于
INTO
子句中没有出现的列,则新插入的记录在这些列上将取空值,如上例的
SCORE
即赋空值。但在表定义时有
NOT NULL
约束的属性列不能取空值。
3.2.2
INSERT
语句
例
3-5
创建
SC
表(学生选课表),并向
SC
表中插入一条选课记录(
’
S
7’
,’C
1’
)。
程序清单如下:
CREATE TABLE SC
(
sno
char(10)
NOT NULL,
cno char(2)
NULL, /*
课程编号字段
*
/
score
numerical(4,1) NULL
/*
成绩字段
*
/
)
Go
INSERT INTO SC (sno,cno) VALUES ('3130050101', 'c1')
Go
3.2.2
INSERT
语句
下面是插入与列顺序不同的数据的例子。
例
3-6
使用
column_list
及
VALUES
列表显式地指定将被插入每个列的值。
程序清单如下
:
CREATE TABLE T1
( column_1 int,
column_2 varchar(30))
Go
INSERT T1 (column_2, column_1) VALUES ('This is a test',1)
3.2.2
INSERT
语句
插入多行数据的语法格式为:
INSERT INTO table_or_view [(column_list)]
子查询
例
3-7
求出各位学生的平均成绩,把结果存放在新表
AVGSCORE
中。
程序清单如下:
/*
首先建立新表
AVGSCORE
,用来存放学号和学生的平均成绩。
*/
CREATE TABLE AVGSCORE
(SNO CHAR(10),
AVGSCORE SMALLINT)
Go
/*
利用子查询求出
SC
表中各位学生的平均成绩
,
把结果存放在新表
AVGSCORE
中。
*/
INSERT INTO AVGSCORE
SELECT SNO,AVG(SCORE)
FROM SC
GROUP BY SNO
3.2.3
UPDATE
语句
•
UPDATE
语句用于修改数据库表或视图中特定记录或者字段的数据,其语法形式如下:
UPDATE table_or_view SET <column>=<expression>[,<column>=<expression>>]…
[WHERE <search_condition>]
•
其中
:
table_or_view
是指要修改的表或视图
;
SET
子句给出要修改的列及其修改后的值
,
其中
column
为要修改的列名
,
expression
为其修改后的值
;
WHERE
子句指定待修改的记录应当满足的条件
,
WHERE
子句省略时
,
则修改表中的所有记录。
3.2.3
UPDATE
语句
•
例
3-8
一个带有
WHERE
条件的修改语句。
程序清单如下:
use adventureworks
go
update person.address
set city='
Boston
' where
addressid=1
•
例
3-9
将所有学生年龄增加
1
岁
程序清单如下:
UPDATE S SET AGE=AGE+1
3.2.3
UPDATE
语句
•
例
3-12
创建把讲授
C5
课程的教师的工资增加
100
元。
程序清单如下:
/*T
表(教师基本情况表)的结构为
T(TNO,TN,SEX,AGE,PROF,SAL,DEPT)
分别表示教师的编号,姓名,性别,年龄,职称,工资,系别。
TC
表(教师授课表)的结构为
TC(TNO,CNO)
分别表示教师的编号,课程编号。
*/
UPDATE T
SET SAL=SAL+100
WHERE TNO IN
(SELECT T.TNO FROM T,TC
WHERE T.TNO=TC.TNO AND TC.CNO='C5')
/*
通过连接查询找到讲授
C5
课程的教师编号。
*
/
3.2.4
DELETE
语句
•
使用
DELETE
语句可以删除表中的一行或多行记录,其语法格式为:
DELETE FROM table_or_view [WHERE <search_condition>]
•
其中:
table_or_view
是指要删除数据的表或视图;
WHERE
子句指定待删除的记录应当满足的条件,
WHERE
子句省略时,则删除表中的所有记录。
•
下面是删除一行记录的例子。
例
3-14
删除张益琳教师的记录。
程序清单如下:
DELETE FROM T WHERE TN=’
张益琳
’
3.2.4
DELETE
语句
•
下面是删除多行记录的例子。
•
例
3-15
删除所有教师的授课记录。
程序清单如下:
DELETE FROM TC
•
执行此语句后,
TC
表即为一个空表,但其定义仍存在数据字典中。
•
例
3-16
删除李明同学选课的记录。
DELETE FROM SC WHERE SNO=
(SELECT SNO FROM S
WHERE SN=’
李明
’)
3.3
数据控制语言
•
数据控制语言(
DCL
)是用来设置或更改数据库用户或角色权限的语句,包括
GRANT
,
DENY
,
REVOKE
等语句。在默认状态下,只有
sysadmin
,
dbcreator
,
db_owner
或
db_securityadmin
等人员才有权力执行数据控制语言。
3.3.1
GRANT
语句
1
、语句权限与角色的授予
•
SQL
语言使用
GRANT
语句为用户授予语句权限的语法格式为:
GRANT <
语句权限
>|<
角色
> [,<
语句权限
>|<
角色
>]…
TO <
用户名
>|<
角色
>|PUBLIC[,<
用户名
>|<
角色
>]…
[WITH ADMIN OPTION]
•
其语义为:将指定的语句权限授予指定的用户或角色。其中:
(
1
)
PULBIC
代表数据库中的全部用户;
(
2
)
WITH ADMIN OPTION
为可选项,指定后则允许被授权的用户将指定的系统特权或角色再授予其他用户或角色。
3.3.1
GRANT
语句
1
、语句权限与角色的授予
•
例
3-17
给用户
Mary
和
John
以及
Windows NT
组
Corporate\BobJ
授予多个语句权限。
程序清单如下:
GRANT CREATE DATABASE, CREATE TABLE
TO Mary, John, [Corporate\BobJ]
•
例
3-18
为用户
ZhangYiLin
授予
CREATE TABLE
的语句权限。
程序清单如下:
GRANT CREATE TABLE
TO ZhangYiLin
3.3.1
GRANT
语句
2
、对象权限与角色的授予
•
数据库管理员拥有系统权限,而作为数据库的普通用户,只对自己创建的基本表、视图等数据库对象拥有对象权限。如果要共享其他的数据库对象,则必须授予他一定的对象权限。
•
同语句权限的授予类似,
SQL
语言使用
GRANT
语句为用户授予对象权限,其语法格式为:
GRANT ALL|<
对象权限
>[(
列名
[,
列名
]…)][,<
对象权限
>]…ON <
对象名
>
TO <
用户名
>|<
角色
>|PUBLIC[,<
用户名
>|<
角色
>]…
[WITH ADMIN OPTION]
•
其语义为:将指定的操作对象的对象权限授予指定的用户或角色。其中:
(
1
)
ALL
代表所有的对象权限。
(
2
)列名用于指定要授权的数据库对象的一列或多列。如果不指定列名,被授权的用户将在数据库对象的所有列上均拥有指定的特权。实际上,只有当授予
INSERT
、
UPDATE
权限时才需指定列名。
(
3
)
ON
子句用于指定要授予对象权限的数据库对象名,可以是基本表名、视图名等。
(
4
)
WITH ADMIN OPTION
为可选项,指定后则允许被授权的用户将权限再授予其他用户或角色。
3.3.1
GRANT
语句
2
、对象权限与角色的授予
•
例
3-19
在权限层次中授予对象权限。首先,给所有用户授予
SELECT
权限,然后,将特定的权限授予用户
Mary
,
John
和
Tom
。
程序清单如下:
GRANT SELECT
ON s
TO public
GO
GRANT INSERT, UPDATE, DELETE
ON s
TO Mary, John, Tom
GO
3.3.1
GRANT
语句
2
、对象权限与角色的授予
•
例
3-20
将查询
T
表和修改教师职称的权限授予
USER3
,并允许将此权限授予其他用户。
程序清单如下:
GRANT SELECT,UPDATE(PROF)
ON T TO USER3
WITH ADMIN OPTION
•
上例中
,
USER3
具有此对象权限
,
并可使用
GRANT
命令给其他用户授权
,
如下例
,
USER3
将此权限授予
USER4
:
GRANT SELECT,UPDATE(PROF)
ON T
TO USER4
3.3.2
REVOKE
语句
REVOKE
语句是与
GRANT
语句相反的语句,它能够将以前在当前数据库内的用户或者角色上授予或拒绝的权限删除,但是该语句并不影响用户或者角色从其他角色中作为成员继承过来的权限
1
、语句权限与角色的收回
数据库管理员可以使用
REVOKE
语句收回语句权限,其语法格式为:
REVOKE <
语句权限
>|<
角色
> [,<
语句权限
>|<
角色
>]…
FROM <
用户名
>|<
角色
>|PUBLIC[,<
用户名
>|<
角色
>]…
•
例:收回用户
ZHANGYILIN
所拥有的
CREATE TABLE
的语句权限。
REVOKE CREATE TABLE
FROM ZHANGYILIN
2
、对象权限与角色的收回
所有授予出去的权力在必要时都可以由数据库管理员和授权者收回,收回对象权限仍然使用
REVOKE
语句,其语法格式为:
REVOKE <
对象权限
>|<
角色
> [,<
对象权限
>|<
角色
>]…
FROM <
用户名
>|<
角色
>|PUBLIC[,<
用户名
>|<
角色
>]…
3.3.2
REVOKE
语句
•
例
3-21
收回用户
USER1
对
C
表的查询权限。
程序清单如下:
REVOKE SELECT
ON C
FROM USER1
•
例
3-22
收回用户
USER3
查询
T
表和修改教师职称的权限。
程序清单如下:
REVOKE SELECT,UPDATE(PROF)
ON T
FROM USER3
•
在上例中,
USER3
将对
T
表的权限授予了
USER4
,在收回
USER3
对
T
表的权限的同时,系统会自动收回
USER4
对
T
表的权限。
3.3.2
REVOKE
语句
•
例
3-23
首先从
public
角色中收回
SELECT
权限,然后,收回用户
Mary
,
John
和
Tom
的特定权限。
程序清单如下:
USE pubs
GO
REVOKE
SELECT ON s FROM public
GO
REVOKE
INSERT, UPDATE, DELETE
ON s
FROM Mary, John, Tom
3.3.3
DENY
语句
•
DENY
语句用于拒绝给当前数据库内的用户或者角色授予权限,并防止用户或角色通过其组或角色成员继承权限。
•
否定语句权限的语法形式为:
DENY
ALL|<
语句权限
>|<
角色
> [,<
语句权限
>|<
角色
>]…
TO
<
用户名
>|<
角色
>|PUBLIC[,<
用户名
>|<
角色
>]…
•
否定对象权限的语法形式为:
DENY ALL|<
对象权限
>[(
列名
[,
列名
]…)][,<
对象权限
>]…ON <
对象名
>
TO <
用户名
>|<
角色
>|PUBLIC[,<
用户名
>|<
角色
>]…
3.3.3
DENY
语句
•
例
3-24
首先给
public
角色授予
SELECT
权限,然后,拒绝用户
Mary
,
John
和
Tom
的特定权限。
程序清单如下:
USE pubs
GO
GRANT SELECT
ON s
TO public
GO
DENY SELECT, INSERT, UPDATE, DELETE
ON s
TO Mary,John,Tom
3.4
系统存储过程
•
系统存储过程是
SQL Server
系统创建的存储过程,它的目的在于能够方便地从系统表中查询信息,或者完成与更新数据库表相关的管理任务或其他的系统管理任务。系统存储过程可以在任意一个数据库中执行。系统存储过程创建并存放于系统数据库
master
中,并且名称以
sp_
或者
xp_
开头。一些系统过程只能由系统管理员使用,而有些系统过程通过授权可以被其他用户使用。
3.4
系统存储过程
系统存储过程的部分示例如下
:
•
sp_addtype
:用于定义一个用户定义数据类型;
•
sp_configure
:用于管理服务器配置选项设置;
•
xp_sendmail
:用于发送电子邮件或寻呼信息;
•
sp_stored_procedures
:用于返回当前数据库中的存储过程的清单;
•
sp_help
:用于显示参数清单和其数据类型;
•
sp_depends
:用于显示存储过程依据的对象或者依据存储过程的对象;
•
sp_helptext
:用于显示存储过程的定义文本;
•
sp_rename
:用于修改当前数据库中用户对象的名称。
3.5
其他语言元素
3.5.1
注释
3.5.2
变量
3.5.3
运算符
3.5.4
函数
3.5.5
流程控制语句
3.5.1
注释
•
注释是程序代码中不执行的文本字符串(也称为注解)。使用注释对代码进行说明,不仅能使程序易读易懂,而且有助于日后的管理和维护。注释通常用于记录程序名称、作者姓名和主要代码更改的日期。注释还可以用于描述复杂的计算或者解释编程的方法。
•
在
SQL Server
中,可以使用两种类型的注释字符:一种是
ANSI
标准的注释符
“
--
”
,它用于单行注释;另一种是与
C
语言相同的程序注释符号,即
“
/*
*/
”
。
“
/*
”
用于注释文字的开头,
“
*
/
”
用于注释文字的结尾,利用它们可以在程序中标识多行文字为注释。当然,单行注释也可以使用
“
/*
*/
”
,我们只需将注释行以
“
/*
”
开头并以
“
*
/
”
结尾即可。反之,段落注释也可以使用
“
--
”
,只需使段落注释的每一行都以
“
--
”
开头即可。
3.5.1
注释
•
例
3-25
使用两种注释类型的例子。
程序清单如下:
USE AdventureWorks
GO
-- First line of a multiple-line comment.
-- Second line of a multiple-line comment.
SELECT * FROM person.address
GO
/*
注释语句的第一行
.
注释语句的第二行
. */
SELECT * FROM Production.Product
GO
--
在
Transact-SQL
语言调试过程中使用注释语句。
3.5.2
变量
•
变量是一种语言中必不可少的组成部分。
Transact-SQL
语言中有两种形式的变量,一种是用户自己定义的局部变量,另外一种是系统提供的全局变量。
•
1.
局部变量
局部变量是一个能够拥有特定数据类型的对象,它的作用范围仅限制在程序内部。局部变量被引用时要在其名称前加上标志
“
@
”
,而且必须先用
DECLARE
命令定义后才可以使用。
•
定义局部变量的语法形式如下:
DECLAER {@local_variable
data_type} […n]
•
其中
,
参数
@local_variable
用于指定局部变量的名称
,
变量名必须以符号
@
开头
,
并且局部变量名必须符合
SQL Server
的命名规则。参数
data_type
用于设置局部变量的数据类型及其大小。
data_type
可以是任何由系统提供的或用户定义的数据类型。但是,局部变量不能是
text
,
ntext
或
image
数据类型。
•
使用
DECLARE
命令声明并创建局部变量之后,会将其初始值设为
NULL
,如果想要设定局部变量的值,必须使用
SELECT
命令或者
SET
命令。其语法形式为:
SET { { @local_variable = expression }
或者
SELECT { @local_variable = expression } [ ,...n ]
•
其中
,
参数
@local_variable
是给其赋值并声明的局部变量
,
参数
expression
是任何有效的
SQL Server
表达式。
3.5.2
变量
1.
局部变量
•
例
3-26
创建一个
@myvar
变量,然后将一个字符串值放在变量中,最后输出
@myvar
变量的值。
程序清单如下:
DECLARE @myvar
char(20)
select
@myvar = 'This is a test'
SELECT @myvar
GO
•
例
3-27
通过查询给变量赋值。
程序清单如下:
USE adventureworks
GO
DECLARE @rows int
SET @rows = (SELECT COUNT(*)
FROM
humanresources.employee)
3.5.2
变量
•
2.
全局变量
除了局部变量之外,
SQL Server
系统本身还提供了一些全局变量。全局变量是
SQL Server
系统内部使用的变量,其作用范围并不仅仅局限于某一程序,而是任何程序均可以随时调用。全局变量通常存储一些
SQL Server
的配置设定值和统计数据。用户可以在程序中用全局变量来测试系统的设定值或者是
Transact-SQL
命令执行后的状态值。在使用全局变量时应该注意以下几点:
(
1
)全局变量不是由用户的程序定义的,它们是在服务器级定义的。
(
2
)用户只能使用预先定义的全局变量。
(
3
)引用全局变量时,必须以标记符
“
@@”
开头。
(
4
)局部变量的名称不能与全局变量的名称相同,否则会在应用程序中出现不可预测的结果。
3.5.2
变量
•
2.
全局变量
•
例
3-29
显示到当前日期和时间为止试图登录
SQL Server
的次数。
程序清单如下:
SELECT GETDATE( )
AS
'
当前的时期和时间
',
@@CONNECTIONS AS
'
试图登录的次数
'
3.5.3
运算符
•
运算符是一些符号,它们能够用来执行算术运算、字符串连接、赋值以及在字段、常量和变量之间进行比较。在
SQL Server 2005
中,运算符主要有以下六大类:算术运算符、赋值运算符、位运算符、比较运算符、逻辑运算符和字符串串联运算符。
1
.算术运算符
算术运算符可以在两个表达式上执行数学运算,这两个表达式可以是数字数据类型分类的任何数据类型。算术运算符包括加(
+
)、减(-)、乘(*)、除(
/
)和取模(
%
)。
2
.赋值运算符
Transact-SQL
中只有一个赋值运算符,即(
=
)。赋值运算符使我们能够将数据值指派给特定的对象。另外,还可以使用赋值运算符在列标题和为列定义值的表达式之间建立关系。
3.5.3
运算符
3
.位运算符
•
位运算符使我们能够在整型数据或者二进制数据(
image
数据类型除外)之间执行位操作。此外,在位运算符左右两侧的操作数不能同时是二进制数据。表
3-1
列出了所有的位运算符及其含义。
3.5.3
运算符
4
.比较运算符
比较运算符亦称为关系运算符,用于比较两个表达式的大小或是否相同,其比较的结果是布尔值,即
TRUE
(表示表达式的结果为真)、
FALSE
(表示表达式的结果为假)以及
UNKNOWN
。除了
text
,
ntext
或
image
数据类型的表达式外,比较运算符可以用于所有的表达式。
5
.逻辑运算符
逻辑运算符可以把多个逻辑表达式连接起来。逻辑运算符包括
AND
、
OR
和
NOT
等运算符。逻辑运算符和比较运算符一样,返回带有
TRUE
或
FALSE
值的布尔数据类型。
三个运算符的优先级别为:
NOT
,
AND
,
OR
。
6
.字符串串联运算符
字符串串联运算符允许通过加号(
+
)进行字符串串联,这个加号即被称为字符串串联运算符。例如对于语句
SELECT ’abc’+’def’
,其结果为
abcdef
。
3.5.3
运算符
•
在
SQL Server 2005
中,运算符的优先等级从高到低如下所示,如果优先等级相同,则按照从左到右的顺序进行运算。
(
1
)括号:();
(
2
)乘、除、求模运算符:
*
,
/
,
%
;
(
3
)加减运算符:+,-;
(
4
)比较运算符:
=
,
>
,
<
,
>=
,
<=
,
<>
,
!=
,
!>
,
!<
;
(
5
)位运算符:
^
,
&
,
|
;
(
6
)逻辑运算符:
NOT
;
(
7
)逻辑运算符:
AND
;
(
8
)逻辑运算符:
OR
。
3.5.4
函数
•
在
Transact-SQL
语言中,函数被用来执行一些特殊的运算以支持
SQL Server
的标准命令。
SQL Server
包含多种不同的函数用以完成各种工作,每一个函数都有一个名称,在名称之后有一对小括号,如:
gettime( )
。大部分的函数在小括号中需要一个或者多个参数。
•
Transact-SQL
编程语言提供了四种函数:行集函数、聚合函数、
Ranking
函数、标量函数。
3.5.4
函数
1.
行集函数
•
行集函数可以在
Transact-SQL
语句中当作表引用。
•
例
3-33
通过行集函数
OPENQUERY()
执行一个分布式查询,以便从服务器
local
中提取表
department
中的记录。
程序清单如下:
select * from
openquery(local,’select * from department’)
3.5.4
函数
2.
聚合函数
•
聚合函数用于对一组值进行计算并返回一个单一的值。除
COUNT
函数之外,聚合函数忽略空值。聚合函数经常与
SELECT
语句的
GROUP BY
子句一同使用。仅在下列项中聚合函数允许作为表达式使用:
SELECT
语句的选择列表(子查询或外部查询);
COMPUTE
或
COMPUTE BY
子句;
HAVING
子句。
3.5.4
函数
2.
聚合函数
计算
Adventure Works Cycles
的副总所用的平均休假小时数以及总的病假小时数。对检索到的所有行,每个聚合函数都生成一个单独的汇总值。
程序清单如下。
USE AdventureWorks;
GO
SELECT AVG(VacationHours)as 'Average vacation hours',
SUM
(SickLeaveHours) as 'Total sick leave hours'
FROM HumanResources.Employee
WHERE Title LIKE 'Vice President%'
3.5.4
函数
3. Ranking
函数
•
Ranking
函数为查询结果数据集分区中的每一行返回一个序列值。依据此函数,一些行可能取得和其他行一样的序列值。
Transact-SQL
提供以下一些
Ranking
函数:
RANK
;
DENSE_RANK
;
NTILE
;
ROW_NUMBER
。
3.5.4
函数
4.
标量函数
标量函数用于对传递给它的一个或者多个参数值进行处理和计算,并返回一个单一的值。标量函数可以应用在任何一个有效的表达式中。标量函数可分为如表
3-4
所示的几大类
3.5.4
函数
4.
标量函数
(
1
)字符串函数
l
字符串函数可以对二进制数据、字符串和表达式执行不同的运算,大多数字符串函数只能用于
char
和
varchar
数据类型以及明确转换成
char
和
varchar
的数据类型,少数几个字符串函数也可以用于
binary
和
varbinary
数据类型。
l
字符串函数可以分为以下几大类:
Ø
基本字符串函数:
UPPER
,
LOWER
,
SPACE
,
REPLICATE
,
STUFF
,
REVERSE
,
LTRIM
,
RTRIM
。
Ø
字符串查找函数:
CHARINDEX
,
PATINDEX
。
Ø
长度和分析函数:
DATALENGTH
,
SUBSTRING
,
RIGHT
。
Ø
转换函数:
ASCH
,
CHAR
,
STR
,
SOUNDEX
,
DIFFERENCE
。
3.5.4
函数
4.
标量函数
(
1
)字符串函数
例
3-38
使用
LTRIM
函数删除字符变量中的起始空格。
程序清单如下:
DECLARE @string_to_trim varchar(60)
SET @string_to_trim = '
Five spaces are at the beginning of this
string.'
SELECT 'Here is the string without the leading spaces: ' +
LTRIM(@string_to_trim)
3.5.4
函数
4.
标量函数
(
1
)字符串函数
例
3-39
使用可选的
start_location
参数从
addressline1
列的第
2
个字符开始查找
“
shoe”
程序清单如下。
USE adventureworks
SELECT CHARINDEX('shoe', addressline1,2) FROM person.address
WHERE addressid = '5'
3.5.4
函数
4.
标量函数
(
1
)
字符串函数
例
3-40
显示如何只返回字符串的一部分。该查询在一列中返回
person.contact
表中的姓氏
,
在另一列中返回
person.contact
表中的名字首字母。
程序清单如下
:
USE adventureworks
SELECT lastname, SUBSTRING(firstname, 1, 1)
FROM person.contact
ORDER BY lastname
例
3-41
在第一个字符串
(
abcdef
)
中删除从第二个位置
(
字符
b
)
开始的三个字符
,
然后在删除的起始位置插入第二个字符串
,
创建并返回一个字符串。
程序清单如下:
SELECT STUFF('abcdef', 2, 3, 'ijklmn')
3.5.4
函数
4.
标量函数
(
2
)日期和时间函数
日期和时间函数用于对日期和时间数据进行各种不同的处理和运算,并返回一个字符串、数字值或日期和时间值。与其他函数一样,可以在
SELECT
语句的
SELECT
和
WHERE
子句以及表达式中使用日期和时间函数。
3.5.4
函数
4.
标量函数
(
2
)日期和时间函数
例
3-42
显示在
humanresources.employee
表中雇用日期到当前日期间的天数。
程序清单如下。
USE adventureworks
SELECT DATEDIFF(day, hiredate, getdate())
AS diffdays
FROM humanresources.employee
例
3-43
从
GETDATE
函数返回的日期中提取月份名。
程序清单如下
:
SELECT DATENAME(month, getdate())
AS
'Month Name'
3.5.4
函数
4.
标量函数
(
3
)数学函数
•
数学函数用于对数字表达式进行数学运算并返回运算结果。数学函数可以对
SQL Server
提供的数字数据(
decimal
、
integer
、
float
、
real
、
money
、
smallmoney
、
smallint
和
tinyint
)进行处理。在
SQL Server
中,常用的数学函数如表
3-8
所示。
3.5.4
函数
4.
标量函数
(
3
)数学函数
例
3-45
在同一表达式中使用
CEILING()
,
FLOOR()
,
ROUND()
函数。
程序清单如下:
select
ceiling(13.4),
floor(13.4),
round(13.4567,3)
3.5.4
函数
4.
标量函数
(
4
)系统函数
•
系统函数用于返回有关
SQL Server
系统、用户、数据库和数据库对象的信息。系统函数可以让用户在得到信息后,使用条件语句,根据返回的信息进行不同的操作。与其他函数一样,可以在
SELECT
语句的
SELECT
和
WHERE
子句以及表达式中使用系统函数。
3.5.4
函数
4.
标量函数
(
4
)系统函数
•
转换函数有两个:
CONVERT
和
CAST
。
•
CAST
函数允许把一个数据类型强制转换为另一种数据类型,其语法形式为:
CAST( expression
AS
data_type )
•
CONVERT
函数允许用户把表达式从一种数据类型转换成另一种数据类型,还允许把日期转换成不同的样式,其语法形式为:
CONVERT (data_type[(length)],expression [,style])
3.5.4
函数
4.
标量函数
(
4
)系统函数
•
转换函数有两个:
CONVERT
和
CAST
。
•
CAST
函数允许把一个数据类型强制转换为另一种数据类型,其语法形式为:
CAST( expression
AS
data_type )
•
CONVERT
函数允许用户把表达式从一种数据类型转换成另一种数据类型,还允许把日期转换成不同的样式,其语法形式为:
CONVERT (data_type[(length)],expression [,style])
3.5.4
函数
4.
标量函数
(
4
)系统函数
例
3-46
示例检索列表价格的第一位是
3
的产品的名称,并将
ListPrice
转换为
int
。
程序清单如下。
USE AdventureWorks
GO
SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice
FROM Production.Product
WHERE CAST(ListPrice AS int) LIKE '3%'
GO
3.5.4
函数
4.
标量函数
(
4
)系统函数
例
3-47
用
style
参数将当前日期转换为不同格式的字符串。
程序清单如下:
SELECT '101'=CONVERT(char, GETDATE(), 101),
'1'=CONVERT(char, GETDATE(), 1),
'112'=CONVERT(char, GETDATE(), 112)
3.5.4
函数
4.
标量函数
(
4
)系统函数
例
3-48
从
adventureworks
数据库中返回
person.contact
表的首列名称
程序清单如下。
USE adventureworks
SELECT COL_NAME(OBJECT_ID('person.contact'), 1)
例
3-49
检查
sysdatabases
中的每一个数据库,使用数据库标识号来确定数据库名称。
程序清单如下:
USE master
SELECT dbid, DB_NAME(dbid)
AS
DB_NAME
FROM sysdatabases
ORDER BY dbid
3.5.5
流程控制语句
•
流程控制语句是指那些用来控制程序执行和流程分支的语句,在
SQL Server 2005
中,流程控制语句主要用来控制
SQL
语句、语句块或者存储过程的执行流程。
3.5.5
流程控制语句
1
.
IF…ELSE
语句
•
IF…ELSE
语句是条件判断语句,其中,
ELSE
子句是可选的,最简单的
IF
语句没有
ELSE
子句部分。
IF…ELSE
语句用来判断当某一条件成立时执行某段程序,条件不成立时执行另一段程序。
SQL Server
允许嵌套使用
IF…ELSE
语句,而且嵌套层数没有限制。
•
IF…ELSE
语句的语法形式为:
IF Boolean_expression
{ sql_statement | statement_block }
[ ELSE
{ sql_statement | statement_block } ]
3.5.5
流程控制语句
1
.
IF…ELSE
语句
例
3-51
显示带有语句块的
IF
条件。如果产品的平均价格不低于
$15
,那么就显示文本:
Average price is more than $15
程序清单如下。
USE adventureworks
IF (SELECT AVG(listprice) FROM production.product WHERE color = 'blue') < $15
BEGIN
PRINT 'The following product are excellent:'
PRINT ' '
SELECT SUBSTRING(name, 1, 15) AS name
FROM production.product
WHERE color = 'blue'
END
ELSE
PRINT 'Average price is more than $15.'
3.5.5
流程控制语句
2
.
BEGIN…END
语句
•
BEGIN…END
语句能够将多个
Transact-SQL
语句组合成一个语句块,并将它们视为一个单元处理。在条件语句和循环等控制流程语句中,当符合特定条件便要执行两个或者多个语句时,就需要使用
BEGIN…END
语句。
•
BEGIN…END
语句的语法形式为:
BEGIN
{ sql_statement
| statement_block
}
END
3.5.5
流程控制语句
2
.
BEGIN…END
语句
例
3-52
利用
BEGIN
和
END
语句使得
IF
语句在取值为
FALSE
时跳过语句块。
程序清单如下
:
IF (@@ERROR <> 0)
BEGIN
SET @ErrorSaveVariable = @@ERROR
PRINT 'Error encountered, ' +
CAST(@ErrorSaveVariable AS VARCHAR(10))
END
3.5.5
流程控制语句
3
.
GO
语句
Go
语句是批的结束语句。批是一起提交并作为一个组执行的若干
SQL
语句。
例
3-53
用
Go
语句作为批的结束语句。
程序清单如下:
•
USE adventureworks
GO
DECLARE @MyMsg VARCHAR(50)
SELECT @MyMsg = 'Hello, World.'
GO -- @MyMsg
在
Go
语句后失效。
3.5.5
流程控制语句
4
.
CASE
语句
•
CASE
语句可以计算多个条件式,并将其中一个符合条件的结果表达式返回。
CASE
语句按照使用形式的不同,可以分为简单
CASE
语句和搜索
CASE
语句。
•
它们的语法形式分别为:
CASE input_expression
WHEN when_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
ENDCASE
WHEN Boolean_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
END
3.5.5
流程控制语句
4
.
CASE
语句
例
3-54
使用
CASE
函数去更改产品的分类显示,以使其更易于理解
程序清单如下。
USE adventureworks
SELECT
Category =
CASE color
WHEN 'red' THEN 'red color'
WHEN 'black' THEN 'black color'
WHEN 'silver' THEN 'silver color'
WHEN 'yellow' THEN 'yellow color'
WHEN 'blue' THEN 'blue color'
END,
CAST(name AS varchar(25)) AS 'Shortened name',
listprice AS Price
FROM production.product
WHERE listprice IS NOT NULL
ORDER BY color, price
COMPUTE AVG(listprice) BY color
3.5.5
流程控制语句
4
.
CASE
语句
例
3-55
使用搜索
CASE
函数
,
根据产品的价格范围将价格显示为文本注释
程序清单如下。
USE adventureworks
SELECT
'Price Category'=
CASE
WHEN listprice IS NULL THEN 'Not yet priced'
WHEN listprice < 10 THEN 'Very Reasonable Title'
WHEN listprice >= 10 and listprice < 20 THEN 'Coffee Table Title'
ELSE 'Expensive!'
END,
CAST(name AS varchar(20)) AS 'Shortened name'
FROM production.product
ORDER BY listprice
GO
3.5.5
流程控制语句
5
.
WHILE…CONTINUE…BREAK
语句
•
WHILE…CONTINUE…BREAK
语句用于设置重复执行
SQL
语句或语句块的条件。只要指定的条件为真,就重复执行语句。其中,
CONTINUE
语句可以使程序跳过
CONTINUE
语句后面的语句,回到
WHILE
循环的第一行命令。
BREAK
语句则使程序完全跳出循环,结束
WHILE
语句的执行。
•
其语法形式为:
WHILE Boolean_expression
{
sql_statement
|
statement_block
}
[ BREAK ]
{
sql_statement
|
statement_block
}
[ CONTINUE ]
3.5.5
流程控制语句
5
.
WHILE…CONTINUE…BREAK
语句
例
3-56
在嵌套的
IF...ELSE
和
WHILE
中使用
BREAK
和
CONTINUE
。如果平均价格少于
$30
,
WHILE
循环就将价格加倍,然后选择最高价。如果最高价少于或等于
$50
,
WHILE
循环重新启动并再次将价格加倍。该循环不断地将价格加倍直到最高价格超过
$50
,然后退出
WHILE
循环并打印一条消息。
程序清单如下:
USE adventureworks
WHILE (SELECT AVG(listprice)
FROM production.product) < $30
BEGIN
UPDATE
production.product
SET listprice = listprice * 2
SELECT MAX(listprice) FROM production.product
IF (SELECT MAX(listprice) FROM production.product) > $50
BREAK
ELSE
CONTINUE
END
PRINT 'Too much for the market to bear'
3.5.5
流程控制语句
6
.
GOTO
语句
•
GOTO
语句可以使程序直接跳到指定的标有标识符的位置处继续执行,而位于
GOTO
语句和标识符之间的程序将不会被执行。
GOTO
语句和标识符可以用在语句块、批处理和存储过程中,标识符可以为数字与字符的组合,但必须以
“
:
”
结尾。如:
‘
a1:
’
。在
GOTO
语句行,标识符后面不用跟
“
:
”
。
GOTO
语句的语法形式为:
GOTO label
……
label:
例
3-57
利用
GOTO
语句求出从
1
加到
5
的总和。
程序清单如下:
declare
@sum
int,
@count
int
select
@sum=0,
@count=1
label_1:
select
@sum=@sum+@count
select
@count=@count+1
if
@count<=5
goto
label_1
select
@count
@sum
3.5.5
流程控制语句
7
.
WAITFOR
语句
•
WAITFOR
语句用于暂时停止执行
SQL
语句、语句块或者存储过程等,直到所设定的时间已过或者所设定的时间已到才继续执行。
•
WAITFOR
语句的语法形式为:
WAITFOR { DELAY 'time' | TIME 'time' }
•
其中,
DELAY
用于指定时间间隔,
TIME
用于指定某一时刻,其数据类型为
datetime
,格式为
‘
hh:mm:ss’
。
例
3-58
使用
WAITFOR TIME
语句,以便在晚上
10:20
执行存储过程
update_all_stats
。
程序清单如下:
BEGIN
WAITFOR TIME '22:20'
EXECUTE update_all_stats
END
3.5.5
流程控制语句
8
.
RETURN
语句
•
RETURN
语句用于无条件地终止一个查询、存储过程或者批处理,此时位于
RETURN
语句之后的程序将不会被执行。
•
RETURN
语句的语法形式为:
RETURN [ integer_expression
]
•
其中
,
参数
integer_expression
为返回的整型值。存储过程可以给调用过程或应用程序返回整型值。
3.5.5
流程控制语句
8
.
RETURN
语句
例
3-59
显示如果在执行
findjobs
时没有给出用户名作为参数,
RETURN
则将一条消息发送到用户的屏幕上然后从过程中退出。如果给出用户名,将从适当的系统表中检索由该用户在当前数据库内创建的所有对象名。
程序清单如下:
CREATE PROCEDURE findjobs @nm sysname = NULL
AS
IF @nm IS NULL
BEGIN
PRINT 'You must give a username'
RETURN
END
ELSE
BEGIN
SELECT o.name, o.id, o.uid
FROM sysobjects o INNER JOIN master..syslogins l
ON o.uid = l.sid
WHERE l.name = @nm
END
上一篇:数据库管理
下一篇:SQL Server 服务器管理
相关文章
无盘也疯狂 用Win 2003巧妙实现无盘工作站(2)
[图]做德才兼备的IT工程师
SQL离前端有多远?
IT行业求职应聘宝典
面试技巧的训练
天津腾梁科技发展有限公司
[图]我校师生猜灯谜吃元宵共庆元宵佳节
软件920班模块评比结果揭晓
打印
收藏
关闭