MSSQL扫盲系列(5)-常量,变量,运算符,流程控制
常量
View Code
--MSSQL支持多种常量类型,常量可以直接使用
SELECT 'ABCDabc012!@#$',--字符串常量,''两个单引号
N'物华天宝,龙光射牛斗之墟;人杰地灵,徐孺下陈蕃之榻',--UNICODE常量
0,--或1,BIT型常量,为特殊的INT常量
0x0001111,--二进制常量
12212,--INT常量
'2012-12-22',--日期常量
12.222,--DECIMAL常量
101.2e5,--REAL或FLOAT常量
$12.23,¥189.52,€45.1,--MONEY常量
'{9EF2B9F4-4311-4e3a-BE3A-7FA8800BA4D0}'--UNIQUEIDENETIFIER常量GUID
变量
View Code
--变量,使用DECLARE 定义
--一个@表示本地变量,两个@表示全局变量
--对全局变量,要谨慎使用,因为它是在服务器级定义的,不是在用户程序域
DECLARE @I INT,--定义一个本地的INT型变量
@S NVARCHAR(100),--定义一个长度为100的本地NVARCHAR变量,
--和CHAR,VARCHAR,NCAHR都是能指定列宽
@D DATETIME,--本地
@M MONEY,--货币值常量
@DE DECIMAL(12),--能指定列宽
@R REAL,--实数
@B BINARY(128),--能指定列宽
@U UNIQUEIDENTIFIER--GUID
--表变量
DECLARE @T TABLE (ROWID INT,NAME NVARCHAR(100))
--定义一个包含两个字段的本地表变量
--临时表和表变量的选择,一般是
--行数较少的情况下(小于1000行)可以使用表变量
--行数很多(有几万行),则使用临时表
--常用的全局变量
SELECT @@IDENTITY, --最后一次插入的标识值,这个用的很多
@@ROWCOUNT,--受上一个SQL语句影响的行数
@@ERROR,--最后一个T-SQL错误的错误号,异常中会使用
@@TRANCOUNT,--当前连接打开地事务数
@@MAX_CONNECTIONS,--可以创建最大连接的数目
@@SERVERNAME,--本地服务器地名称
@@SERVICENAME--服务器上服务的名称
运算符
View Code
--赋值运算符=
DECLARE @N INT
SET @N=@@ERROR
--或
SELECT @N=@@ERROR
--位运算符
SELECT 2&4,--按位或 0010&0100=0000
2|4,--按位与 0010|0100=0110
2^4--按位互斥 0010^0100=0110
---比较运算符,逻辑运算符,各个优先级如下
--=,>,<,>=,<=,<>,!=,!>,!<
--NOT,AND,OR
IF NOT 1=1 AND 2>1 OR 3<4 OR
5>=5 OR 6<=7 OR 4<>4 OR
7!=4 OR 4!>2 OR 4!<2
PRINT 'Hello T-Sql world'
--放个重要的东西,SQL2005运算符优先级
/*
(1)括号:();
(2)乘、除、求模运算符:*,/,%;
(3)加减运算符:+,-;
(4)比较运算符:=,>,<,>=,<=,<>,!=,!>,!<;
(5)位运算符:^,&,|;
(6)逻辑运算符:NOT;
(7)逻辑运算符:AND;
(8)逻辑运算符:OR。
*/
流程控制
IF..ELSE(求最大数)
View Code
--求两个INT变量中较大的那个
DECLARE @A INT ,@B INT
SET @A=45
SET @B=56
DECLARE @T INT
IF @A>@B
SET @T=@A
ELSE
SET @T=@B
SELECT @T
CASE(显示简称和性别)
View Code
--姓名简称和性别
CREATE TABLE # (NAME NVARCHAR(4) NOT NULL,
GENDER BIT NOT NULL,
SALARY MONEY NOT NULL,
[MONTH] DATETIME NOT NULL)
INSERT # VALUES('韩菱纱',0,¥3500,'2012-1-1')
INSERT # VALUES('韩菱纱',0,¥3000,'2012-2-1')
INSERT # VALUES('韩菱纱',0,¥4500,'2012-3-1')
INSERT # VALUES('云天河',1,¥2500,'2012-1-1')
INSERT # VALUES('云天河',1,¥2000,'2012-2-1')
INSERT # VALUES('云天河',1,¥2100,'2012-3-1')
INSERT # VALUES('柳梦璃',0,¥3200,'2012-1-1')
INSERT # VALUES('柳梦璃',0,¥3100,'2012-2-1')
INSERT # VALUES('柳梦璃',0,¥3800,'2012-3-1')
INSERT # VALUES('慕容紫英',1,¥3000,'2012-1-1')
INSERT # VALUES('慕容紫英',1,¥2900,'2012-2-1')
INSERT # VALUES('慕容紫英',1,¥2700,'2012-3-1')
SELECT CASE
WHEN NAME='韩菱纱' THEN '纱纱'
WHEN NAME='云天河' THEN '天河'
WHEN NAME='柳梦璃' THEN '梦璃'
WHEN NAME='慕容紫英' THEN '小紫英'
ELSE '' END SHORTNAME,
CASE
WHEN GENDER=0 THEN '女'
WHEN GENDER=1 THEN '男'
ELSE '' END GENDER,
SALARY,MONTH([MONTH]) [MONTH] FROM #
DROP TABLE #
WHILE(SQL版的斐波那契数)
View Code
--求斐波那契数
DECLARE @N INT, --要求是第几个数
@CN INT,--当前第几个数
@L INT,--前一个数
@P INT,--前第二个数
@C INT--当前数
SET @N=10--求第十个数
SET @CN=3--从第三位开始算,1和2都是1
SET @L=1--第一个数是1
SET @P=1--第二个数是1
SET @C=1
IF @N=1 OR @N=2
SET @C=1
ELSE
WHILE 1=1--这里最简单的写法是@CN<@N
--为了让后面的CONTINUE和BREAK起作用
BEGIN
SET @C=@L+@P--当前数为前两个数的和
SET @P=@L--将前一位赋给前第二个数
SET @L=@C--将当前数赋给前一位
SET @CN=@CN+1
IF @CN<=@N
CONTINUE
ELSE
BREAK
END
SELECT @C