SQL字符数据的查询操作

字符数据类型

SQL Server 支持两种字符数据类型——常规和 Unicode。常规数据类型包括 CHAR 和 VARCHAR,Unicode 数据类型包括 NCHAR 和 NVARCHAR。常规字符的每个字符使用1个字节存储,而 Unicode 数据的每个字符要求2个字节,并且需要一个代理项对时,要求4个字节。常规字符文本可以用单引号表示,Unicode 字符文本需要指定字符串N(National)作为前缀。
名称中没有 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 的说明:

  1. Latin1_General 使用代码页1252(支持英语和德语字符,以及大多数西欧国家使用的字符);
  2. Dictionary sorting 排序和比较字符数据基于字典顺序(A和a < B和b);
  3. CI 数据不区分大小写(a=A);
  4. AS 数据区分重音(à<>ä);

由于字典顺序是默认顺序,如果没有显示地定义其它排序,可以说是使用了字典顺序。具体来说,就是元素 BIN 没有出现在排序规则名称中。如果出现了 BIN 元素,则意味着字符数据的排序和比较是基于字符的二进制表示形式的(A < B < a < b)。
在(企业)内部部署的SQL Server实施中,排序规则可以定义在4个不同层级:实例、数据库、列和表达式,SQL Server将使用最低有效级别的排序规则。实例的排序规则是安装程序选择的一部分,它确定所有系统数据库的排序规则,并作为用户数据库的默认规则。当创建一个用户数据库时,可以使用 COLLATE 子句指定数据库的排序规则,否则实例的排序规则将使用默认规则。
数据库的排序规则决定了数据库对象元数据的排序规则,并默认应用于用户表列。可以在列定义中使用 COLLATE 子句显式地指定列的排序规则,否则默认使用数据库的排序规则。通过 COLLATE 子句可以转换表达式的排序规则。

SELECT empid, firstname, lastname FROM HR.Employees WHERE lastname = N'davis'  -- 不区分大小写
SELECT empid, firstname, lastname FROM HR.Employees WHERE lastname COLLATE Latin1_General_CS_AS = N'davis'  -- 筛选区分大小写

SQL字符数据的查询操作_第1张图片

运算符和函数

字符串连接(加号运算符和 CONCAT 函数)

T-SQL 提供了加号(+)运算符和 CONCAT 函数连接字符串。标准SQL规定了连接 NULL 的结果应为 NULL,这是 SQL Server 的默认行为。

SELECT fullname='Sara' + N' ' + 'Davis'  -- Sara Davis
SELECT fullname='Sara' + N' ' + NULL  --  NULL

要想使用空字符串代替 NULL,可以用 COALESCE 函数。此函数接收一个输入值列表并返回第一个非空表达式的值(可以想到 ISNULL 函数是简化版)。

SELECT fullname='Sara' + N' ' + COALESCE(N' '+ NULL, NULL, N'- ') + 'Davis' --  Sara - Davis

SQL Server 2012 引入一个名为 CONCAT 的新函数,接收一个要连接的输入列表并自动以空字符串替换 NULL。

SELECT fullname=CONCAT('Sara', NULL, 'Davis')  -- SaraDavis
SUBSTRING 函数

语法:
     SUBSTRING(string,start,length)
此函数对于输入的 string 字符串,从 start 位置开始,提取 length 个字符。例:

SELECT SUBSTRING('abcde', 1, 3)

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

LEFT 和 RIGHT 函数

语法:
     LEFT(string,n),RIGHT(string,n)
LEFT 和 RIGHT 函数是 SUBSTRING 函数的简化形式,可以从输入字符串 string 的左边或右边返回指定数量(n)的字符串。例:

SELECT RIGHT('abcde', 3)  -- cde
CHARINDEX 函数

CHARINDEX 函数返回子字符串在字符串中第一次出现的位置。
语法:
     CHARINDEX(substring,string[,start_pos])
此函数返回第1个参数 substring 在第2个参数 string 中的位置。你可以选择性地指定第3个参数 start_pos,通知函数还是查找的位置。如果不指定第3个参数,函数从第1个字符开始查找。如果未找到该字符串,该函数返回0。例:

SELECT CHARINDEX('cd', 'abcdecde', 4)  -- 6
PATINDEX 函数

PATINDEX 函数返回模式在字符串中第一次出现的位置。
语法:
     PATINDEX(pattern,string)
参数 pattern 使用与 T-SQL 中 LIKE 谓词类似的模式,例:

SELECT PATINDEX('%[0-9]%','abcd123efgh')  -- 5
REPLACE 函数

REPLACE 函数可以使用另一个字符串替换出现的所有子字符串。
语法:
     REPLACE(string,substring1,substring2)
函数使用 substring2 替换 string 中出现的所有 substring1。例:

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

可以使用 REPLACE 函数计算某个字符在字符串内出现的次数。例:

SELECT LEN('abcde')-LEN(REPLACE('abcde', 'e', ''))  -- 1
REPLICATE 函数

语法:
     REPLICATE(string,n)
REPLICATE 函数可以按照指定的次数重复一个字符串。例:

SELECT REPLICATE('abc', 3)  -- abcabcabc
STUFF 函数

STUFF 函数允许从字符串中移除指定数量的字符,并插入一个替代的新子字符串。
语法:
     STUFF(string,pos,delete_length,insertstring)
此函数对输入参数 string 进行操作,从输入参数 pos 指定的字符位置开始,删除 delete_length 参数中指定数量的字符串,并从 pos 位置插入 insertstring 参数中指定的字符串。例:

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

如果只想插入一个字符串,而不删除任何内容,则可以把第3个参数指定为0长度。

UPPER 和 LOWER 函数

语法:
     UPPER(string),LOWER(string)
UPPER 和 LOWER 函数分别返回输入字符串的全部大写或小写字符。例:

SELECT UPPER('Ben-Gan'), LOWER('Ben-Gan')  -- BEN-GAN   ben-gan
RTRIM 和 LTRIM 函数

RTRIM 和 LTRIM 函数分别返回删除尾随或前导空格后的输入字符串。
语法:
     RTRIM(string),LTRIM(string)
如果要删除前导和尾随空格,可以把一个函数的结果作为另一个函数的输入。例:

SELECT RTRIM(LTRIM('  abc   ')) -- abc
FORMAT 函数

FORMAT 函数允许按照 Microsoft.NET 格式字符串和一个可选的区域参数,将输入值格式化成一个字符串。
语法:
     FORMAT(input,format_string,culture)
使用标准或自定义格式字符串格式化输入值,可以参考设置 .NET 中类型的格式。例:

SELECT FORMAT(1769, 'd10')  -- 0000001769
LIKE 谓词

T-SQL 提供的 LIKE 谓词,允许用户检查字符串是否与指定模式相匹配。

  1. %(百分号)通配符
    百分号代表一个任意大小的字符串,包括空字符串。例:

    SELECT lastname FROM HR.Employees WHERE lastname LIKE N'D%'  -- Davis,Dolgopyatova
  2. _(下划线)通配符

    SELECT lastname FROM HR.Employees WHERE lastname LIKE N'_e%'  -- Lew,Peled
  3. []通配符
    方括号内带有字符列表代表单个字符必须是列表中的指定字符之一。例:

    SELECT lastname FROM HR.Employees WHERE lastname LIKE N'[ABC]%'  -- Buck,Cameron
  4. [-]通配符
    方括号内带有字符范围代表单个字符必须在指定范围内。例:

    SELECT lastname FROM HR.Employees WHERE lastname LIKE N'[A-E]%'  -- Buck,Cameron,Davis
  5. [^]通配符

    SELECT lastname FROM HR.Employees WHERE lastname LIKE N'[^A-E]%'  -- Funk,King,Lew,Peled,Suurs
  6. ESCAPE 字符
    如果想要搜索已用作通配符的字符(%、_、[、]),需要使用一个转义字符。指定一个确定没有出现在数据库中的字符作为转义字符,放在要查找字符的前面,并在模式后面指定跟随有转义字符的 ESAPE 关键字。例:

    SELECT lastname FROM HR.Employees WHERE lastname LIKE N'%!_%' ESCAPE '!'

    可以使用方括号代替转义字符:LIKE N'%[_]%'代替LIKE N'%!_%' ESCAPE '!'

你可能感兴趣的:(SQL字符数据的查询操作)