表结构与数据:https://github.com/XuePeng87/TSQLV4前端
设计字符数据的查询操做,包括数据类型、排序规则、运算符和函数,以及模式匹配。git
SQL Server支持两种字符数据类型,即常规和Unicode。常规数据类型包括CHAR和VARCHAR,Unicode数据类型包括NCHAR和NVARCHAR。常规字符的每一个字符使用1个字节存储,而Unicode数据的每一个字符要求2个字节,而且须要一个代理项对时,要求4个字节。若是为列选择了常规字符类型,会被限制除英语以外仅能使用一种语言。列支持的语言取决于列的有效规则。使用Unicode数据类型能够支持多种语言,因此若是你须要存储多种语言的字符数据,请确保使用Unicode字符类型,而不是常规字符类型。github
名称中没有VAR元素的任何数据类型(CHAR、NCHAR)具备固定长度,即SQL Server按照列定义的大小保留行空间,而不是按照字符串中的实际字符数保留空间。sql
名称中含有VAR元素的数据类型(VARCHAR、NVARCHAR)具备可变长度,即SQL Server根据存储须要,在行中使用尽量多的存储空间存储字符串中的字符,外加两个额外的字节偏移数据。数据库
可变长度数据类型的数据更新效率低于固定长度数据类型。函数
还可使用MAX来定义可变长度数据类型,而不是使用最大字符数。MAX默认是8000个字节,超过这个数值的任何值会做为大型对象(LOB)存储在行的外部。spa
排序规则是一个字符数据属性,包括语言支持、排序顺序、区分大小写和区分重音等。能够查询表函数fn_helpcollations查看支持的排序规则及其说明的结果集。设计
SELECT name, description FROM sys.fn_helpcollations();
例如,对排序规则Latin1_General_CI_AS的说明:代理
在企业内部部署SQL Server实施中,排序规则能够定义在4个不一样层级:实例、数据库、列和表达式,SQL Server将使用最低有效级别的排序规则。code
实例的排序规则是安装程序选择的一部分,它肯定全部系统数据库的排序规则,并做为用户数据库的默认规则。数据库的排序规则决定了数据库对象元数据的排序规则,并默认应用与用户列表。能够在列定义中使用COLLATE子句显示地指定列的排序规则,不然默认使用数据库的排序规则。例如:
SELECT empid, firstname, lastname FROM HR.Employees WHERE lastname = N'davis';
将返回lastname=Davis的行,尽管大小写不匹配,可是不区分大小写是有效的书写形式,若是但愿筛选区分大小写,那么能够按下面的转换表达式排序规则进行查询:
SELECT empid, firstname, lastname FROM HR.Employees WHERE lastname COLLATE Latin1_General_CS_AS = N'Davis';
T-SQL提供了+和CONCAT函数(SQL Server2012提供)链接字符串,例如:
SELECT empid, firstname + N' ' + lastname AS fullname FROM HR.Employees; SELECT custid, country, region, city, country + N',' + region + N',' + city AS location FROM Sales.Customers; SELECT custid, country, region, city, CONCAT(country, N',' + region, N',' + city) AS location FROM Sales.Customers;
标准SQL规定了链接NULL的结果应为NULL。而CONCAT函数则会将NULL替换成空字符串。
次函数对于输入的string字符串,从start位置开始,提取length个字符。例如,下面的代码返回"abc":
SELECT SUBSTRING('abcdefg', 1, 3);
若是第三个参数超出了输入的字符串的末尾,并不会引起错误,函数将返回一直到末尾的全部字符。
LEFT和RIGHT函数是SUBSTRING函数的简化形式,能够从输入字符串的左边或右边返回制定数量的字符串,例如,下面的代码返回"ced":
SELECT RIGHT('abced', 3);
LEN函数返回输入字符串中字符的数量,而且会删除尾随的空格,下面代码返回5:
SELECT LEN(N'abcde')
DATALENGTH函数返回输入字符串存储的字节数,不删除尾随的空格,下面代码返回10:
SELECT DATALENGTH(N'abcde')
CHARINDEX函数返回子字符串在字符串中第一次出现的位置,例如,下面代码返回6:
SELECT CHARINDEX(' ','Itzik Ben-Gan');
返回模式在字符串中第一次出现的位置,例以下面的代码返回5:
SELECT PATINDEX('%[0-9]%','abcd123efgh');
REPLACE(string,substring1,substring2)函数,使用substring2替换string中出现的全部substring1,例如,下面将'1-a 2-b'中的'-'替换成':':
SELECT REPLACE('1-a 2-b', '-', ':')
能够按照指定的次数重复一个字符串,例以下面的代码将返回'abcabcabc':
SELECT REPLICATE('abc', 3)
容许从字符串中逸出指定数量的字符,并插入一个替代的新子字符串。例如将'xyz'中的'y'替换成'abc':
SELECT STUFF('xyz', 2, 1, 'abc')
将字符串所有转大写或转小写。
删除尾随的或者前端的空格。
容许按照Microsoft.NET格式字符串和一个可选的区域参数,将输入值格式化成另外一个字符串,例如将1759前面加上6个0:
SELECT FORMAT(1759, '0000000000')
1.(%)百分号通配符:表明一个任意大小的字符串,包括空字符串;
2.(_)下划线通配符:表明单个字符;
3.([<List of Characters>])字符列表通配符:方括号内带有字符列表的意思是,表明单个字符必须是列表中的指定字符之一,例以下面的查询返回姓氏的第一个字符是A、B或C的雇员:
SELECT empid, lastname FROM HR.Employees WHERE lastname LIKE N'[ABC]%';
4.([<Character>]-<Character>)字符范围通配符:表明单个字符必须在指定的范围内,例如,下面的查询返回姓氏的第一个字符位于字母A~E范围内的雇员:
SELECT empid, lastname FROM HR.Employees WHERE lastname LIKE N'[A-E]%';
5.([^<Character List or Range>])未指定范围通配符:表明单个字符没有在指定的字符列表或范围内,例如,下面的查询将返回姓氏第一个字符不是A~E范围内的雇员:
SELECT empid, lastname FROM HR.Employees WHERE lastname LIKE N'[^A-E]%';
6.ESCAPE字符
若是想要搜索已用做通配符的字符(如"%"、"_"、"["或]""),须要使用一个转义字符。例如,要检查col1列中是否包含下划线,能够用 col1 LIKE '%!_%' ESCAPE '!'。