Waver's blog

心境如秋

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

范例
select cust_id,SUM(pay1) AS pay11 from pay_list GROUP BY pay1 WITH CUBE
go
以上代码导致错误因为在SUM汇总函数所指定的字段名称pay1与CUBE关键词一并使用所导致发生的错误消息
修改
SELECT cust_id,SUM(pay1) as pay11 FROM pay_list GROUP BY cust_id WITH CUBE
GO

ROLLUP关键词
将GROUP BY后面所加的第一个字段名称来求和而其他的字段并不做
ROLLUP以及CUBE关键词二者之间不同的地方就是ROLLUP只会将GROUP BY后面的第一个字段名称求总和而CUBE则会将每一个字段都求总和的操作

范例
SELECT 厂商编号,产品名称,SUM(数量) AS 总数量 FROM proced GROUP BY 厂商编号,产品名称 WITH ROLLUP
GO

COMPUTE关键词
用来将分组小计也就是在字段内进行分组,并且将每一组生成一或多个总和 平均值等
范例
select 厂商编号,产品名称,数量 from proced compute sum(数量)
go

以厂商编号作为分类根据时
select 厂商编号,产品名称,数量 from proced order by 厂商编号 COMPUTE SUM(数量) BY 厂商编号
go

7.5 HAVING语句

HAVING语句是用来指定组或汇总的搜索条件的。HAVING语句一般只能与 SELECT语句一起使用,并且他通常是会在GROUP BY子句中使用

范例
计算出其进货的总数量大于200的厂商编号及产品名称
SELECT 厂商编号,产品名称,SUM(数量) AS 数量 FROM proced GROUP BY 厂商编号,产品名称 HAVING SUM(数量)>100
GO

7.6 DISTINCT及ALL关键词

范例
SELECT DISTINCT FROM proced
go

7.7 ESCAPE关键词
如果想将统配符百分号符号视为字符而非统配符时,可以使用ESCAPE关键词再加上百分号符号即可。

范例
在customs表格中,找出符合折扣为50%的所有记录
use misdb
go
select * from customs where discl like '50%' escape '%'
go

7.8 批注
方式一:以/*开始以*/结束
方式二:-- 批注一行
范例:
编写批注的正确用法使用"/*"和"*/"
/*编写批注的用法*/
/*USE Pubs
GO*/
select * from authors
go

7.9 区域变量与全局变量

SQL SERVER中,变量可分为两种一是区域变量另一种是全局变量
在SQL SERVER中,区域变量一般都是由用户自己定义的,其表示方式是以"@"来作为变量名称的开头。而全局变量则是由系统提供的,并且其表示方式是以"@@"来作为变量名称的。
区域变量的生命周期是使用DECLARE语句开始,直到此批处理执行结束时就结束。

DECLARE @TEST int --区域变量@TEST生命周期开始
@TEST=5
SELECT * FROM authors WHERE au_id=@TEST
GO                --批处理结束执行,@TEST变量的生命周期结束
SELECT * FROM authors
GO

区域变量
要使用区域变量,首先要先将区域变量进行声明,在声明区域变量之后系统会将区域变量值初始设置为NULL值,然后再使用SET或SELECT语句来进行设置变量值。将变量进行声明时,你必须要使用DECLARE语句来进行声明。
DECLARE @TEST int   --声明变量TEST及其数据类型
SET @TEST=5         --设置变量TEST的值为5

声明多个变量名称之间使用逗号来分割。
DECLARE @A1 char(10),@a2 int,@a3 char(10)

使用SELECT语句设置变量时有以下两种方法
一 直接设置变量值
DECLARE @TEST int
SELECT @TEST=5
二 将查询结果指定给变量,但此种方式必须要求其查询结果是单一值
DECLARE @TEST int
SELECT @TEST=数量 From customer WHERE cust_id='A001'

使用SELECT语句来指定变量值时,若你有多个变量要指定多个变量值时,每个变量之间可以用逗号来分割开来。

7.10 流程控制

BETIN...END
用来将一串T-SQL语句使用BEGIN...END的关键词括在一起,以便让被括在一起之内的T-SQL语句可以被执行。

如果所要执行的T-SQL语句只有一行,就不用使用BEGIN...END语句来执行,因为只有一行T-SQL语句就不需要被括在一起来执行。

语法
BEGIN{
sql_statement | statement_block
}
END

BEGIN...END语句组可以是镶套的。

范例
--BEGIN...END语句的使用范例
use pubs
go
begin
select * from authors where au_id like ' 2* '
end

begin
select cust_id,cust_name from custom order by cust_id
end

IF...ELSE语句

语法
IF Boolean_expression
{sql_statement|statement_block}
else
{sql_statement|statement_block}
如果要执行的T-SQL语句不只一行时,就必须要使用BEGIN...END语句组

范例
--IF...ELSE语句的使用范例
if (select avg(总成绩) from 学生成绩<60)
print '你的总成绩不及格'
else
print '你的总成绩几个,恭喜你!'

--镶套IF...ELSE语句的使用范例
if (select sum(订单数量) from 订单表格)>1000
print '他们是最佳客户'
else
if(select sum(订单数量) from 订单表格)>500
print '必须与他们保持联络'
else
print '再想想办法吧!!'

WHILE循环 BREAK及CONTINUE语句

语法声明
while Boolean_expression
{sql_statement|statement_block}
[BREAK]--退出最内层的WHILE循环
{sql_statement|statement_block}
[CONTINUE]--重新执行WHILE循环忽略掉在CONTINUE之后的任何T-SQL语句
如果有两个或两个以上的WHILE循环组成镶套WHILE循环时,内层的BREAK语句会退出到下一个外层循环。首先在较内层循环结束处之后的T-SQL语句会被执行,然后开始下一个外层的循环。

范例
--使用WHILE CONTINUE BREAK语句的使用范例
while (select avg(单价) from 订单表格)<60
begin
set 单价=单价*4
if(select max(单价) from 订单表格)>80
break
else
continue
end

GOTO 语句
GOTO语句可以用来改变执行流程至某个标签名称

语法声明
定义标签名称时
label :
要改变执行时
goto label

标签名称摆在GOTO语句之前或之后并没有特别限制。
注意GOTO 语句只能在WHILE或IF...ELSE语句内往外跳至标签名称处而不能由外面语句跳进IF...ELSE或WHILE语句内。

范例
--GOTO语句的使用范例
if (select max(单价) from 订单表格)>100
goto max_label
else
goto min_label
max_label:
print '太贵了'
min_label:
print '价格合理'

RETURN 语句
将目前正在执行的批处理T-SQL语句,退出程序或语句中断,并返回或不返回数值。
当RETURN语句与存储过程一起使用时,其RETURN并不会返回一个NULL值。但当某程序尝试返回NULL值时,则会生成警告消息,接着会返回一个为0的数值。

语法声明
return [integer_expression]
integer_expression指要返回的整数值

范例
--return的使用范例
create procedurecheck_maxdata
as
if(select state from authors where au_id='123-34-45')
return 1
else
return 2

WAITFOR语句
WAITFOR语句是用来指定触发语句组,存储过程或事物执行的时间,时间间隔或事件。执行WAITFOR语句之后,必须等到指定的时间或指定的事件发生后,才能使用到SQL Server 的连接。
如果 想知道目前谁在使用或等待时,可以使用系统存储过程sp_who来了解。

声明语法
WAITFOR{DELAY 'time'|TIME 'time'}
参数说明
DELAY用来设置要SQL Server必须要等待所到指定的时数已过时,才可以使用SQL Server的连接
time 用来指定要等待的时间
只能指定时间而不能设置日期。其等待时间的设置最多可指定到24小时。

TIME用来指示SQL Server等待到所指定的时间。

范例
--此范例会在下午6:00时会执行select_data 存储过程
begin
waitfor TIME '18:00'
EXEC select_data
end

begin
waitfor TIME '15:20'
print 'ninhao'
end

范例
--WAITFOR DELAY的使用范例
use pubs
go
--设置要sql server 等待一分钟再执行下列语句
waitfor delay '00:01:00'
select * from authors
go

7.11 CASE,RAISERROR语句

CASE
根据条件列表之后来执行表达式,其CASE可分为两种格式:
1 一种格式是属于简单的CASE格式,这种CASE会比较表达式与一组简单表达式,以便决定结果。
2 另一种格式是属于搜索的CASE格式,这种格式会评估一组布尔表达式,以便决定其结果。

简单CASE声明
CASE input_expression
WHEN when_expression THEN result_expression
[..n]
[
ELSE else_result_expression
END

如果想使用搜索CASE格式时,可以根据下面的语法来进行声明
CASE
WHEN Boolean_expression THEN result_expression
[..n]
[
ELSE else_result_expression
END

CASE如果没有ELSE且没有任何比较运算其结果为真时CASE语句会返回一个NULL值

范例
--此范例是介绍如果使用简单的CASE格式
use
pubs
go
select 产品类别=
case type1
when '水果' then sum1=sum1+1
when '五金' then sum2=sum2+1
when '药品' then sum3=sum3+1
else sum0=sum0+1
end
go

范例
--此范例会介绍如果使用搜索CASE格式

USE MIS
GO
SELECT 语文成绩=
CASE
WHEN scorel<59 THEN '不及格'
WHEN scorel>60 and scorel<=70 THEN '中上成绩'
WHEN scorel>=91 and scorel<+100 THEN '成绩优良'
END
GO

RAISERROR 语句
RAISERROR语句会返回用户所自定义的错误消息,并且设置系统旗标,记录曾发生过的错误。
使用RAISERROR指定用户自定义的错误消息时,请使用大于50,000的错误消息代码和0至18的重要性层级。

使用系统存储过程sp_addmessage来创建自定义的错误消息

RAISERROR语句其语法声明

使用RAISERROR语句来创建并返回用户自定义的错误信息时,请使用sp_addmessage来添加用户自定义的错误消息,并使用sp_dropmessage来删除用户自定义的错误消息。
发生错误时,错误代码会放置在@@ERROR函数中,此函数存放着最近生成的错误代码。

范例
--使用RAISERROR的范例
--使用sp_addmessage来创建自定义错误消息,其中76548是指错误代码,9是代表严重程度,而"错误消息测试"则是代表消息内容
EXEC sp_addmessage 76548,9,'错误消息测试'
GO
RAISERROR(76548,9,1)

7.12 EXEC 语句

用来执行存储过程或T-SQL语句的批处理程序等语句。

范例
--执行系统存储过程sp_who的方式
EXEC sp_who
go

范例
--执行程序test_pro,并传递一参数

EXEC test_pro case_id --其中test_pro为程序名称,而case_id 为参数
GO

范例
--使用多个参数以及一个输出参数
--其中a01,b01指的是要给test_pro程序使用的参数
--而@a1则是指要输出的参数名称,我们使用@test来接受@a1所返回的值
EXEC test_pro 'a01','b01',@a1=@test OUTPUT

范例
--执行远程程序test1,并传递一个参数
--其中Mis_Server.mis.dbo.order1指的是要执行在远程服务器mis_server,在mis@t1指的是接受自执行后的order1程序状态值
EXEC @t1=Mis_Server.mis.dbo.order1 '981-098'
GO

范例
--以字符串方式
EXEC('THIS'+'A098.18364.47')
GO

posted on 2008-08-21 09:41  Waver  阅读(1212)  评论(0编辑  收藏  举报