7. Transact-SQL程序设计
|
本章主题 l 使用SQL查询分析器 l Transact-SQL的组成元素 l 局部变量 l 运算符 l 表达式 l 如何为程序加上注释 l 函数 l 流程控制语句 l 动态创建语句
精彩内容不容错过!这一章内容非常重要
|
所谓“程序设计”就是学习如何以合理的方式将一系列的命令结合起来。
准备工作
准备工作:在示例代码ch8目录中,数据库(NorthwindSQL)
文件名:NorthwindSQL.mdf、NorthwindSQL.ldf
7.1. 使用SQL查询分析器
7.2. Transact-SQL的组成元素
SQL语言不具备创建窗体、菜单、报表等的能力,SQL Server扮演一个后台数据库的角色,客户端的开发工具可以选择VB、Access、VFP、VC、Delphi、C++Builder等。
Transact-SQL的组成元素:
- 数据定义语言(DataDefinition Language,DDL)
- 数据操作语言(DataManipulation Language,DML)
- 数据控制语言(DataControl Language,DCL)
- 系统存储过程(SystemStored Procedure)
- 其它组成元素
数据定义语言
DDL:用来定义和管理数据库及其所含种类对象的语句。
DDL的形式:
- CREATE object_name
- ALTER object_name
- DROP object_name
数据操作语言
DML:用来查询、添加、修改、删除数据库中数据的语句。
DML的种类:
- SELECT
- INSERT
- UPDATE
- DELETE
数据控制语言
DCL:用来设置或更改数据库用户或角色权限的语句。
DCL的种类:
- GRANT
- DENY
- REVOKE
系统存储过程
系统存储过程存放在系统数据库master中且名称以sp_开头,如sp_addtype、sp_rename、sp_configure等。回忆一下先前讲过的sp_addtype系统存储过程
其它组成元素
- 注释
- 局部变量
- 运算符
- 函数
- 流程控制语句
7.3. 常量
字符串常量
示例:
‘温一军’
‘处理中,请稍后…’
‘输入值必须介于3000~
- 如果字符串中包含单引号,可以用两个单引号表示字符串本身内嵌的单引号
n 如:’It’’s legs are long’
Unicode字符串常量
必须以大写的字母N作为前缀,如:N’Michaё’,Unicode数据的每一个字符使用2个字节存储。
二进制常量
以0x作为前缀,再加上16进制数值来表示。
如:
0xAE
0x12Ef
Bit常量
以0或1表示
日期时间常量
- 日期时间常量可能只包含日期、只包含时间或日期、时间都有。
- 在日期部分可采用字母日期格式、数字日期格式、未分隔字符串格式。
- 不论采用哪一种格式的日期,年份都可以使用 2位或4位的数字。
- 时间部分采用时间格式。
- 如果只指定日期,时间默认是12:00AM(午夜)
- 如果只指定时间,日期默认是1900年1月1号
特别注意:
日期时间常量必须包含在一对单引号中。
最好一致使用4位数的年份。
数字日期格式:
- 在年份、月份、日期之间的分隔符
n 斜线 /
n 连字符 –
n 英文的句点 .
- 示例:
n ‘
n ‘
n ‘
n ‘
- 年份、月份、日的顺序
n SET DATEFORMAT 格式
n 格式:mdy、dmy、ymd、ydm、myd、dym
/*档案名称: Demo81.sql*/
SET DATEFORMAT ydm
GO
DECLARE@datevar datetime
SET@datevar = '2001/21/09'
SELECT@datevar
GO
SET DATEFORMAT mdy
GO
DECLARE@datevar datetime
SET@datevar = '
SELECT@datevar
GO
SET DATEFORMAT ymd
GO
DECLARE@datevar datetime
SET@datevar = '
SELECT@datevar
GO
时间格式:
- 格式:Hours[:Minutes[:Seconds][:Milliseconds]]][AM | PM]
- 示例:
n ’14:30:20:
n ‘2:30:20.5AM’ –其中20.5表示20又十分之5秒
n AM与PM可大写或小写表示,且与前面时间值之间可空格或不空格
敬告大家:
最好统一采用固定一种格式,方便开发、维护、调试!
整数常量
不包含小数点,如:
- 2991
- 1969
- 10
Decimal常量
可以包含小数点,如:
- 256.456
- 2
- 23.11
Float和Real常量
使用科学计数法表示,如:
- 101.5E5
- 0.5E-2
货币值常量
可以包含或不包含小数点,以一货币符号$作为前缀 ,如:
- $234
- $345.33
指定正数或负数
以负号 -表示负数,不加符号,表示正数。
常量的使用方式
- 常量用于算术表达式
n SELECT Salary+$500 FROM myTable
- 常量作为WHERE子句中的条件值
n SELECT * FROM myTable WHERE name=’温一军’
- 将常量赋值给变量
n SET @datetimevar=’
- 当使用UPDATE命令时,用于SET子句中
n UPDATE myTable
SET salary=$6000
WHERE birthday=’
- 在IF语句或CASE函数等条件语句中
n IF (@storageAmount<5000)
PRINT ‘低于安全库存’
7.4. 局部变量
是一个能够拥有特定数据类型的对象,是程序中各数据的临时存储处。
声明局部变量
- 格式:DECLARE{@local_variable data_type} […n]
- 赋予局部变量一个名称,必须以@符号开头。
- DECLARE命令在创建局部变量之后,会将其初始值设成NULL
示例:
- DECLARE @searchName varchar(12)
- DECLARE @birthday datetime
- DECLARE @height decimal(5,2)
- DELCARE @name nvarchar(12),@phone nvarchar(11)
赋值数据值
- 格式:SET @local_variable=表达式
/*档案名称: Demo82.sql*/
--声明一个局部变量
DECLARE @mString varchar(40)
--将文字串赋值给局部变量
SET @mString = '嗨! 谢谢使用本系统'
--显示局部变量所持有的值
SELECT @mString
/*档案名称: Demo83.sql*/
--声明一个局部变量
DECLARE @mString nvarchar(40)
--将文字串赋值给局部变量
SET @mString = N'嗨! 谢谢使用本系统'
--显示局部变量所持有的值
SELECT @mString
/*档案名称: Demo84.sql*/
USE NorthwindSQL
--声明一个局部变量
DECLARE @NameVariable char(10)
--将文字串常数赋值给局部变量
SET @NameVariable = '许建仁'
--将局部变量使用于 SELECT 命令的 WHERE 引数中
SELECT 身份证字号,姓名,电话号码,住址
FROM 飞狐工作室
WHERE 姓名 = @NameVariable
/*档案名称: Demo85.sql*/
USE NorthwindSQL
--声明三个局部变量
DECLARE @LastName char(2),
@CityVariable char(6),
@BirthdayVariable datetime
--将常数赋值给局部变量
SET @LastName = '李'
SET @CityVariable = '台北市'
SET @BirthdayVariable = '
--将局部变量使用于 SELECT 命令的 WHERE 引数中
SELECT 姓名,电话号码,住址,出生日期
FROM 飞狐工作室
WHERE 姓名 LIKE @LastName + '%' AND
住址 LIKE '%' + @CityVariable +'%' AND
出生日期 = @BirthdayVariable
/*档案名称: Demo86.sql*/
USE NorthwindSQL
DECLARE @AvgSalary money
--将计算所得之平均薪资储存至局部变量 @AvgSalaryVariable 中
SELECT @AvgSalary = AVG(目前薪资)
FROM 飞狐工作室
--将局部变量 @AvgSalary 所持有的值显示出来
SELECT @AvgSalary
/*档案名称: Demo87.sql*/
USE NorthwindSQL
DECLARE @MaxSalary money
SELECT @MaxSalary = 目前薪资
FROM 飞狐工作室
ORDER BY 目前薪资 ASC
--将局部变量 @MaxSalary 所持有的值显示出来
SELECT @MaxSalary
适用范围
局部变量只能在声明它们的批处理、存储过程中使用。
/*档案名称: Demo88.sql*/
USE NorthwindSQL
DECLARE @VlHere datetime
SET @VlHere = '
GO
-- 此时区域性变数 @VlHere 已经不在适用范围之内且已不存在
-- 下面这一道SELECT命令叙述之所以会发生错误,系因它
-- 存取已经不存在的区域性变数 @VlHere
SELECT * FROM飞狐工作室
WHERE 出生日期 = @VlHere
table数据类型变量
- table数据类型是SQLServer2000新添加的数据类型,该数据类型不适用于表的字段,仅适用于局部变量。
- table数据类型非常象一个临时表,实际上主要用途是作为多条数据记录的临时存储之处。
衷心建议:
如果允许的话,应该尽可能以table数据类型的变量获得临时表。
/*档案名称: Demo872.sql*/
USE NorthwindSQL
/* 宣告一个名为 @MyTableVariable 的 table 资料型态变数*/
DECLARE @MyTableVariable TABLE
(
部门 varchar(10) PRIMARY KEY,
员工人数 bigint,
部门最高薪资 money,
部门最低薪资 money,
部门平均薪资 money
)
/* 将资料新增至 @MyTableVariable */
INSERT INTO@MyTableVariable
SELECT 部门,
COUNT(*) AS 部门员工人数,
MAX(目前薪资) AS 部门最高薪资,
MIN(目前薪资) AS 部门最低薪资,
AVG(目前薪资) AS 部门平均薪资
FROM 飞狐工作室
GROUP BY 部门
/* 列示出 @MyTableVariable 的内容 */
SELECT * FROM@MyTableVariable
7.5. 运算符
运算符的类型
- 算术运算符
- 赋值运算符
- 位运算符
- 比较运算符
- 逻辑运算符
- 字符串串联运算符
算术运算符
|
运算 |
符号 |
|
加法 |
+ |
|
减法 |
- |
|
乘法 |
* |
|
除法 |
/ |
|
求模 |
% |
/*档案名称: Demo89.sql*/
DECLARE@number1 int
DECLARE@number2 int
DECLARE@number3 decimal(4,2)
SET@number1 = 13
SET@number2 = 5
SET@number3 = 3
SELECT@number1 + 10
SELECT@number2 - 10
SELECT@number1 + @number2
SELECT@number1 - @number2
SELECT@number1 * @number2
SELECT@number1 / @number2
SELECT@number1 / @number3
SELECT(@number1 * @number2) % (@number1 + @number2)
/*档案名称: Demo810.sql*/
USENorthwindSQL
SELECT产品, 库存量 + 已订购量
FROM 产品资料
ORDER BY 产品 ASC
/*档案名称: Demo811.sql*/
USENorthwindSQL
SELECT姓名,(目前薪资/起薪 - 1) * 100 AS 调薪幅度百分比
FROM 飞狐工作室
/*档案名称: Demo812.sql*/
SETDATEFORMAT mdy
DECLARE@vlNow datetime
SET@vlNow = '
SELECT@vlNow + 10 --加上10天
/*档案名称: Demo813.sql*/
SETDATEFORMAT mdy
DECLARE@vlNow datetime
SET@vlNow = '01/01/1999 13:00:00'
SELECT@vlNow + 10.55 --加上10天+0.55天,
--结果为'01/12/1999 02:12:00'
赋值运算符
- 运算符为: = (等号)
/*档案名称: Demo814.sql*/
USENorthwindSQL
DECLARE@Variable1 int
DECLARE@Variable2 money
SET@Variable1 = 10
SELECT@Variable2 = MIN(目前薪资) FROM 飞狐工作室
SELECT@Variable1
SELECT@Variable2
/*档案名称: Demo815.sql ,此处用于指定查询结果的字段标题*/
USENorthwind
SELECT员工姓名 = FirstName +' ' + LastName,
年龄 = DATEDIFF(year,Birthdate,getdate())
FROM Employees
比较运算符
|
运算 |
符号 |
|
小于 |
< |
|
大于 |
> |
|
等于 |
= |
|
不等于 |
<> |
|
不等于 |
!= |
|
小于等于 |
<= |
|
大于等于 |
>= |
|
不小于 |
!< |
|
不大于 |
!> |
/*档案名称: Demo817.sql*/
USENorthwindSQL
DECLARE@vlCity nvarchar(3)
SET@vlCity = '台北市'
IF(@vlCity <> '')
SELECT 公司名称,连络人,电话
FROM客户
WHERE城市 = @vlCity
逻辑运算符
|
运算 |
符号 |
|
与(并且) |
AND |
|
或(或者) |
OR |
|
非(否定) |
NOT |
/*档案名称: Demo818.sql*/
USENorthwindSQL
SELECT 姓名,性别,电话号码,出生日期
FROM 飞狐工作室
WHERE 性别 = 0 AND
DATEDIFF(year,出生日期,GETDATE()) < 30 AND
部门 = '资讯部'
字符串串联运算符
- 运算符为: + (加号)
如:SELECT ‘我是温一军’+’大家好!’
运算符的优先顺序
优先顺序从高到低:
- +(正号)、-(负号)、~
- *、/、%
- +(加)、+(字符串串联)、-(减号)
- 关系运算符
- ^(按位异或)、&(按位与)、|(按位或)
- NOT
- AND
- ALL 、ANY 、BETWEEN、 IN 、LIKE、 OR 、SOME
- 赋值运算符
一个众所周知的小技巧:
使用小括号可以改变运算的优先顺序。
7.6. 表达式
一个表达式可以是一个或一个以上的字段、函数、运算符、局部变量、常量、子查询的组合。
7.7. 如何为程序加上注释
单行注释与行内注释
--档案名称: Demo824.sql
--撰写人:温一军
--日期:
--设定作用资料库
USENorthwindSQL
--列出资讯部的员工资料
SELECT* FROM 飞狐工作室 WHERE 部门 = '资讯部'
--档案名称: Demo825.sql
--设定作用资料库
USENorthwindSQL
--列出资讯部的员工资料
SELECT姓名,
电话号码,
部门,
年龄 = DATEDIFF(year,出生日期,GETDATE())
--此运算式能计算出年龄
FROM 飞狐工作室
--不列出财务部的员工资料
WHERE 部门 <> '财务部'
ORDER BY 4 DESC --按照年龄高低来排序
段落注释
/*
档案名称:Demo826.sql
系统属性:Database Web
撰写人: 温一军
日期:
*/
/* 设定作用资料库 */
USENorthwindSQL
/* 列出资讯部的员工资料 */
SELECT* FROM 飞狐工作室 WHERE 部门 = '资讯部'
7.8. 函数
- 函数(Function)被用来执行一些特殊的运算。
- 每一函数包含一个名称,而在名称之后的是一对小括号。如GETDATE()
- 大部分的函数在小括号中需要一个或一个以上的参数。
一个狠恰当的比喻:
一个函数象一个自动售货机,机身象是函数本身,投币口是函数的一对小括号,投入到自动售货机的钱币就是传递给函数的参数,从自动售货机吐出的饮料是函数的返回值。
字符串函数
- LEN( )
格式:LEN(字符串)
用途:取得字符串的长度(先除去字符串尾部的空格),如果是空字符串,则返回零。
/*档案名称: Demo831.sql*/
SELECTLEN('我叫ALEX')
SELECTLEN('我叫ALEX ')
SELECTLEN('')
DECLARE@vlString1 nvarchar(10)
DECLARE@vlString2 nvarchar(16)
SET@vlString1 = '我是温一军'
SET@vlString2 = 'My name is Alex. '
SELECTLEN(@vlString1 + @vlString2)
- SUBSTRING( )
格式:SUBSTRING(字符串,开始位置,长度)
用途:从指定的字符串的开始位置开始,获取指定长度的字符串。
/*档案名称: Demo828.sql*/
USENorthwindSQL
--建立一个资料表
CREATE TABLEDemoTable
(
uid int IDENTITY(1,1),
content ntext
)
--新增资料记录至资料表
INSERT INTODemoTable
(content)
VALUES(N'ABC我是ALEX章立民')
INSERT INTODemoTable
(content)
VALUES(N'123我爱Internet')
SELECT SUBSTRING(content,3,5)
FROMDemoTable
--返回:
--C我是AL
--3我爱IN
DROP TABLEDemoTable
/*档案名称: Demo829.sql*/
USENorthwindSQL
--建立一个资料表
CREATETABLE DemoTable
(
uidint IDENTITY(1,1),
contenttext
)
--新增资料记录至资料表
INSERT INTODemoTable
(content)
VALUES('ABC我是ALEX章立民')
INSERT INTODemoTable
(content)
VALUES('123我爱Internet')
SELECT uid,SUBSTRING(content,3,5)
FROMDemoTable
--返回:
--C我是
--3我爱
DROP TABLEDemoTable
此处省略了一些常用函数的介绍
无参数函数
特点:
- 名称以@@开头
- 不需要任何参数,函数名之后不需要加上一对小括号
如:@@ROWCOUNT
从形式上看,象一个变量,在7.0版之前,称之为全局变量,从7.0版开始,称之为函数,常用它来取得一些系统信息。
/*档案名称: Demo853.sql*/
USENorthwindSQL
SELECT* FROM 飞狐工作室
SELECT'查询的资料笔数:',@@ROWCOUNT
UPDATE飞狐工作室 SET 姓名 = '章立民' WHERE 身份证字号 = 'Z00990000'
SELECT'姓名被修改的资料笔数:',@@ROWCOUNT
7.9. 流程控制语句
BEGIN…END
用于将多个SQL语句组合成一个语句块,该语句块可视为一个整体处理。
/*档案名称: Demo854.sql*/
USE NorthwindSQL
Declare @Today int
SET @Today = DAY(GETDATE())
IF(@Today = 1) --如果今天是本月 1 号
BEGIN
PRINT '今天将举办庆生会,本月寿星如下:'
SELECT 姓名,出生日期
FROM 飞狐工作室
WHERE MONTH(出生日期) = MONTH(GETDATE())
END
/*档案名称: Demo855.sql*/
USENorthwindSQL
IF(SELECTCOUNT(*) FROM 飞狐工作室 WHERE 性别 = 1) > 0
BEGIN
PRINT '男性员工的平均薪资:'
PRINT ''
SELECT AVG(目前薪资) FROM飞狐工作室 WHERE 性别 = 1
IF (SELECT COUNT(*) FROM 飞狐工作室
WHERE性别 = 1 AND 婚姻状况= 1)> 0
BEGIN
PRINT '已婚之男性员工的平均薪资:'
PRINT ''
SELECTAVG(目前薪资) FROM 飞狐工作室
WHERE性别 = 1 AND 婚姻状况 = 1
END
END
循环WHILE
- 用于重复多次执行某项工作
- 可用CONTINUE使程序直接跳回WHILE命令行做条件判断
- 可用BREAK命令,直接退出所在循环。
- 循环可以嵌套
/*档案名称: Demo856.sql*/
DECLARE@Number int, @Total int
SET@Number = 0
SET@Total = 0
WHILE (@Number < 11)
BEGIN
SET @Total = @Total + @Number
SET @Number = @Number + 1
END
PRINT'1+2+...+10 = '+CAST(@Total AS char(2))
/*档案名称: Demo858.sql*/
EXECsp_dboption 'NorthwindSQL', 'select into/bulkcopy', 'TRUE'
--当为 true 时,允许使用SELECT INTO 语句进行快速大容量复制。
--select into/bulkcopy 选项设置为真以启用无日志记录的操作
USENorthwindSQL
--建立一个新的资料表TempTable 以利稍后练习之用
SELECT 身份证字号,姓名,目前薪资
INTOTempTable
FROM 飞狐工作室
EXECsp_dboption 'NorthwindSQL', 'select into/bulkcopy', 'FALSE'
PRINT''
SELECT 未加薪前员工的平均薪资 = AVG(目前薪资) FROMTempTable
--如果平均薪资小于 $70000, 则全体加薪 1.2 倍
WHILE (SELECT AVG(目前薪资) FROM TempTable) < $70000
BEGIN
UPDATE TempTable
SET 目前薪资 = 目前薪资 * 1.2
SELECT 最高薪 = MAX(目前薪资)FROM TempTable
-- 如果最高薪大于 $150000 ,则不再全体加薪
IF (SELECT MAX(目前薪资) FROM TempTable) > $150000
BREAK
ELSE
CONTINUE
END
PRINT''
SELECT全体加薪后员工的平均薪资 =AVG(目前薪资) FROMTempTable
--将练习用的资料表 TempTable删除
DROP TABLE TempTable
条件语句IF…ELSE
该语句使程序能够有不同的条件分支,从而完成在不同的条件下执行不同的操作。
/*档案名称: Demo859.sql*/
USENorthwindSQL
-- 先检查名称为 MyDemoTable 的使用者资料表是否存在
IF EXISTS (SELECT * FROM sysobjects
WHERE type = 'U' AND name = 'MyDemoTable')
DROP TABLE MyDemoTable
CREATETABLE MyDemoTable
(
代码 int NOT NULLIDENTITY(1,1),
姓名 nvarchar(20)NOT NULL
)
/*档案名称: Demo860.sql*/
USENorthwindSQL
DECLARE@Name varchar(10),
@Sex bit,
@Married bit,
@Phone char(10),
@ChineseSex char(2),
@ChineseMarried char(4)
DECLARE Studio_Cursor CURSOR FOR //声明一个游标
SELECT 姓名, 性别, 婚姻状况, 电话号码 FROM 飞狐工作室
OPEN Studio_Cursor //有关游标操作,以后讲解
FETCH NEXT FROMStudio_Cursor //取下一行值
INTO@Name, @Sex, @Married, @Phone
--检查 @@FETCH_STATUS 之值以便决定是否
--要继续执行循环以便提取更多的资料记录
WHILE @@FETCH_STATUS= 0
BEGIN
PRINT '员工姓名: ' + @Name
IF (@Sex = 1)
SET @ChineseSex = '男'
ELSE
SET @ChineseSex = '女'
IF (@Married = 1)
SET @ChineseMarried = '已婚'
ELSE
SET @ChineseMarried = '未婚'
PRINT'性 别: ' + @ChineseSex
PRINT '婚姻状况: ' + @ChineseMarried
PRINT '电话号码: ' + @Phone
PRINT REPLICATE('-',30)
FETCH NEXT FROM Studio_Cursor
INTO @Name, @Sex, @Married, @Phone
END
CLOSE Studio_Cursor
DEALLOCATEStudio_Cursor //释放游标
/*档案名称: Demo861.sql*/
USENorthwindSQL
DECLARE@msg varchar(255)
IF (SELECT COUNT(*)FROM 飞狐工作室
WHERE 姓名 LIKE '许%'AND 目前薪资 BETWEEN 15000AND 20000) > 0
BEGIN
SET NOCOUNT ON
SET @msg = '有一些 ''许'' 姓员工的薪资介于 15000 ~ 20000。这些员工是:'
PRINT @msg
PRINT REPLICATE('-',40)
SELECT 姓名,目前薪资 FROM 飞狐工作室
WHERE 姓名 LIKE '许%'AND 目前薪资 BETWEEN 15000AND 20000
END
ELSE
BEGIN
SET @msg = '没有任何 ''许'' 姓员工的薪资介于 15000 ~ 20000。'
PRINT @msg
END
/*档案名称: Demo862.sql*/
USENorthwindSQL
DECLARE@Name varchar(10),
@Salary money,
@Comment varchar(20)
DECLARE Studio_Cursor CURSOR FOR
SELECT 姓名, 目前薪资FROM 飞狐工作室
OPENStudio_Cursor
FETCH NEXT FROM Studio_Cursor
INTO@Name, @Salary
--检查 @@FETCH_STATUS 之值以便决定是否
--要继续执行回圈以便提取更多的资料记录
WHILE @@FETCH_STATUS= 0
BEGIN
PRINT '员工姓名: ' + @Name
PRINT '目前薪资: ' + CONVERT(varchar(10),@Salary,1)
IF (@Salary >= 60000)
SET @Comment = '哇塞!!超越巅峰耶..'
ELSE
IF (@Salary >= 50000)
SET @Comment = '领先群雄耶...'
ELSE
IF (@Salary >= 40000)
SET @Comment = '还过得去啦!!'
ELSE
IF (@Salary >= 20000)
SET @Comment = '剃刀编缘!!'
ELSE
SET @Comment = '准备卷铺盖吧!!'
PRINT '薪资评比: ' + @Comment
PRINT REPLICATE('-',30)
FETCH NEXT FROM Studio_Cursor
INTO @Name, @Salary
END
CLOSEStudio_Cursor
DEALLOCATEStudio_Cursor
CASE函数
- 简单CASE函数
/*档案名称: Demo863.sql*/
DECLARE@nType int
SET@nType = 1
SELECT CASE @nType
WHEN 1THEN '资讯部'
WHEN 2THEN '生产制造部'
WHEN 3THEN '会计部'
WHEN 4THEN '业务部'
ELSE '设立中...'
END
/*档案名称: Demo864.sql*/
USENorthwindSQL
SELECT姓名,
性别 = CASE 性别
WHEN 0 THEN '女'
WHEN 1 THEN '男'
END,
婚姻 = CASE 婚姻状况
WHEN 0 THEN '未婚'
WHEN 1 THEN '已婚'
END,
电话号码,住址
FROM 飞狐工作室
/*档案名称: Demo865.sql*/
USEpubs
SELECT姓名 = au_fname + ' ' + au_lname,
州名 = CASE state //蓝色字指定列标题文字
WHEN 'CA' THEN '
WHEN 'KS' THEN '
WHEN 'TN' THEN '
WHEN 'OR' THEN '
WHEN 'MI' THEN '
WHEN 'IN' THEN '
WHEN 'MD' THEN '
WHEN 'UT' THEN '
END
FROMauthors
ORDERBY au_lname
- 搜索型CASE函数
/*档案名称:Demo866.sql 给各等级的薪资一个评语*/
USENorthwindSQL
SELECT姓名,
目前薪资,
评价 = CASE
WHEN (目前薪资 >= 60000) THEN '哇塞!!超越巅峰耶..'
WHEN (目前薪资 >= 50000) THEN '领先群雄耶...'
WHEN (目前薪资 >= 40000) THEN '还过得去啦!!'
WHEN (目前薪资 >= 20000) THEN '剃刀编缘!!'
ELSE '准备卷铺盖吧!!'
END
FROM 飞狐工作室
/*档案名称:Demo867.sql 计算出不同的等级的薪资应该缴纳的税额*/
USENorthwindSQL
SELECT姓名,
目前薪资,
应缴税额 =目前薪资 * CASE
WHEN (目前薪资 >= 60000) THEN 0.35
WHEN (目前薪资 >= 50000) THEN 0.25
WHEN (目前薪资 >= 40000) THEN 0.2
WHEN (目前薪资 >= 20000) THEN 0.15
ELSE 0.01
END
FROM 飞狐工作室 ORDER BY 目前薪资DESC
RETURN命令
Return命令能够无条件地终止一个查询、存储过程或批处理,在存储过程中,可以使用return将数据返回给调用调用者。
/*档案名称:Demo870.sql 定义一个存储过程,返回三个数的积*/
USENorthwindSQL
GO
CREATE PROCEDURE MultipleTwoValue @Number1 int,
@Number2 int,
@Number3 int
AS
RETURN@Number1 * @Number2 * @Number3
/*档案名称: Demo871.sql*/
USENorthwindSQL
DECLARE @CountResultint
//调用存储过程,取得返回值
EXECUTE @CountResult= MultipleTwoValue 19,34,39
//显示该返回值
SELECT'19 乘 34 乘 39 = ',@CountResult
|
第7章 结束 |
浙公网安备 33010602011771号