----------------------
ASP.Net+Android+IO开发S、
.Net培训、期待与您交流! ----------------------
数据排序
DATEDIFF ( datepart , startdate , enddate )
DATENAME(datepart,date)
其中参数date为待计算日期,date 参数也可以是日期格式的字符串;参数datepart指定要返回的日期部分的参数,其可选值同上图
DATEPART (datepart,date)
其中参数date为待计算日期,date 参数也可以是日期格式的字符串;参数datepart指定要返回的日期部分的参数,其可选值同上图
如果两个表达式不等价,则 NULLIF 返回第一个 expression1的值。如果两个表达式等价,则 NULLIF 返回第一个 expression1类型的空值。也就是返回类型与第一个 expression 相同
CASE函数还提供了第二种用法,其语法如下:
式从前向后进行测试,如果条件condition1为真则返回returnvalue1,否则如果条件condition2
为真则返回returnvalue2,否则如果条件condition3为真则返回returnvalue3,……
用来计算字符串中指定表达式的开始位置,它返回指定表达式中模式'%pattern%'第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零。在模式中可以使用通配符
是返回 1;否则,返回 0,expression参数为要验证其是否为日期的表达式。expression可以是 text、ntext 表达式和 image 表达式以外的任意表达式,可以隐式转换为 nvarchar
用来确定表达式是否为有效的数值类型。如果输入表达式的计算值为有效的整数、浮点数、money 或 decimal 类型时,ISNUMERIC 返回 1;否则返回 0
expression参数为要计算的表达式
前言:sql语句比较多,所以分为 入门和提高 两个部分来写,可通过目录快速查阅
SQL语句入门
1.数据表的管理
1)创建数据表
CREATE TABLE T_Person
(
FName VARCHAR(20),
FAge INT
)
2)定义非空约束
CREATE TABLE T_Student
(
FNumber VARCHAR(20) NOT NULL ,
FName VARCHAR(20) NOT NULL ,
FAge INT NOT NULL ,
FFavorite VARCHAR(20),
FPhoneNumber VARCHAR(20)
)
3)定义默认值
CREATE TABLE T_Teacher
(
FNumber VARCHAR(20),
FName VARCHAR(20),
FAge INT,
FISMaster VARCHAR(5) DEFAULT 'NO'
)
4)定义主键
CREATE TABLE T_Bus
(
FNumber VARCHAR(20),
FDriverName VARCHAR(20),
FUsedYears INT,
PRIMARY KEY (FNumber)
)
5)定义外键
CREATE TABLE T_Department
(FId VARCHAR(20),
FName VARCHAR(20),
FLevel INT,
PRIMARY KEY (FId)
)
6)修改已有数据表
ALTER TABLE T_PERSON ADD FFavorite VARCHAR(20)
ALTER TABLET_Person DROP FAge
7)删除数据表
DROP TABLE T_Person
2.数据的增删改
1)数据的插入
简单INSERT语句
INSERT INTO T_Person(FName,FAge,FRemark) VALUES('Jim',20,'USA');
简化的INSERT语句
--某些字段没有值,可以忽略这些字段
INSERT INTO T_Person(FAge,FName) VALUES(22,'LXF')
--可以不用指定要插入的表列,这种情况下将按照定义表中字段顺序来进行插入(不推荐)
INSERT INTO T_Person VALUES('luren1',23,'China')
非空约束对数据插入的影响
--对一个字段添加了非空约束,那么我们是不能向这个字段中插入NULL值的
--T_Debt表的FAmount字段是有非空约束的
INSERT INTO T_Debt (FNumber, FPerson) VALUES ('1', 'Jim')
错误信息: 不能将值 NULL 插入列 'FAmount',表 'demo.dbo.T_Debt';列不允许有空值。INSERT 失败。
主键对数据插入的影响
--T_Debt表中FNumber字段是主键,已经向表中插入了一条FNumber字段为1的记录
INSERT INTO T_Debt (FNumber,FAmount, FPerson) VALUES ('1',300, 'Jim')
错误信息: 不能在对象 'dbo.T_Debt' 中插入重复键。
外键对数据插入的影响
--T_Debt表中FPerson字段是指向表T_Person的FName字段的外键,在T_Person表中不存在FName字段等于“Jerry”的数据行
INSERT INTO T_Debt (FNumber,FAmount, FPerson) VALUES ('3',100, 'Jerry')
错误信息: INSERT 语句与 FOREIGN KEY 约束"FK__T_Debt__FPerson__1A14E395"冲突。该冲突发生于数据库"demo",表"dbo.T_Person", column 'FName'。
2)数据的更新
简单的数据更新
--将表T_Person中所有人员的FREMARK字段值更新为“SuperMan”:
UPDATE T_Person SET FRemark = 'SuperMan'
--将所有人员的FRemark字段更新为“Sonic”,并且将年龄更新为25:
UPDATE T_Person SET FRemark = 'Sonic', FAge=25
带WHERE子句的UPDATE语句
--将Tom 的年龄修改为12 岁
UPDATE T_Person SET FAge = 12 WHERE FNAME='Tom'
--将FNAME等于’Jim’或者’LXF’的行的FAge字段更新为22
UPDATE T_Person SET FAge = 22 WHERE FName ='jim' OR FName='LXF'
非空约束对数据更新的影响
--T_Debt表的FAmount字段是有非空约束的
UPDATE T_Debt set FAmount = NULL WHERE FPerson='Tom'
错误信息:不能将值 NULL 插入列 'FAmount',表 'demo.dbo.T_Debt';列不允许有空值。UPDATE 失败。
主键对数据更新的影响
--T_Debt表中FNumber字段是主键,表中已经存在一条FNumber字段为2的记录
UPDATE T_Debt set FNumber = '2' WHERE FPerson='Tom'
错误信息: 违反了 PRIMARY KEY 约束 'PK__T_Debt__1920BF5C'。不能在对象 'dbo.T_Debt' 中插入重复键。
外键对数据更新的影响
--T_Debt表中FPerson字段是指向表T_Person的FName字段的外键,在T_Person表中不存在FName字段等于“Merry”的数据行
UPDATE T_Debt set FPerson = 'Merry' WHERE FNumber='1'
错误信息: UPDATE 语句与 FOREIGN KEY 约束"FK__T_Debt__FPerson__1A14E395"冲突。该冲突发生于数据库"demo",表"dbo.T_Person", column 'FName'。
3)数据的删除
简单的数据删除--T_Debt表中FPerson字段是指向表T_Person的FName字段的外键
DELETE FROM T_Debt;
DELETE FROM T_Person;
带WHERE子句的DELETE语句
--删除年龄大于20岁或者来自火星(Mars)的人员,使用带复合逻辑WHERE子句
DELETE FROM T_Person WHERE FAge > 20 or FRemark = 'Mars'
3.数据的检索
1)SELECT基本用法
检索所有列SELECT * FROM T_Employee
检索指定列
SELECT FNumber FROM T_Employee
列别名
SELECT FNumber AS Number,FName AS Name,FAge AS Age,FSalary AS Salary FROM T_Employee
按条件过滤
SELECT FName FROM T_Employee WHERE FSalary<5000
SELECT * FROM T_Employee WHERE FSalary<5000 OR FAge>25
数据汇总
--查询年龄大于25岁的员工的最高工资
SELECT MAX(FSalary) as MAX_SALARY FROM T_Employee WHERE FAge>25
--统计一下工资大于3800元的员工的平均年龄
SELECT AVG(FAge) FROM T_Employee WHERE FSalary>3800
--统计一下公司每个月应支出工资总额
SELECT SUM(FSalary) FROM T_Employee
--FNumber为IT002的行的FName字段是空值
SELECT COUNT(*),COUNT(FNumber),COUNT(FName) FROM T_Employee
执行结果:9 9 8
SELECT * FROM T_Employee ORDER BY FAge DESC,FSalary DESC
--WHERE 应在ORDER BY之前
SELECT * FROM T_Employee WHERE FAge>23 ORDER BY FAge DESC,FSalary DESC
2)高级数据过滤
单字符匹配
--检索以任意字符开头,剩余部分为“erry”
SELECT * FROM T_Employee WHERE FName LIKE '_erry'
多字符匹配
--检索姓名中包含字母“n”的员工信息
SELECT * FROM T_Employee WHERE FName LIKE '%n%'
--检索姓名最后一个字符为任意字符、倒数第二个字符为“n”、长度任意的字符串
SELECT * FROM T_Employee WHERE FName LIKE '%n_'
集合匹配
--检索FName字段以“S”或者“J“开头长度,长度任意
SELECT * FROM T_Employee WHERE FName LIKE '[SJ]%'
SELECT * FROM T_Employee WHERE FName LIKE 'S%' OR FName LIKE 'J%'
--检索FName字段不以“S”或者“J“开头长度,长度任意
SELECT * FROM T_Employee WHERE FName LIKE '[^SJ]%'
SELECT * FROM T_Employee WHERE NOT(FName LIKE 'S%') AND NOT(FName LIKE 'J%')
空值检测
SELECT * FROM T_Employee WHERE FNAME=null
SELECT * FROM T_Employee WHERE FNAME IS NULL
SELECT * FROM T_Employee WHERE FNAME IS NOT NULL
--查询所有姓名已知且工资小于5000的员工信息
SELECT * FROM T_Employee WHERE FNAME IS NOT NULL AND FSalary <5000
反义运算符
SELECT * FROM T_Employee WHERE FAge!=22 AND FSALARY!<2000
SELECT * FROM T_Employee WHERE FAge<>22 AND FSALARY>=2000
SELECT * FROM T_Employee WHERE NOT(FAge=22) AND NOT(FSALARY<2000)
多值检测
SELECT FAge,FNumber,FName FROM T_Employee WHERE FAge=23 OR FAge=25 OR FAge=28
SELECT FAge,FNumber,FName FROM T_Employee WHERE FAge IN (23,25,28)
范围值检测
SELECT * FROM T_Employee WHERE FAGE IN(23,24,25,26,27)
SELECT * FROM T_Employee WHERE FAGE>=23 AND FAGE <=27
SELECT * FROM T_Employee WHERE FAGE BETWEEN 23 AND 27
SELECT * FROM T_Employee WHERE (FSalary BETWEEN 2000 AND 3000) OR (FSalary BETWEEN 5000 AND 8000)
低效的“WHERE 1=1” ,其实使用这种用法的开发人员一般都是在使用动态组装的SQL
3)数据分组
数据分组入门
--查看公司员工有哪些年龄段
SELECT FAge FROM T_Employee GROUP BY FAge
--GROUP BY子句必须放到WHERE语句的之后
SELECT FAge FROM T_Employee WHERE FSubCompany = 'Beijing' GROUP BY FAge
--需要分组的所有列都必须位于GROUP BY子句的列名列表中,也就是没有出现在GROUP BY子句中的列(聚合函数除外)是不能放到SELECT语句后的列名列表中的
SELECT FAge,AVG(FSalary) FROM T_Employee GROUP BY FAge
--逐层分组,公司的所有部门情况
SELECT FSubCompany,FDepartment FROM T_Employee GROUP BY FSubCompany,FDepartment
数据分组与聚合函数
--查看每个年龄段的员工的人数
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge
--统计每个分公司的年龄段的人数
SELECT FSubCompany,FAge,COUNT(*) AS CountOfThisSubCompAge FROM T_Employee GROUP BY FSubCompany,FAge
--按照FSubCompany字段进行排序
SELECT FSubCompany,FAge,COUNT(*) AS CountOfThisSubCompAge FROM T_Employee GROUP BY FSubCompany,FAge ORDER BY FSubCompany
--SUM、AVG、MIN、MAX也在分组中使用
SELECT FSubCompany,SUM(FSalary) AS FSalarySUM FROM T_Employee GROUP BY FSubCompany
SELECT FDepartment,AVG(FSalary) AS FSalarySUM FROM T_Employee GROUP BY FDepartment
SELECT FDepartment,MIN(FAge) AS FAgeMIN,MAX(FAge) AS FAgeMAX FROM T_Employee GROUP BY FDepartment
HAVING 语句
--只检索人数多余1个的年龄段,GROUP BY子句要位于HAVING子句之后,HAVING语句中不能包含未分组的列名
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*)>1
4)限制结果集行数
--SQLServer2000,检索从第5行开始的10条数据
SELECT top 3 * FROM T_Employee WHERE FNumber NOT IN
(SELECT TOP 5 FNumber FROM T_Employee ORDER BY FSalary DESC)
ORDER BY FSalary DESC
--SQLServer2005,检索从第5行开始的10条数据
SELECT * FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY FSalary DESC) AS rownum,
FNumber,FName,FSalary,FAge FROM T_Employee
) AS a
WHERE a.rownum>=5 AND a.rownum<=10
5)抑制数据重复
--DISTINCT是对整个结果集进行数据重复抑制的,而不是针对每一个列
SELECT DISTINCT FDepartment,FSubCompany FROM T_Employee
6)计算字段
常量字段
SELECT 'CowNew集团',918000000,FName,FAge,FSubCompany FROM T_Employee
字段间计算
SELECT FNumber,FName,FAge * FSalary AS FSalaryIndex FROM T_Employee
SELECT 125+521,FNumber,FName,FSalary/(FAge-21) AS FHappyIndex FROM T_Employee
SELECT * FROM T_Employee WHERE FSalary/(FAge-21)>1000
数据处理函数
--计算每一个名称不为空的员工的名字以及名字的长度
SELECT FName, LEN(FName) AS namelength FROM T_Employee WHERE FName IS NOT NULL
--取得每一个名称不为空的员工的名字以及名字中从第二个字符开始、长度为3的字串
SELECT FName, SUBSTRING(FName,2,3) FROM T_Employee WHERE FName IS NOT NULL
--计算“年龄的正弦函数值的绝对值”时使用嵌套函数
SELECT FName,FAge, SIN(FAge) , ABS(SIN(FAge)) FROM T_Employee
字符串的拼接
--SQLServer中可以直接使用加号“+”来拼接字符串
SELECT '工号为'+FNumber+'的员工姓名为'+Fname FROM T_Employee WHERE FName IS NOT NULL
7)组合查询
UNION--每个结果集必须有相同的列数 --结果集的每个对应列的数据类型必须相同或者能够转换为同一种数据类型 --完全重复的数据行合并为了一条 SELECT FNumber,FName,FAge FROM T_Employee UNION SELECT FIdCardNumber,FName,FAge FROM T_TempEmployee
UNION ALL
--不消除完全重复的数据行
SELECT FNumber,FName,FAge FROM T_Employee
UNION ALL
SELECT FIdCardNumber,FName,FAge FROM T_TempEmployee
4.函数
1)数学函数
绝对值
SELECT FWeight - 50,ABS(FWeight - 50) , ABS(-5.38) FROM T_Person
求指数
--第一个参数为待求幂的表达式,第二个参数为幂
SELECT FWeight,POWER(FWeight,-0.5),POWER(FWeight,2), POWER(FWeight,3),POWER(FWeight,4) FROM T_Person
求平方根
SELECT FWeight,SQRT(FWeight) FROM T_Person
求随机数
--参数为随机数种子
SELECT RAND(9527)
舍入到最大整数
SELECT FName,FWeight, CEILING(FWeight), CEILING(FWeight*-1) FROM T_Person
舍入到最小整数
SELECT FName,FWeight,FLOOR(FWeight),FLOOR(FWeight*-1) FROM T_Person
四舍五入
--其中m为待进行四舍五入的数值,而d则为计算精度
SELECT ROUND(m,d)
求正弦值
SELECT FName,FWeight,SIN(FWeight) FROM T_Person
求余弦值
SELECT FName,FWeight, COS(FWeight) FROM T_Person
求反正弦值
SELECT FName,FWeight, ASIN(1/FWeight) FROM T_Person
求反余弦值
SELECT FName,FWeight, ACOS(1/FWeight) FROM T_Person
求正切值
SELECT FName,FWeight, TAN(FWeight) FROM T_Person
求反正切值
SELECT FName,FWeight, ATAN(FWeight) FROM T_Person
求2个变量的反正切
SELECT FName,FWeight, ATN2(FWeight,2) FROM T_Person
求余切
SELECT FName,FWeight, COT(FWeight) FROM T_Person
求圆周率π值
SELECT FName,FWeight,FWeight *PI() FROM T_Person
弧度制转换为角度制
SELECT FName,FWeight, DEGREES(FWeight) FROM T_Person
角度制转换为弧度制
SELECT FName,FWeight, RADIANS(FWeight) FROM T_Person
求符号
--如果数值大于0则返回1,如果数值等于0则返回0,如果数值小于0则返回-1
SELECT FName,FWeight-48.68,SIGN(FWeight-48.68) FROM T_Person
求整除余数
SELECT FName,FWeight,FWeight % 5 FROM T_Person
求自然对数
SELECT FName,FWeight, LOG(FWeight) FROM T_Person
求以10为底的对数
SELECT FName,FWeight, LOG10(FWeight) FROM T_Person
求幂
--OWER(X,Y)函数用来计算X的Y次幂。
SELECT FName,FWeight, OWER(1.18,FWeight) FROM T_Person
2)字符串函数
计算字符串长度SELECT FName, LEN(FName) FROM T_Person
字符串转换为小写
SELECT FName, LOWER(FName) FROM T_Person
字符串转换为大写
SELECT FName, UPPER(FName) FROM T_Person
截去字符串左侧空格
SELECT FName,LTRIM(FName),LTRIM(' abc ') FROM T_Person
截去字符串右侧空格
SELECT FName,RTRIM(FName),RTRIM(' abc ') FROM T_Person
截去字符串两侧的空格
SELECT FName,LTRIM(RTRIM(FName)),LTRIM(RTRIM(' abc ')) FROM T_Person
取子字符串
SELECT FName, SUBSTRING(FName,2,3) FROM T_Person
计算子字符串的位置
SELECT FName,CHARINDEX(FName,'m'), CHARINDEX(FName,'ly') FROM T_Person
从左侧开始取子字符串
SELECT FName, LEFT(FName,3) , LEFT(FName,2) FROM T_Person
从右侧开始取子字符串
SELECT FName, RIGHT(FName,3) , RIGHT(FName,2) FROM T_Person
字符串替换
--REPLACE(string,string_tobe_replace,string_to_replace) ,其中参数string为要进行替换操作的主字符串,参数string_tobe_replace为要被替换的字符串,而string_to_replace将替换string_tobe_replace中所有出现的地方
select FName,REPLACE(FName,'i','e'),FIDNumber,REPLACE(FIDNumber,'2345','abcd') FROM T_Person
--来将FName中的m以及FIDNumber中的123删除
SELECT FName, REPLACE(FName,'m','') ,FIDNumber,REPLACE(FIDNumber,'123','') FROM T_Person
--删除字符串中间的空格,也就是用空字符串替换中所有的空格
SELECT REPLACE(' abc 123 wpf',' ','') , REPLACE(' ccw enet wcf f',' ','')
得到字符的ASCII码
--来计算每个员工姓名的第一个字符的ASCII码
SELECT FName, LEFT(FName,1) , ASCII( LEFT(FName,1) ) ,ASCII(FName) FROM T_Person
得到一个ASCII码数字对应的字符
SELECT CHAR(56) , CHAR(90) ,'a', CHAR( ASCII('a') )
发音匹配度
SELECT SOUNDEX('jack') , SOUNDEX('jeck') , SOUNDEX('joke') ,SOUNDEX('juke') , SOUNDEX('look') , SOUNDEX('jobe')
--计算每个人的姓名发音与“Merry”的相似度
SELECT DIFFERENCE(FName,'Merry') FROM T_Person
--查询和“Tim” 发音相似度大于3的员工:
SELECT * FROM T_Person WHERE DIFFERENCE(FName,'Tim')>=3
3)日期时间函数
取得当前日期时间
SELECT GETDATE() as 当前日期时间
SELECT CONVERT(VARCHAR(50) ,GETDATE( ), 101) as 当前日期
日期增减
DATEADD (datepart , number, date )
参数date制定了用于与 datepart 相加的值,如果指定了
非整数值,则将舍弃该值的小数部分;参数datepart指定要返回新值的日期的组成部分,下表列出了 Microsoft SQL Server 2005 可识别的日期部分及其缩写:
参数date制定了用于与 datepart 相加的值,如果指定了
非整数值,则将舍弃该值的小数部分;参数datepart指定要返回新值的日期的组成部分,下表列出了 Microsoft SQL Server 2005 可识别的日期部分及其缩写:
--计算每个人出生后3年、20个季度、68个月以及1000个周前的日期
SELECT FBirthDay, DATEADD (YEAR ,3,FBirthDay) as threeyrs,
DATEADD(QUARTER ,20,FBirthDay) as ttqutrs,
DATEADD(MONTH ,68,FBirthDay) as sxtmonths,
DATEADD(WEEK, -1000,FBirthDay) as thweeik
FROM T_Person
计算日期差额
DATEDIFF ( datepart , startdate , enddate )
其中参数datepart为计算差额时使用的单位,可选同上图,
参数startdate为起始日期;参数enddate为结束日期
--计算注册日期和出生日期之间的周数差额
SELECT FRegDay,FBirthDay,DATEDIFF(WEEK, FBirthDay, FRegDay) FROM T_Person
计算一个日期是星期几
DATENAME(datepart,date)
其中参数date为待计算日期,date 参数也可以是日期格式的字符串;参数datepart指定要返回的日期部分的参数,其可选值同上图
--计算出生日期和注册日期各是星期几
SELECT FBirthDay,DATENAME(Weekday,FBirthDay), FRegDay,DATENAME(DW, FRegDay) FROM T_Person
取得日期的指定部分
DATEPART (datepart,date)
其中参数date为待计算日期,date 参数也可以是日期格式的字符串;参数datepart指定要返回的日期部分的参数,其可选值同上图
--计算出生日期是当年第几天以及注册日期中的年份部分
SELECT FBirthDay, DATEPART(Dayofyear,FBirthDay), FRegDay, DATEPART(Year, FRegDay) FROM T_Person
4)其他函数
类型转换
CAST ( expression AS data_type)
CONVERT ( data_type, expression)
参数expression为待进行类型转换的表达式,而type为转换的目标类型
CONVERT ( data_type, expression)
参数expression为待进行类型转换的表达式,而type为转换的目标类型
--以整形、数值、日期时间类型为目标类型的数据转换:
SELECT
CAST('-30' AS INTEGER) as i,
CONVERT(DECIMAL,'3.1415726') as d,
CONVERT(DATETIME,'2008-08-08 08:09:10') as dt
空值处理:
1、COALESCE()函数
将会返回包括expression在内的所有参数中的第一个非空表达式。如果expression不为空值则返回expression;否则判断value1是否是空值,如果value1不为空值则返
回value1;否则判断value2是否是空值,如果value2不为空值则返回value3;……以此类推,如果所有的表达式都为空值,则返回NULL
回value1;否则判断value2是否是空值,如果value2不为空值则返回value3;……以此类推,如果所有的表达式都为空值,则返回NULL
SELECT FName,FBirthDay,FRegDay, COALESCE(FBirthDay,FRegDay,'2008-08-08') AS ImportDay FROM T_Person
2、ISNULL(expression,value)
--返回人员的“重要日期”,如果出生日期不为空则将出生日期做为“重要日期”,如果出生日期为空则返回NULL
SELECT FBirthDay,FRegDay, ISNULL(FBirthDay,FRegDay) AS ImportDay FROM T_Person
3、NULLIF ( expression1 , expression2 )
如果两个表达式不等价,则 NULLIF 返回第一个 expression1的值。如果两个表达式等价,则 NULLIF 返回第一个 expression1类型的空值。也就是返回类型与第一个 expression 相同
SELECT FBirthDay,FRegDay, NULLIF(FBirthDay,FRegDay) FROM T_Person
4、CASE“流程控制函数”
用法一:
CASE函数的语法如下:
如果expression等于value2则返回returnvalue2,expression等于value3则返回returnvalue3,……
以此类推,如果不符合所有的WHEN条件,则返回默认值defaultreturnvalue
CASE expression
WHEN value1 THEN returnvalue1
WHEN value2 THEN returnvalue2
WHEN value3 THEN returnvalue3
……
ELSE defaultreturnvalue
END
CASE函数对表达式expression进行测试,如果expression等于value1则返回returnvalue1,如果expression等于value2则返回returnvalue2,expression等于value3则返回returnvalue3,……
以此类推,如果不符合所有的WHEN条件,则返回默认值defaultreturnvalue
--1则是VIP客户,如果为2则是高级客户,如果为3则是普通客户
SELECT
FName,
(CASE FLevel
WHEN 1 THEN 'VIP客户'
WHEN 2 THEN '高级客户'
WHEN 3 THEN '普通客户'
ELSE '客户类型错误'
END) as FLevelName
FROM T_Customer
用法二 :
CASE函数还提供了第二种用法,其语法如下:
CASE
WHEN condition1 THEN returnvalue1
WHEN condition 2 THEN returnvalue2
WHEN condition 3 THEN returnvalue3
……
ELSE defaultreturnvalue
END
其中的condition1 、condition 2、condition 3……为条件表达式,CASE函数对各个表达式从前向后进行测试,如果条件condition1为真则返回returnvalue1,否则如果条件condition2
为真则返回returnvalue2,否则如果条件condition3为真则返回returnvalue3,……
以此类推,如果不符合所有的WHEN条件,则返回默认值defaultreturnvalue
--如果体重小于40则认为太瘦,而如果体重大于50则认为太胖,介于40和50之间则认为是正常
SELECT
FName,
FWeight,
(CASE
WHEN FWeight<40 THEN 'thin'
WHEN FWeight>50 THEN 'fat'
ELSE 'ok'
END) as isnormal
FROM T_Person
5)SQLServer中的独有函数
PATINDEX ( '%pattern%' , expression )用来计算字符串中指定表达式的开始位置,它返回指定表达式中模式'%pattern%'第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零。在模式中可以使用通配符
--查找每个人的姓名中第一个长度为2并且第二个字符为m的子字符串的位置
SELECT FName,PATINDEX('%_m%',FName) FROM T_Person
REPLICATE (str,count)
用来得到一个子字符串重复了若干次所组成的字符串,参数str为子字符串,而count为重复次数
--将每个人的姓名重复n次,n等于体重与20的整除结果
SELECT FName,FWeight, CAST(FWeight/20 AS INT), REPLICATE(FName, CAST(FWeight/20 AS INT)) FROM T_Person
REVERSE()
用来将一个字符串的顺序颠倒
--将所有人员的姓名进行颠倒
SELECT FName, REVERSE(FName) FROM T_Person
ISDATE ( expression ) 是返回 1;否则,返回 0,expression参数为要验证其是否为日期的表达式。expression可以是 text、ntext 表达式和 image 表达式以外的任意表达式,可以隐式转换为 nvarchar
SELECT
ISDATE(NULL) as d1,
ISDATE('13/43/3425') as d2,
ISDATE('1995-10-1a') as d3,
ISDATE(19920808) as d4,
ISDATE('1/23/95') as d5,
ISDATE('1995-10-1') as d6,
ISDATE('19920808') as d7,
ISDATE(' Abc') as d8
ISNUMERIC ( expression ) 用来确定表达式是否为有效的数值类型。如果输入表达式的计算值为有效的整数、浮点数、money 或 decimal 类型时,ISNUMERIC 返回 1;否则返回 0
expression参数为要计算的表达式
SELECT
ISNUMERIC(NULL) as d1,
ISNUMERIC('13/43/3425') as d2,
ISNUMERIC('30a.8') as d3,
ISNUMERIC(19920808) as d4,
ISNUMERIC('1/23/95') as d5,
ISNUMERIC('3E-3') as d6,
ISNUMERIC('19920808') as d7,
ISNUMERIC('-30.3') as d8
APP_NAME():返回当前会话的应用程序名称
CURRENT_USER:(注意这个函数不能带括号调用)返回当前登陆用户名
HOST_NAME():返回工作站名
----------------------
ASP.Net+Android+IO开发S、
.Net培训、期待与您交流! ----------------------
SELECT APP_NAME() as appname, CURRENT_USER as cu, HOST_NAME() as hostname
NEWID():生成全局唯一字符串的函数
SELECT NEWID() AS id1, NEWID() AS id2