T-sql 学习(4) - 深入讨论数据类型
2008-10-16 14:26
232 查看
数据类型 之字符串函数
1)掩码Patindex
实际上应该叫做模式索引(Pattern Index),就是返回指定表达式中某模式第一次出现的起始位置;
在某些情况下,Patindex和where子句中的Like是一样的。
其区别:Patindex可以返回满足模式的行的索引;而Like只能执行过滤,不能返回位置。所以需要指定
位置的时候,PatIndex比较合适。
2)LIKE,模糊查找
%
包含零个或多个字符的任意字符串。
_
任何单个字符。
[ ]
指定范围(例如 [a-f])或集合(例如 [abcdef])内的任何单个字符。
[^]
不在指定范围(例如 [^a - f])或集合(例如 [^abcdef])内的任何单个字符。
比如:
LIKE 'Mc%' 将搜索以字母 Mc 开头的所有字符串(如 McBadden)。
LIKE '%inger' 将搜索以字母 inger 结尾的所有字符串(如 Ringer 和 Stringer)。
LIKE '%en%' 将搜索任意位置包含字母 en 的所有字符串(如 Bennet、Green 和 McBadden)。
LIKE '_heryl' 将搜索以字母 heryl 结尾的所有六个字母的名称(如 Cheryl 和 Sheryl)。
LIKE '[CK]ars[eo]n' 将搜索 Carsen、Karsen、Carson 和 Karson(如 Carson)。
LIKE '[M-Z]inger' 将搜索以字母 inger 结尾、以 M 到 Z 中的任何单个字母开头的所有名称(如
Ringer)。
LIKE 'M[^c]%' 将搜索以字母 M 开头,并且第二个字母不是 c 的所有名称(如 MacFeather)。
3)字符串的执行
EXECUTE sp_executesql -- 必须传递unicode字符串
N'SELECT * FROM AdventureWorks.HumanResources.Employee
WHERE ManagerID = @level',
N'@level tinyint',
@level = 109;
或者
EXECUTE('SELECT PATINDEX(''%Ref%'',DocumentSummary)
FROM Production.Document
WHERE DocumentID = 3;')
推荐前者,因为:快,特性多
4)nchar和nvarchar的区别
nvarchar是可变长度的,所以在长度不定的情况下,nvarchar是比较合适的选择。有一个细节需要注意:
USE AdventureWorks;
GO
if object_id('tempdb..##zhs') is not null
drop table ##zhs -- 临时表不在当前数据库,而是在tempdb这个特定的数据库中
create table ##zhs
( id int identity,
username nvarchar(10)
)
go
insert into ##zhs(username) values ( 'zhs')
insert into ##zhs(username) values ( 'wang ')
insert into ##zhs(username) values ( ' li')
insert into ##zhs(username) values ( 'zhso')
select * from ##zhs
--------------------
result:
1 zhs
2 wang
3 li
4 zhso
如果把类型变为nchar,那么结果是:
1 zhs
2 wang
3 li
4 zhso
也就是说,nchar的时候,把结果都补齐到了10个;nvarchar的情况,则是不补齐,和原来输入一样,这
样也会节省空间。
5)数据类型转换
cast、convert、str都可以把数字类型转换为字符串类型,但是str更好一些
6)REPLICATE
按指定次数重复字符表达式。
REPLICATE (LastName, 2)
7)blob类型
他是比char,varchar更大的数据。太大,所以可能使用的不会太多。
8)唯一的ID
IDENTITY 是一个字段的属性,不是数据类型;
uniqueidentifier 是一个数据类型,它有下列缺点:
* 值长且难懂。这使用户难以正确键入它们,并且更难记住。
* 这些值是随机的,而且它们不支持任何使其对用户更有意义的模式。
*也没有任何方式可以决定生成 uniqueidentifier 值的顺序。它们不适用于那些依赖递增的键值的现有应用程序。
* 当 uniqueidentifier 为 16 字节时,其数据类型比其他数据类型(例如 4 字节的整数)大。这意味着使用 uniqueidentifier 键生成索引的速度相对慢于使用 int 键生成索引的速度。
所以:
* 在不要求全局唯一性或首选使用按序列增加的键时,请考虑使用 IDENTITY 属性。
*UNIQUEIDENTIFIER值不能像IDENTITY属性那样自动产生。要想为你的表格对象产生UNIQUEIDENTIFIER值,你必须指定NEWID函数为column的缺省值。
9)timestamp
timestamp 数据类型只是递增的数字,不保留日期或时间。
一个表只能有一个 timestamp 列。 每次修改或插入包含 timestamp 列的行时,就会在 timestamp 列中插入增量数据库时间戳值。
1)掩码Patindex
实际上应该叫做模式索引(Pattern Index),就是返回指定表达式中某模式第一次出现的起始位置;
在某些情况下,Patindex和where子句中的Like是一样的。
其区别:Patindex可以返回满足模式的行的索引;而Like只能执行过滤,不能返回位置。所以需要指定
位置的时候,PatIndex比较合适。
2)LIKE,模糊查找
%
包含零个或多个字符的任意字符串。
_
任何单个字符。
[ ]
指定范围(例如 [a-f])或集合(例如 [abcdef])内的任何单个字符。
[^]
不在指定范围(例如 [^a - f])或集合(例如 [^abcdef])内的任何单个字符。
比如:
LIKE 'Mc%' 将搜索以字母 Mc 开头的所有字符串(如 McBadden)。
LIKE '%inger' 将搜索以字母 inger 结尾的所有字符串(如 Ringer 和 Stringer)。
LIKE '%en%' 将搜索任意位置包含字母 en 的所有字符串(如 Bennet、Green 和 McBadden)。
LIKE '_heryl' 将搜索以字母 heryl 结尾的所有六个字母的名称(如 Cheryl 和 Sheryl)。
LIKE '[CK]ars[eo]n' 将搜索 Carsen、Karsen、Carson 和 Karson(如 Carson)。
LIKE '[M-Z]inger' 将搜索以字母 inger 结尾、以 M 到 Z 中的任何单个字母开头的所有名称(如
Ringer)。
LIKE 'M[^c]%' 将搜索以字母 M 开头,并且第二个字母不是 c 的所有名称(如 MacFeather)。
3)字符串的执行
EXECUTE sp_executesql -- 必须传递unicode字符串
N'SELECT * FROM AdventureWorks.HumanResources.Employee
WHERE ManagerID = @level',
N'@level tinyint',
@level = 109;
或者
EXECUTE('SELECT PATINDEX(''%Ref%'',DocumentSummary)
FROM Production.Document
WHERE DocumentID = 3;')
推荐前者,因为:快,特性多
4)nchar和nvarchar的区别
nvarchar是可变长度的,所以在长度不定的情况下,nvarchar是比较合适的选择。有一个细节需要注意:
USE AdventureWorks;
GO
if object_id('tempdb..##zhs') is not null
drop table ##zhs -- 临时表不在当前数据库,而是在tempdb这个特定的数据库中
create table ##zhs
( id int identity,
username nvarchar(10)
)
go
insert into ##zhs(username) values ( 'zhs')
insert into ##zhs(username) values ( 'wang ')
insert into ##zhs(username) values ( ' li')
insert into ##zhs(username) values ( 'zhso')
select * from ##zhs
--------------------
result:
1 zhs
2 wang
3 li
4 zhso
如果把类型变为nchar,那么结果是:
1 zhs
2 wang
3 li
4 zhso
也就是说,nchar的时候,把结果都补齐到了10个;nvarchar的情况,则是不补齐,和原来输入一样,这
样也会节省空间。
5)数据类型转换
cast、convert、str都可以把数字类型转换为字符串类型,但是str更好一些
6)REPLICATE
按指定次数重复字符表达式。
REPLICATE (LastName, 2)
7)blob类型
他是比char,varchar更大的数据。太大,所以可能使用的不会太多。
8)唯一的ID
IDENTITY 是一个字段的属性,不是数据类型;
uniqueidentifier 是一个数据类型,它有下列缺点:
* 值长且难懂。这使用户难以正确键入它们,并且更难记住。
* 这些值是随机的,而且它们不支持任何使其对用户更有意义的模式。
*也没有任何方式可以决定生成 uniqueidentifier 值的顺序。它们不适用于那些依赖递增的键值的现有应用程序。
* 当 uniqueidentifier 为 16 字节时,其数据类型比其他数据类型(例如 4 字节的整数)大。这意味着使用 uniqueidentifier 键生成索引的速度相对慢于使用 int 键生成索引的速度。
所以:
* 在不要求全局唯一性或首选使用按序列增加的键时,请考虑使用 IDENTITY 属性。
*UNIQUEIDENTIFIER值不能像IDENTITY属性那样自动产生。要想为你的表格对象产生UNIQUEIDENTIFIER值,你必须指定NEWID函数为column的缺省值。
9)timestamp
timestamp 数据类型只是递增的数字,不保留日期或时间。
一个表只能有一个 timestamp 列。 每次修改或插入包含 timestamp 列的行时,就会在 timestamp 列中插入增量数据库时间戳值。
相关文章推荐
- PL/SQL学习笔记-变量作用域及数据类型深入
- 学习操作oracle.sql.Blob数据类型,向数据库插入Blob数据类型的数据
- Oracle学习(三)--数据类型及常用sql语句
- PL/SQL学习笔记之数据类型中的标量、LOB
- 【数据库学习笔记】Oracle_01_sql*plus,存储结构,用户管理,常用数据类型
- JAVA_WEB Oracle 10g学习:PL/SQL数据类型
- SQL Server 2005 T-SQL 学习笔记:新数据类型
- Oracle学习(三)--数据类型及常用sql语句
- Oracle 学习:PL/SQL循序渐进全面学习教程--课程十三 使用组合数据类型* 游标操纵数据
- Sql Server2005 Transact-SQL 新兵器学习总结之-数据类型
- 深入学习Python内置数据类型之——字典(Dictionary)
- SQLServer\framework启动报异常:Module的类型初始值设定项引发异常 [转]QQ空间、新浪微博、腾讯微博等一键分享API链接代码 window下 mongodb快速安装 数据表查询所有子/父节点 C#学习笔记1
- Oracle 10g复合数据类型pl/sql集合学习六——索引表、嵌套表、变长数组
- JavaScript 参数 arguments深入了解以及javascript内置数据类型的讨论
- T-Sql学习(1) - 基本数据类型和聚合函数
- SQL Server 2005 T-SQL 学习笔记:新数据类型
- Sql Server2005 Transact-SQL 新兵器学习总结之-数据类型
- Sql Server2005 Transact-SQL 新兵器学习总结之-数据类型
- ORACLE系列学习(1)-SQL基本数据类型
- 深入学习Python内置数据类型之——字典(Dictionary)