当前位置: 代码迷 >> SQL >> sql话语like的用法 有些正则表达式可以通过like实现
  详细解决方案

sql话语like的用法 有些正则表达式可以通过like实现

热度:29   发布时间:2016-05-05 13:30:01.0
sql语句like的用法 有些正则表达式可以通过like实现

在SQL结构化查询语言中,LIKE语句有着至关重要的作用。
LIKE语句的语法格式是:select * from 表名 where 字段名 like 对应值(子串),它主要是针对字符型字段的,它的作用是在一个字符型字段列中检索包含对应子串的。
假设有一个数据库中有个表table1,在table1中有两个字段,分别是name和sex二者全是字符型数据。现在我们要在姓名字段中查询以“张”字开头的记录,语句如下:
select * from table1 where name like "张*"
如果要查询以“张”结尾的记录,则语句如下:
select * from table1 where name like "*张"
这里用到了通配符“*”,可以说,like语句是和通配符分不开的。下面我们就详细介绍一下通配符。

匹配类型  
模式
举例 及 代表值
说明

多个字符
*
c*c代表cc,cBc,cbc,cabdfec等
它同于DOS命令中的通配符,代表多个字符。

多个字符
%
%c%代表agdcagd等
这种方法在很多程序中要用到,主要是查询包含子串的。

特殊字符
[*]
a[*]a代表a*a
代替*

单字符
?
b?b代表brb,bFb等
同于DOS命令中的?通配符,代表单个字符

单数字
#
k#k代表k1k,k8k,k0k
大致同上,不同的是代只能代表单个数字。

字符范围
- [a-z]代表a到z的26个字母中任意一个 指定一个范围中任意一个
续上
排除 [!字符] [!a-z]代表9,0,%,*等 它只代表单个字符
数字排除 [!数字] [!0-9]代表A,b,C,d等 同上
组合类型 字符[范围类型]字符 cc[!a-d]#代表ccF#等 可以和其它几种方式组合使用
假设表table1中有以下记录:
name????????????????????????? sex
张小明    ????????? 男
李明天       男
李a天       女
王5五       男
王清五     ????? 男
下面我们来举例说明一下:
例1,查询name字段中包含有“明”字的。
select * from table1 where name like '%明%'
例2,查询name字段中以“李”字开头。
select * from table1 where name like '李*'
例3,查询name字段中含有数字的。
select * from table1 where name like '%[0-9]%'
例4,查询name字段中含有小写字母的。
select * from table1 where name like '%[a-z]%'
例5,查询name字段中不含有数字的。
select * from table1 where name like '%[!0-9]%'
以上例子能列出什么值来显而易见。但在这里,我们着重要说明的是通配符“*”与“%”的区别。
很多朋友会问,为什么我在以上查询时有个别的表示所有字符的时候用"%"而不用“*”?先看看下面的例子能分别出现什么结果:
select * from table1 where name like *明*
select * from table1 where name like %明%
大家会看到,前一条语句列出来的是所有的记录,而后一条记录列出来的是name字段中含有“明”的记录,
所以说,当我们作字符型字段包含一个子串的查询时最好采用“%”而不用“*”,用“*”的时候只在开头或者只在结尾时,而不能两端全由“*”代替任意字符的情况下。

========语法==========
LIKE???

确定给定的字符串是否与指定的模式匹配。模式可以包含常规字符和通配符字符。模式匹配过程中,常规字符必须与字符串中指定的字符完全匹配。然而,可使用字符串的任意片段匹配通配符。与使用?? =?? 和?? !=?? 字符串比较运算符相比,使用通配符可使?? LIKE?? 运算符更加灵活。如果任何参数都不属于字符串数据类型,Microsoft®?? SQL?? Server™?? 会将其转换成字符串数据类型(如果可能)。

语法
match_expression?? [?? NOT?? ]?? LIKE?? pattern?? [?? ESCAPE?? escape_character?? ]

参数
match_expression?? 任何字符串数据类型的有效?? SQL?? Server?? 表达式。
patternmatch_expression?? 中的搜索模式,可以包含下列有效?? SQL?? Server?? 通配符

1?????? %???? 包含零个或更多字符的任意字符串
示例:WHERE?? title?? LIKE?? '%computer% '???? 将查找处于书名任意位置的包含单词?? computer?? 的所有书名。

2???? _(下划线)?? 任何单个字符
示例:WHERE?? au_fname?? LIKE?? '_ean '?? 将查找以?? ean?? 结尾的所有?? 4?? 个字母的名字(Dean、Sean?? 等)。

3?????? []?? 指定范围中的任何单个字符
示例:WHERE?? au_lname?? LIKE?? '[C-P]arsen '?? 将查找以arsen?? 结尾且以介于?? C?? 与?? P?? 之间的任何单个字符开始的?? 作者姓氏,例如,Carsen、Larsen、Karsen?? 等

4?? [^]???? 不属于指定范围中的任何单个字符,与?? []?? 相反
示例:WHERE?? au_lname?? LIKE?? 'de[^l]% '?? 将查找以?? de?? 开始且其后的字母不为?? l?? 的所有作者的姓氏。

一?? 使用?? like?? 的模式匹配:
在搜索Datetime类型时,建议使用like?? .
LIKE?? 支持?? ASCII?? 模式匹配和?? Unicode?? 模式匹配。当所有参数,包括?? match_expression、pattern?? 和?? escape_character(如果有)都是?? ASCII?? 字符数据类型时,将执行?? ASCII?? 模式匹配。如果其中任何参数属于?? Unicode?? 数据类型,则所有参数将被转换为?? Unicode?? 并执行?? Unicode?? 模式匹配。当对?? Unicode?? 数据(nchar?? 或?? nvarchar?? 数据类型)使用?? LIKE?? 时,尾随空格是有意义的。但是对于非?? Unicode?? 数据,尾随空格没有意义。Unicode?? LIKE?? 与?? SQL-92?? 标准兼容。ASCII?? LIKE?? 与?? SQL?? Server?? 的早期版本兼容

二?? 使用?? %?? 通配符


例如,此查询将显示数据库中所有的系统表,因为它们都以字母?? sys?? 开始:
SELECT?? TABLE_NAME
FROM?? INFORMATION_SCHEMA.TABLES
WHERE?? TABLE_NAME?? LIKE?? 'sys% '
若要查阅非系统表的所有对象,请使用?? NOT?? LIKE?? 'sys% '。如果共有?? 32?? 个对象且?? LIKE?? 找到?? 13?? 个与模式匹配的名称,则?? NOT?? LIKE?? 将找到?? 19?? 个与?? LIKE?? 模式不匹配的对象

三?? 使用escape字句的模式匹配


可搜索包含一个或多个特殊通配符的字符串。例如,customers?? 数据库中的?? discounts?? 表可能存储含百分号?? (%)?? 的折扣值。若要搜索作为字符而不是通配符的百分号,必须提供?? ESCAPE?? 关键字和转义符。例如,一个样本数据库包含名为?? comment?? 的列,该列含文本?? 30%。若要搜索在?? comment?? 列中的任何位置包含字符串?? 30%?? 的任何行,请指定由?? WHERE?? comment?? LIKE?? '%30!%% '?? ESCAPE?? '! '?? 组成的?? WHERE?? 子句。如果不指定?? ESCAPE?? 和转义符,SQL?? Server?? 将返回所有含字符串?? 30?? 的行。

下例使用?? ESCAPE?? 子句和转义符查找?? mytbl2?? 表的?? c1?? 列中的精确字符串?? 10-15%

USE?? pubs
GO
IF?? EXISTS(SELECT?? TABLE_NAME?? FROM?? INFORMATION_SCHEMA.TABLES
WHERE?? TABLE_NAME?? =?? 'mytbl2 ')
DROP?? TABLE?? mytbl2
GO
USE?? pubs
GO
CREATE?? TABLE?? mytbl2
(
c1?? sysname
)
GO
INSERT?? mytbl2?? VALUES?? ( 'Discount?? is?? 10-15%?? off ')
INSERT?? mytbl2?? VALUES?? ( 'Discount?? is?? .10-.15?? off ')
GO
SELECT?? c1?
FROM?? mytbl2
WHERE?? c1?? LIKE?? '%10-15!%?? off% '?? ESCAPE?? '! '
GO


四?? 使用?? []?? 通配符

下例查找姓为?? Carson、Carsen、Karson?? 或?? Karsen?? 的作者所在的行。
USE?? pubs
SELECT?? au_lname,?? au_fname,?? phone
FROM?? authors
WHERE?? au_lname?? LIKE?? '[CK]ars[eo]n '
ORDER?? BY?? au_lname?? ASC,?? au_fname?? ASC