【程序员的SQL金典】笔记(第1章~第5章)

 
第一章数据库入门
1.概念:
数据库
记录(行)
主键
索引
 
 
 
 
第二章 数据表的创建和管理
1.数据库系统中的数据类型大致可以分为五类:整数、数值、字符相关、日期时间以及二进制。
 
2.数据类型:
①整数类型:
bit                其值只能是0、1或空值。这种数据类型用于存储只有两种可能值的数据,如Yes 或No、True 或Fa lse 、On 或Off。
int                正常大小整数,取值范围是-2147483648到2147483647.
smallint        可以存储从-32768 到32767 之间的整数。这种数据类型对存储一些常限定在特定范围内的数值型数据非常有用。这种数据类型在数据库里占用2 字节空间。
tinyint          能存储从0到255 之间的整数。它在你只打算存储有限数目的数值时很有用。这种数据类型在数据库中占用1个字节。
bigint           可以精确的表示从-2^63到2^63-1(即从-9,223,372,036,854,775,808到9,223,372,036,854,775,807)之间的整数,它占用了八个字节的存储空间。
②数值类型:
decimal        (p,s)数字数据,p 为固定精度,s为宽度。decimal 数据类型能用来存储从-1038-1到1038-1的固定精度和范围的数值型数据。使用这种数据类型时,必须指定范围和精度。范围是小数点左右所能存储的数字的总位数。精度是小数点右边存储的数字的位数
numeric        numeric 是decimal 的同义词。
money          货币型。用来表示货币值。这种数据类型能存储从-9220 亿到9220 亿之间的数据,精确到货币单位的万分之一。
smallmoney 货币型。用来表示货币值。这种数据类型能存储从-214748.3648 到214748.3647 之间的数据,精确到货币单位的万分之一
float              近似数值型。float 数据类型是一种近似数值类型,供浮点数使用。浮点数可以是从-1.79E+308 到1.79E+308 之间的任意数。
real               real数据类型像浮点数一样,它可以表示数值在-3.40E+38到3.40E+38之间的浮点数
③字符相关类型:
char(m)         固定长度字符串,长度为m
varchar(m)     可变长度字符串,最大长度为m
text               可变长度字符串,最大长度231 - 1 字节
nchar(m)       固定长度国际化字符串,长度为m
nvarchar(m)   可变长度国际化字符串,最大长度为m
ntext             可变长度国际化大字符串,其最大长度为2^30 - 1(1,073,741,823) 个字符。
 
3.创建数据表(CREATE TABLE)
①SQL语句CREATE TABLE 用于创建数据表,其基本语法如下:
CREATE TABLE 表名
(
字段名1 字段类型,
字段名2 字段类型,
字段名3 字段类型,
………………
约束定义 1,
约束定义 2,
………………
)
下面的SQL语句创建了一个用于保存人员信息的数据表:
CREATE TABLE T_Person
(
FName VARCHAR(20),
FAge INT
)
②定义非空约束 (NOT NULL)
eg:
CREATE TABLE T_Student  (FNumber VARCHAR(20) NOT NULL , FName VARCHAR(20) NOT NULL , FAge INT NOT NULL , FFavorite VARCHAR(20), FPhoneNumber VARCHAR(20) )
 
定义主键
通过主键能够唯一定位一条数据记录,而且在进行外键关联的时候也需要被关联的数据表具有主键,所以为数据表定义主键是非常好的习惯。
关键字:PRIMARY KEY
eg:
CREATE TABLE T_Bus (
FNumber VARCHAR(20),
FDriverName VARCHAR(20),
FUsedYears INT,
PRIMARY KEY (FNumber)
)
有的数据库的主键字段必须被添加非空约束
 
联合主键(建议避免使用)
我们可以让FCompanyName、FInternalNumber 两个字段联合起来做为主键,这样的主键被称为联合主键(或者称为复合主键)。可以有两个甚至多个字段来做为联合主键,这就可以解决一张表中没有唯一主键字段的问题了。定义联合主键的方式和唯一主键类似,只要在PRIMARY KEY后的括号中列出做为联合主键的各个字段就可以了。
上面的例子的建表SQL如下:
MYSQL,MSSQLServer,DB2:
CREATE TABLE T_PersonalMember ( FCompanyName VARCHAR(20), FInternalNumber VARCHAR(20), FName VARCHAR(20), PRIMARY KEY (FCompanyName,FInternalNumber) )
采用联合主键可以解决表中没有唯一主键字段的问题,不过联合主键有如下的缺点:
● 效率低。在进行数据的添加、删除、查找以及更新的时候数据库系统必须处理两个字
段,这样大大降低了数据处理的速度。
 使得数据库结构设计变得糟糕。组成联合主键的字段通常都是有业务含义的字段,这
与“使用逻辑主键而不是业务主键”的最佳实践相冲突,容易造成系统开发以及维护
上的麻烦。
使得创建指向此表的外键关联关系变得非常麻烦甚至无法创建指向此表的外键关联
关系。
加大开发难度。很多开发工具以及框架只对单主键有良好的支持,对于联合主键经常
需要进行非常复杂的特殊处理。
 
④.定义外键
外键是非常重要的概念,也是体现关系数据库中“关系”二字的体现,通过使用外键,我们才能把互相独立的表关联起来,从而表达丰富的业务语义。
格式为:
FOREIGN KEY 外键字段名称 REFERENCES 目标表名(被关联的字段名称)
eg:我们创建一张部门信息表,表中记录了部门主键FId、部门名称FName、部门级别FLevel等字段,建表SQL如下:
CREATE TABLE T_Department ( FId VARCHAR(20),FName VARCHAR(20),  FLevel INT,PRIMARY KEY (FId) )
接着创建员工信息表,表中记录工号、姓名以及所属部门等信息,为了能够建立同部门信息表之间的关联关系,我们在员工信息表中保存部门信息表中的主键,保存这个主键的字段就被称为员工信息表中指向部门信息表的外键。建表SQL如下:
CREATE TABLE T_Employee ( FNumber VARCHAR(20), FName VARCHAR(20), FDepartmentId VARCHAR(20), FOREIGN KEY (FDepartmentId) REFERENCES T_Department(FId) )
 
4.修改已有的数据表(ALTER TABLE)
ANSI-SQL中为ALTER TABLE 语句规定了两种修改方式:添加字段和删除字段,有的数据库系统中还提供了修改表名、修改字段类型、修改字段名称的语法。
 
①.添加字段的语法:
ALTER TABLE 待修改的表名 ADD 字段名字段类型
eg:为T_Person表增加个人爱好字段的SQL语句:
ALTER TABLE T_PERSON ADD FFavorite VARCHAR(20)
 
②.删除字段的语法:
ALTER TABLE 待修改的表名 DROP 待删除的字段名
eg:删除T_Person 表中年龄字段的SQL语句:
ALTER TABLET_Person DROP FAge
 
5.删除数据表
关键字:DROP TABLE
语法:DROP TABLE 要删除的表名
,如果在表之间创建了外键关联关系,那么在删除被引用数据表的时候会删除失败,因为这样会导致关联关系被破坏,所以必须首先删除引用表,然后才能删除被引用表。比如A表创建了指向B表的外键关联关系,那么必须首先删除A表后才能删除B表。
 
 
 
 
第三章 数据的增删改
数据插入|数据更新|数据删除
 
1.数据插入
INSERT INTO 语句用来向数据表中插入数据
①简单的INSERT语句
eg:INSERT INTO 语句用来向数据表中插入数据
INSERT INTO T_Person(FName,FAge,FRemark) VALUES('Tom',18,'USA')
 
②非空约束对数据插入的影响
非空约束必须插入数据,如果插入语句没有给非空约束插入数据的话,该语句会报错
 
③主键对数据插入的影响
不能对主键插入重复的值.
 
④外键对数据插入的影响
外键是指向另一个表中已有数据的约束,因此外键值必须是在目标表中存在的。如果插入的数据在目标表中不存在的话则会导致违反外键约束异常
 
2.数据更新
UPDATE 语句用来对数据表中的数据进行更新
①简单的数据更新
eg:将表T_Person 中所有人员的FREMARK 字段值更新为“SuperMan”:
UPDATE T_Person SET FRemark = 'SuperMan'
 
 
②带WHERE 子句的UPDATE 语句
eg:将T_Preson表中FNAME字段值为'Tom'的项的FAge字段改为12.
UPDATE T_Person SET FAge = 12 WHERE FNAME='Tom'
 
3.数据删除
执行DELETE 语句就可以将数据从表中删除
①简单的数据删除
eg:删除T_Preson表中的数据,注意与DROP FROM T_Person的区别,DELETE只是删除表中的数据
DELETE FROM T_Person;
 
②带WHERE 子句的DELETE 语句
eg:要删除年龄大于20 岁或者来自火星(Mars)的人员
DELETE FROM T_Person WHERE FAge > 20 or FRemark = 'Mars'
 
 
 
 
 
第四章 数据的检索
1.select基本语法
①.基本语法
SELECT * FROM 表名
 
②.检索列名
SELECT 列名1,列名2.. FROM 表名
为列名添加别名可以用AS 
 
③.按条件检索
eg:
SELECT * FROM T_Employee WHERE FSalary<5000 OR FAge>25
 
④.数据汇总
MAX函数|AVG函数|SUM函数|COUNT函数
eg:用来统计公司的最低工资和最高工资:
SELECT MIN(FSalary),MAX(FSalary) FROM T_Employee
 
 
⑤.排序
ASC(升序,默认值)|DESC(降序)
注意:
ORDER BY子句完全可以与WHERE子句一起使用,唯一需要注意的就是ORDER BY子句要放到WHERE子句之后,不能颠倒它们的顺序。
eg:按照年龄排序所有员工信息的列表:
SELECT * FROM T_Employee WHERE FAge>23 ORDER BY FAge DESC,FSalary DESC
 
2.高级数据过滤
 
①通配符过滤
SQL中的通配符过滤使用LIKE 关键字,可以像使用OR、AND 等操作符一样使用它,它是一个二元操作符,左表达式为待匹配的字段,而右表达式为待匹配的通配符表达式
"_"表示匹配任意字符
"%"表示匹配任意次数的任意字符
"[]"表示方括号中包含一个字符集,它匹配与字符集中任意一个字符相匹配的字符。比如通配符表达式“[bt]%”匹配第一个字符为b 或者t、长度不限的字符串,“bed”、“token”、“t ”都能匹配这个表达式,而“at”、“lab”、“lot”等则不能匹配这个表达式。
"^"表示对集合取反,它匹配不与字符集中任意一个字符相匹配的字。比如通配符表达式“[^bt]%”匹配第一个字符不为b 或者t、长度不限的字符串,“at”、“lab”、“lot”都能匹配这个表达式,而“bed”、“token”、“t ”等则不能匹配这个表达式。
eg:检索姓名中包含字母“n”的员工信息:
SELECT * FROM T_Employee WHERE FName LIKE '%n%'
 
通配符过滤一个非常强大的功能,不过在使用通配符过滤进行检索的时候,数据库系统会对全表进行扫描,所以执行速度非常慢。因此不要过分使用通配符过滤,在使用其他方式可以实现的效果的时候就应该避免使用通配符过滤。
 
②空值检测
使用IS NULL关键字,使用方法为“待检测字段名IS NULL”
eg:查询所有姓名未知的员工信息
SELECT * FROM T_Employee WHERE FNAME IS NULL
 
注意不是
SELECT * FROM T_Employee
WHERE FNAME=null
不为空就用"IS NOT NULL"
 
③反义运算符
少用"!"运算符,原因也其他有些数据库不兼容
“<>”表示“不等于”
“>=”表示“不小于”
“<=”表示“不大于”
也可以使用NOT运算符
eg:“检索所有年龄不等于22岁并且工资不小于2000元”
SELECT * FROM T_Employee WHERE NOT(FAge=22) AND NOT(FSALARY<2000)
 
 
④多值检测
OR语句可以用来连接多个条件判断,不过比较麻烦,所以有时候可以使用IN语句代替
eg:检索年龄为23岁、25岁和28岁的员工
SELECT FAge,FNumber,FName FROM T_Employee WHERE FAge IN (23,25,28)
 
 
⑤范围值检测
BETTWEEN AND 语法
等价于"字段名>=左范围值AND 字段名<=右范围值"(闭区间)
eg:检索所有工资介于2000元到3000元之间以及5000元到8000元的员工信息
SELECT * FROM T_Employee WHERE (FSalary BETWEEN 2000 AND 3000) OR (FSalary BETWEEN 5000 AND 8000)
 
 
数据库系统对“BETTWEEN AND”进行了查询优化,使用它进行范围值检测将会得到比其他方式更好的性能,因此在进行范围值检测的时候应该优先使用“BETTWEEN AND”。
 
 
3.数据分组
①.基本
使用GROUP BY 来分组字段
 
②数据分组与聚合函数
eg:统计每个分公司的年龄段的人数:
SELECT FSubCompany,FAge,COUNT(*) AS CountOfThisSubCompAge FROM T_Employee GROUP BY FSubCompany,FAge
 
 
③.HAVING语句
有的时候需要对部分分组进行过滤,比如只检索人数多余1个的年龄段,有的开发人员会使用下面的SQL语句:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee
GROUP BY FAge
WHERE COUNT(*)>1
可以在数据库系统中执行上面的SQL的时候,数据库系统会提示语法错误,这是因为聚合函数不能在WHERE语句中使用,必须使用HAVING子句来代替,比如:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee GROUP BY FAge HAVING COUNT(*)>1
 
 
HAVING语句能够使用的语法和WHERE几乎是一样的,不过使用WHERE的时候GROUP BY子句要位于WHERE子句之后,而使用HAVING子句的时候GROUP BY子句要位于HAVING子句之后
需要特别注意,在HAVING语句中不能包含未分组的列名,比如下面的SQL语句是错误的:
SELECT FAge,COUNT(*) AS CountOfThisAge FROM T_Employee
GROUP BY FAge
HAVING FName IS NOT NULL
 
4.限制结果集行数
TOP关键字
其语法为“SELECT TOP 限制结果集数目字段列表SELECT语句其余部分”
eg:现检索按照工资从高到低排序检索从第六名开始一共三个人的信息
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
 
 
②ROW_NUMBER()
ROW_NUMBER()函数可以计算每一行数据在结果集中的行号(从1开始计数),其使用语法如下:
ROW_NUMBER() OVER(排序规则)
eg:
SELECT ROW_NUMBER() OVER(ORDER BY FSalary),FNumber,FName,FSalary,FAge FROM T_Employee
 
ROW_NUMBER()只能出现在SELECT或ORDER BY子句中.
 
数据库分页
设计思想:
假设每一页显示的数据条数为PageSize,当前页数(从0开始技术)为CurrentIndex,那么我们只要查询从第PageSize*CurrentIndex开始的PageSize条数据得到的结果就是当前页中的数据;当用户点击【上一页】按钮的时候,将CurrentIndex设置为CurrentIndex-1,然后重新检索;当用户点击【下一页】按钮的时候,将CurrentIndex设置为CurrentIndex+1,然后重新检索;当用户点击【首页】按钮的时候,将CurrentIndex设置为0,然后重新检索;当用户点击【首页】按钮的时候,将CurrentIndex设置为“总条数/PageSize”,然后重新检索。
 
5.抑制数据重复
DISTINCT关键字
是用来进行重复数据抑制的最简单的功能,而且所有的数据库系统都支持DISTINCT,DISTINCT的使用也非常简单,只要在SELECT之后增加DISTINCT即可。
DISTINCT是对整个结果集进行数据重复抑制的,而不是针对每一个列.
eg:检索公司里有哪些垂直部门,并且抑制了重复数据的产生:
SELECT DISTINCT FDepartment FROM T_Employee
 
6.计算字段
①常量字段
像表里面的数据,值确定的字段,都可以用来计算
 
②字段间计算
eg:
SELECT FNumber,FName,FAge * FSalary AS FSalaryIndex FROM T_Employee
 
③数据处理函数
LEN():接受一个参数,计算该参数的字符串长度
SUBSTRING():这个函数接受三个参数,第一个参数为要取的主字符串,第二个参数为字串的起始位置(从1开始计数),第三个参数为字串的长度。
 
④字符串拼接
使用加号"+"
eg:
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仍然有两个基本的原则需要遵守:一是每个结果集必须有相同的列数;二是每个结果集的列必须类型相容。
 
UNION ALL
默认情况下,UNION运算符合并了两个查询结果集,其中完全重复的数据行被合并为了一条。如果需要在联合结果集中返回所有的记录而不管它们是否唯一,则需要在UNION运算符后使用ALL操作符
eg:
SELECT FName,FAge FROM T_Employee UNION ALL SELECT FName,FAge FROM T_TempEmployee
 
 
 
 
第5章 函数
数学函数|字符串函数|日期时间函数|其他函数
1.数学函数
ABS():求绝对值,接受一个参数
POWER():求指数,接受两个参数,第一个参数为待求幂的表达式,第二个参数为幂
SQRT():求平方根,接受一个参数
RAND():求随机数,还支持一个参数,这个参数为随机数种子
CEILING():求舍入到最大整数
FLOOR():求舍入到最小整数
ROUND(m,d):求四舍五入,其中m为待进行四舍五入的数值,而d 则为计算精度,也就是进行四舍五入时保留的小数位数。
SIN():求正弦值
COS():求余弦值
ASIN():求反正弦值
ACOS():求反余弦值
TAN():求正切值
ATAN():求反正切值
ATN2(x,y):用来计算2个变量的反正切,类似于计算Y/X的反正切
COT():求余切
PI():求圆周率π
DEGREES():弧度制转换为角度制(角度制=弧度制*180/π)
RADIANS():角度制转换为弧度制(弧度制=角度制*π/180)
SIGN():用来返回一个数值的符号,如果数值大于0 则返回1,如果数值等于0 则返回0,如果数值小于0 则返回-1。该函数接受一个参数,这个参数为待求绝对值的表达式。
MOD():用来计算两个数整除后的余数。该函数接受两个参数,第一个参数为除数,而第二个参数则是被除数
LOG():用来计算一个数的自然对数值。该函数接受一个参数,此参数为待计算自然对数的表达式
LOG10():用来计算一个数的以10 为底的对数值。该函数接受一个参数,此参数为待计算对数的表达式.
POWER(X,Y):用来计算X 的Y 次幂。
 
2.字符串函数
LENGTH():计算字符串长度.该函数接受一个参数,此参数为待计算的字符串表达式
LOWER():用来将一个字符串转换为小写。该函数接受一个参数,此参数为待转换的字符串表达式
UPPER():用来将一个字符串转换为大写,该函数接受一个参数,此参数为待转换的字符串表达式.
LTRIM():用来将一个字符串左侧的空格去掉。该函数接受一个参数,此参数为待处理的字符串表达式。
RTRIM ():用来将一个字符串右侧的空格去掉。该函数接受一个参数,此参数为待处理的字符串表达式。
TRIM ():用来将一个字符串两侧的空格去掉。该函数接受一个参数,此参数为待处理的字符串表达式。此函数只在MYSQL 和Oracle 中提供支持,不过在MSSQLServer 和DB2 中可以使用LTRIM ()函数和RTRIM ()函数复合来进行变通实现,也就是用LTRIM(RTRIM(string))来模拟实现TRIM (string)。
SUBSTRING(string,start_position,length):取子字符串,其中参数string为主字符串,start_position为子字符串在主字符串中的起始位置,length为子字符串的最大长度
INSTR(string,substring):计算子字符串的位置其中参数string 为主字符串,参数substring 为待查询的子字符串。如果string 中存在substring子字符串,则返回子字符串第一个字符在主字符串中出现的位置;如果string中不存在substring子字符串,则返回0。
LEFT (string,length):从左侧开始取任意长度的子字符串,其中参数string为主字符串,length为子字符串的最大长度。
RIGHT (string,length):从右侧开始取任意长度的子字符串,其中参数string为主字符串,length为子字符串的最大长度。
REPLACE(string,string_tobe_replace,string_to_replace):将字符串的指定的子字符串替换为其它的字符串,其中参数string 为要进行替换操作的主字符串,参数string_tobe_replace 为要被替换的字符串,而string_to_replace将替换string_tobe_replace中所有出现的地方。
ASCII():得到一个字符的ASCII 码,它有且只有一个参数,这个参数为待求ASCII码的字符,如果参数为一个字符串则函数返回第一个字符的ASCII码.
CHAR():得到一个ASCII码数字对应的字符,与ASCII()函数相反,只有一个参数是ASCII码数字,
SOUNDEX():计算一个字符串的发音特征值,这个特征值为一个四个字符的字符串,特征值的第一个字符总是初始字符串中的第一个字符,而其后则是一个三位数字的数值。
DIFFERENCE(string1,string2):简化两个字符串的发音相似度比较,它可以计算两个字符串的发音特征值,并且比较它们,然后返回一个0至4 之间的一个值来反映两个字符串的发音相似度,这个值越大则表示两个字符串发音相似度越大。
 
3.日期时间函数
GETDATE():取得当前日期时间的函数,无参数
 
DATEADD (datepart , number, date ):用于进行日期时间的加法运算.其中参数date为待计算的日期;参数number制定了用于与datepart 相加的值,如果指定了非整数值,则将舍弃该值的小数部分;参数datepart指定要返回新值的日期的组成部分
取值 别名 说明
year yy,yyy 年份
quarter qq,q 季度
month mm,m 月份
dayofyear dy,y 当年度的第几天
day dd,d
week wk,ww 当年度的第几周
weekday dw,w 星期几
hour hh 小时
minute mi,n
second ss,s
millisecond ms 毫秒
eg:计算每个人出生后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为计算差额时使用的单位,可选值同上的表格(除了weekday之外),参数startdate为起始日期;参数enddate为结束日期。
 
DATENAME(datepart,date):这个函数可以返回一个日期的特定部分,并且尽量用名称来表述这个特定部分.其中参数date为待计算日期,date 参数也可以是日期格式的字符串;参数datepart指定要返回的日期部分的参数(可选值见上表格,如为DW,则返回这个日期是星期几)
eg:提取每个人员的出生年份、出生时是当年的第几天、出生时是当年的第几周:
SELECT FBirthDay, DATENAME(year,FBirthDay) AS y, DATENAME(dayofyear,FBirthDay) AS d, DATENAME(week,FBirthDay) AS u FROM T_Person
 
 
DATEPART (datepart,date):这个函数也可以用来返回一个日期的特定部分,其中参数date为待计算日期,date 参数也可以是日期格式的字符串;参数datepart指定要返回的日期部分的参数(同理)
DATENAME()与DATEPART()的区别
DATEPART()函数的返回值是数字而DATENAME()函数则会将尽可能的以名称的方式做为返回值。
 
4.其他函数
类型转换
CAST ( expression AS data_type)和CONVERT ( data_type, expression)都可以用于类型转换,其中参数expression为待进行类型转换的表达式,而data_type为转换的目标类型
 
空值处理
COALESCE ( expression,value1,value2……,valuen):这个函数主要用来进行空值处理,第一个参数expression为待检测的表达式,而其后的参数个数不定。COALESCE()函数将会返回包括expression在内的所有参数中的第一个非空表达式。如果expression不为空值则返回expression;否则判断value1是否是空值,如果value1不为空值则返回value1;否则判断value2是否是空值,如果value2不为空值则返回value3;……以此类推,如果所有的表达式都为空值,则返回NULL。
 
ISNULL(expression,value):COALESCE()函数的简化版,只接受两个变量
 
NULLIF ( expression1 , expression2 ):如果两个表达式不等价,则NULLIF 返回第一个expression1的值。如果两个表达式等价,则NULLIF 返回第一个expression1类型的空值。也就是返回类型与第一个expression相同。
 
CASE函数
eg:判断谁是“好孩子”
SELECT FName, (CASE FName WHEN 'Tom' THEN 'GoodBoy' WHEN 'Lily' THEN 'GoodGirl' WHEN 'Sam' THEN 'BadBoy' WHEN 'Kerry' THEN 'BadGirl' ELSE 'Normal' END) as isgood FROM T_Person
eg:判断一个人体重是否正常
SELECT FName, FWeight, (CASE WHEN FWeight<40 THEN 'thin' WHEN FWeight>50 THEN 'fat' ELSE 'ok' END) as isnormal FROM T_Person
 
PATINDEX ( '%pattern%' , expression )
它返回指定表达式中模式'%pattern%'第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零。在模式中可以使用通配符。
eg:每个人的姓名中第一个长度为2并且第二个字符为m的子字符串的位置:
SELECT FName,PATINDEX('%_m%',FName) FROM T_Person
 
REPLICATE (str,count)
该函数用来得到一个子字符串重复了若干次所组成的字符串,参数str为子字符串,而count为重复次数。
eg:将每个人的姓名重复n次,n等于体重与20的整除结果:
SELECT FName,FWeight, CAST(FWeight/20 AS INT), REPLICATE(FName, CAST(FWeight/20 AS INT)) FROM T_Person
 
REVERSE()
该函数用来将一个字符串的顺序颠倒
eg:下面的SQL语句将所有人员的姓名进行了颠倒:
SELECT FName, REVERSE(FName) FROM T_Person
 
 
ISDATE ( expression )
该函数用来确定输入表达式是否为有效日期。如果输入表达式是有效日期,那么ISDATE 返回 1;否则,返回 0。expression参数为要验证其是否为日期的表达式。expression可以是text、ntext 表达式和image 表达式以外的任意表达式,可以隐式转换为nvarchar。
 
ISNUMERIC ( expression )
该函数用来确定表达式是否为有效的数值类型。如果输入表达式的计算值为有效的整数、浮点数、money 或decimal 类型时,ISNUMERIC 返回 1;否则返回 0。expression参数为要计算的表达式。
 
APP_NAME():返回当前会话的应用程序名称;
CURRENT_USER:(注意这个函数不能带括号调用)返回当前登陆用户名;
HOST_NAME():返回工作站名。
NEWID():生成全局唯一字符串的函数
 
原文地址:https://www.cnblogs.com/zt102545/p/3321242.html