3.《SQLSERVER2012之T-SQL教程》T-SQL单表查询(三)

有些话、适合烂在心里 提交于 2019-12-07 02:28:44

表结构与数据:https://github.com/XuePeng87/TSQLV4

使用字符数据

    设计字符数据的查询操作,包括数据类型、排序规则、运算符和函数,以及模式匹配。

数据类型

    SQL Server支持两种字符数据类型,即常规和Unicode。常规数据类型包括CHAR和VARCHAR,Unicode数据类型包括NCHAR和NVARCHAR。常规字符的每个字符使用1个字节存储,而Unicode数据的每个字符要求2个字节,并且需要一个代理项对时,要求4个字节。如果为列选择了常规字符类型,会被限制除英语之外仅能使用一种语言。列支持的语言取决于列的有效规则。使用Unicode数据类型可以支持多种语言,所以如果你需要存储多种语言的字符数据,请确保使用Unicode字符类型,而不是常规字符类型。

    名称中没有VAR元素的任何数据类型(CHAR、NCHAR)具有固定长度,即SQL Server按照列定义的大小保留行空间,而不是按照字符串中的实际字符数保留空间。

    名称中含有VAR元素的数据类型(VARCHAR、NVARCHAR)具有可变长度,即SQL Server根据存储需要,在行中使用尽可能多的存储空间存储字符串中的字符,外加两个额外的字节偏移数据。

    可变长度数据类型的数据更新效率低于固定长度数据类型。

    还可以使用MAX来定义可变长度数据类型,而不是使用最大字符数。MAX默认是8000个字节,超过这个数值的任何值会作为大型对象(LOB)存储在行的外部。

排序规则

    排序规则是一个字符数据属性,包括语言支持、排序顺序、区分大小写和区分重音等。可以查询表函数fn_helpcollations查看支持的排序规则及其说明的结果集。

SELECT name, description FROM sys.fn_helpcollations();

    例如,对排序规则Latin1_General_CI_AS的说明:

  • Latin1_General:支持英语和德语字符,以及大多数西欧国家使用的字符;
  • CI数据不区分大小写(a=A);
  • AS数据区分重音(à<>ā);

    在企业内部部署SQL Server实施中,排序规则可以定义在4个不同层级:实例、数据库、列和表达式,SQL Server将使用最低有效级别的排序规则。

    实例的排序规则是安装程序选择的一部分,它确定所有系统数据库的排序规则,并作为用户数据库的默认规则。数据库的排序规则决定了数据库对象元数据的排序规则,并默认应用与用户列表。可以在列定义中使用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';

运算符和函数

1.字符串连接

    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替换成空字符串。

2.SUBSTRING函数

    次函数对于输入的string字符串,从start位置开始,提取length个字符。例如,下面的代码返回"abc":

SELECT SUBSTRING('abcdefg', 1, 3);

    如果第三个参数超出了输入的字符串的末尾,并不会引发错误,函数将返回一直到末尾的所有字符。

3.LEFT和RIGHT函数

    LEFT和RIGHT函数是SUBSTRING函数的简化形式,可以从输入字符串的左边或右边返回制定数量的字符串,例如,下面的代码返回"ced":

SELECT RIGHT('abced', 3);

4.LEN和DATALENGTH函数

    LEN函数返回输入字符串中字符的数量,并且会删除尾随的空格,下面代码返回5:

SELECT LEN(N'abcde')

    DATALENGTH函数返回输入字符串存储的字节数,不删除尾随的空格,下面代码返回10:

SELECT DATALENGTH(N'abcde')

5.CHARINDEX函数

    CHARINDEX函数返回子字符串在字符串中第一次出现的位置,例如,下面代码返回6:

SELECT CHARINDEX(' ','Itzik Ben-Gan');

6.PATINDEX函数

    返回模式在字符串中第一次出现的位置,例如下面的代码返回5:

SELECT PATINDEX('%[0-9]%','abcd123efgh');

7.REPLACE函数

    REPLACE(string,substring1,substring2)函数,使用substring2替换string中出现的所有substring1,例如,下面将'1-a 2-b'中的'-'替换成':':

SELECT REPLACE('1-a 2-b', '-', ':')

8.REPLICATE函数

    可以按照指定的次数重复一个字符串,例如下面的代码将返回'abcabcabc':

SELECT REPLICATE('abc', 3)

9.STUFF函数

    允许从字符串中逸出指定数量的字符,并插入一个替代的新子字符串。例如将'xyz'中的'y'替换成'abc':

SELECT STUFF('xyz', 2, 1, 'abc')

10.UPPER和LOWER函数

    将字符串全部转大写或转小写。

11.RTRIM和LTRIM喊出

    删除尾随的或者前端的空格。

12.FORMAT函数

    允许按照Microsoft.NET格式字符串和一个可选的区域参数,将输入值格式化成另一个字符串,例如将1759前面加上6个0:

SELECT FORMAT(1759, '0000000000')

13.LIKE谓词

    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 '!'。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!