仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 626|回复: 7
打印 上一主题 下一主题

[学习教程] MSSQL编程:sql中的like统配符

[复制链接]
第二个灵魂 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:33:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
EXAMPLE存储引擎是一个不做任何事情的存根引擎。它的目的是作为MySQL源代码中的一个例子,用来演示如何开始编写一个新存储引擎。同样,它的主要兴趣是对开发者。EXAMPLE存储引擎不支持编索引。LIKE
断定给定的字符串是不是与指定的形式婚配。形式能够包括惯例字符和通配符字符。形式婚配过程当中,惯例字符必需与字符串中指定的字符完整婚配。但是,可以使用字符串的恣意片断婚配通配符。与利用=和!=字符串对照运算符比拟,利用通配符可以使LIKE运算符加倍天真。假如任何参数都不属于字符串数据范例,Microsoft®SQLServer™会将其转换成字符串数据范例(假如大概)。
语法
match_expression[NOT]LIKEpattern[ESCAPEescape_character]
参数
match_expression

任何字符串数据范例的无效SQLServer表达式。

pattern

match_expression中的搜刮形式,能够包括以下无效SQLServer通配符。
通配符形貌示例%包括零个或更多字符的恣意字符串。WHEREtitleLIKE%computer%将查找处于书名恣意地位的包括单词computer的一切书名。_(下划线)任何单个字符。WHEREau_fnameLIKE_ean将查找以ean开头的一切4个字母的名字(Dean、Sean等)。[]指定局限([a-f])或汇合([abcdef])中的任何单个字符。WHEREau_lnameLIKE[C-P]arsen将查找以arsen开头且以介于C与P之间的任何单个字符入手下手的作者姓氏,比方,Carsen、Larsen、Karsen等。[^]不属于指定局限([a-f])或汇合([abcdef])的任何单个字符。WHEREau_lnameLIKEde[^l]%将查找以de入手下手且厥后的字母不为l的一切作者的姓氏。

escape_character

字符串数据范例分类中的一切数据范例的任何无效SQLServer表达式。escape_character没有默许值,且必需仅包括一个字符。
了局范例
Boolean
了局值
假如match_expression婚配指定形式,LIKE将前往TRUE。
正文
当利用LIKE举行字符串对照时,形式字符串中的一切字符都成心义,包含肇端或跟随空格。假如查询中的对照要前往包括"abc"(abc后有一个空格)的一切行,则将不会前往包括"abc"(abc后没有空格)的列地点行。可是能够疏忽形式所要婚配的表达式中的跟随空格。假如查询中的对照要前往包括"abc"(abc后没有空格)的一切行,则将前往以"abc"入手下手且具有零个或多个跟随空格的一切行。

因为数据存储体例的缘故原由,利用包括char和varchar数据形式的字符串对照大概没法经由过程LIKE对照。懂得每种数据范例的存储体例和招致LIKE对照失利的缘故原由非常主要。上面的示例将部分char变量传送给存储历程,然后利用形式婚配查找某个作者的一切著作。在此过程当中,作者的姓将作为变量传送。

CREATEPROCEDUREfind_books@AU_LNAMEchar(20)ASSELECT@AU_LNAME=RTRIM(@AU_LNAME)+%SELECTt.title_id,t.titleFROMauthorsa,titleauthorta,titlestWHEREa.au_id=ta.au_idANDta.title_id=t.title_idANDa.au_lnameLIKE@AU_LNAME

当名字中包括的字符数小于20时,char变量(@AU_LNAME)将包括跟随空格,这招致find_books过程当中没有行前往。因为au_lname列为varchar范例,以是没有跟随空格。由于跟随空格是成心义的,以是此历程失利。

但上面的示例是乐成的,由于跟随空格没有被增加到varchar变量中:

USEpubsGOCREATEPROCEDUREfind_books2@au_lnamevarchar(20)ASSELECTt.title_id,t.titleFROMauthorsa,titleauthorta,titlestWHEREa.au_id=ta.au_idANDta.title_id=t.title_idANDa.au_lnameLIKE@au_lname+%EXECfind_books2ring

上面是了局集:

title_idtitle-----------------------------------------------------------------------MC3021TheGourmetMicrowavePS2091IsAngertheEnemy?PS2091IsAngertheEnemy?PS2106LifeWithoutFear(4row(s)affected)
利用LIKE的形式婚配
当搜刮datetime值时,保举利用LIKE,由于datetime项大概包括各类日期部分。比方,假如将值199812319:20拔出到名为arrival_time的列中,则子句WHEREarrival_time=9:20将没法找到9:20字符串的准确婚配,由于SQLServer将其转换为1900年1月1日上午9:20。但是,子句WHEREarrival_timeLIKE%9:20%将找到婚配。

LIKE撑持ASCII形式婚配和Unicode形式婚配。当一切参数,包含match_expression、pattern和escape_character(假如有)都是ASCII字符数据范例时,将实行ASCII形式婚配。假如个中任何参数属于Unicode数据范例,则一切参数将被转换为Unicode并实行Unicode形式婚配。当对Unicode数据(nchar或nvarchar数据范例)利用LIKE时,跟随空格是成心义的。可是关于非Unicode数据,跟随空格没成心义。UnicodeLIKE与SQL-92尺度兼容。ASCIILIKE与SQLServer的初期版本兼容。

上面的一系列示例显现ASCIILIKE形式婚配与UnicodeLIKE形式婚配所前往的行之间的差别:

--ASCIIpatternmatchingwithcharcolumnCREATETABLEt(col1char(30))INSERTINTOtVALUES(RobertKing)SELECT*FROMtWHEREcol1LIKE%King--returns1row--UnicodepatternmatchingwithncharcolumnCREATETABLEt(col1nchar(30))INSERTINTOtVALUES(RobertKing)SELECT*FROMtWHEREcol1LIKE%King--norowsreturned--UnicodepatternmatchingwithncharcolumnandRTRIMCREATETABLEt(col1nchar(30))INSERTINTOtVALUES(RobertKing)SELECT*FROMtWHERERTRIM(col1)LIKE%King--returns1row



申明假如利用LIKE举行字符串对照,形式字符串中的一切字符都成心义,包含肇端空格或跟随空格。


利用%通配符
假如指定LIKE5%,SQLServer将搜刮前面带有零个或多个恣意字符的数字5。

比方,此查询将显现数据库中一切的体系表,由于它们都以字母sys入手下手:

SELECTTABLE_NAMEFROMINFORMATION_SCHEMA.TABLESWHERETABLE_NAMELIKEsys%



申明请注重:体系表能够随版本分歧而变动。保举利用信息架构视图或合用的存储历程处置SQLServer体系表。



若要查阅非体系表的一切工具,请利用NOTLIKEsys%。假如共有32个工具且LIKE找到13个与形式婚配的称号,则NOTLIKE将找到19个与LIKE形式不婚配的工具。

利用LIKE[^s][^y][^s]%形式纷歧定每次找到的称号都不异。大概仅失掉14个称号(而不是19个),除体系表称号外,一切以s入手下手或第二个字母为y或第三个字母为s的称号也都将从了局中打消。这是由于用反向通配符婚配字符串是分步骤举行盘算的,一次一个通配符。假如在盘算过程当中任一环节婚配失利,那末就会将其打消。
将通配符作为笔墨利用
能够将通配符形式婚配字符串用作笔墨字符串,办法是将通配符放在括号中。下表显现了利用LIKE关头字和[]通配符的示例。
标记寄义LIKE5[%]5%LIKE[_]n_nLIKE[a-cdf]a、b、c、d或fLIKE[-acdf]-、a、c、d或fLIKE[[][LIKE]]LIKEabc[_]d%abc_d和abc_deLIKEabc[def]abcd、abce和abcf
利用ESCAPE子句的形式婚配
可搜刮包括一个或多个特别通配符的字符串。比方,customers数据库中的discounts表大概存储含百分号(%)的扣头值。若要搜刮作为字符而不是通配符的百分号,必需供应ESCAPE关头字和本义符。比方,一个样本数据库包括名为comment的列,该列含文本30%。若要搜刮在comment列中的任何地位包括字符串30%的任何行,请指定由WHEREcommentLIKE%30!%%ESCAPE!构成的WHERE子句。假如不指定ESCAPE和本义符,SQLServer将前往一切含字符串30的行。

下例申明怎样在pubs数据库titles表的notes列中搜刮字符串"50%offwhen100ormorecopiesarepurchased":

USEpubsGOSELECTnotesFROMtitlesWHEREnotesLIKE50%%offwhen100ormorecopiesarepurchasedESCAPE%GO
示例A.利用带%通配符的LIKE
下例查找authors表中一切区号为415的德律风号码。

USEpubsGOSELECTphoneFROMauthorsWHEREphoneLIKE415%ORDERbyau_lnameGO

上面是了局集:

phone------------415658-9932415548-7723415836-7128415986-7020415836-7128415534-9219415585-4620415354-7128415834-2919415843-2991415935-4228(11row(s)affected)
B.利用带%通配符的NOTLIKE
下例查找authors表中一切区号不是415的德律风号码。

USEpubsGOSELECTphoneFROMauthorsWHEREphoneNOTLIKE415%ORDERBYau_lnameGO

上面是了局集:

phone------------503745-6402219547-9982615996-8275615297-2723707938-6445707448-4982408286-2428301946-8853801826-0752801826-0752913843-0462408496-7223(12row(s)affected)
C.利用ESCAPE子句
下例利用ESCAPE子句和本义符查找mytbl2表的c1列中的准确字符串10-15%。

USEpubsGOIFEXISTS(SELECTTABLE_NAMEFROMINFORMATION_SCHEMA.TABLESWHERETABLE_NAME=mytbl2)DROPTABLEmytbl2GOUSEpubsGOCREATETABLEmytbl2(c1sysname)GOINSERTmytbl2VALUES(Discountis10-15%off)INSERTmytbl2VALUES(Discountis.10-.15off)GOSELECTc1FROMmytbl2WHEREc1LIKE%10-15!%off%ESCAPE!GO
D.利用[]通配符
下例查找名字为Cheryl或Sheryl的作者。

USEpubsGOSELECTau_lname,au_fname,phoneFROMauthorsWHEREau_fnameLIKE[CS]herylORDERBYau_lnameASC,au_fnameASCGO

下例查找姓为Carson、Carsen、Karson或Karsen的作者地点的行。

USEpubsGOSELECTau_lname,au_fname,phoneFROMauthorsWHEREau_lnameLIKE[CK]ars[eo]nORDERBYau_lnameASC,au_fnameASCGO

请拜见


表达式

函数

SELECT

WHERE

©1988-2000MicrosoftCorporation。保存一切权力。
一个语句分成两个event(实际上不止,其他可以忽略),一个table_mapevent和一个Rows_log_event。Table_mapevent是一样的,主要看Rows_log_event。
第二个灵魂 该用户已被删除
沙发
 楼主| 发表于 2015-1-19 06:10:27 | 只看该作者
发几份SQL课件,以飨阅者
不帅 该用户已被删除
板凳
发表于 2015-1-24 08:27:34 | 只看该作者
如果处理少量数据,比如几百条记录的数据,我不知道这两种情况哪个效率更高,如果处理大量数据呢?比如有表中有20万条记录.
柔情似水 该用户已被删除
地板
发表于 2015-1-31 22:40:09 | 只看该作者
外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。
再现理想 该用户已被删除
5#
发表于 2015-2-7 01:12:08 | 只看该作者
需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。
谁可相欹 该用户已被删除
6#
发表于 2015-2-19 07:20:47 | 只看该作者
其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!
兰色精灵 该用户已被删除
7#
发表于 2015-3-6 14:00:23 | 只看该作者
每天坚持做不一样的是,认真做笔录,定时复习。一个月你就可以有一定的收获。当然如果你想在sql方面有一定的造诣,你少不了需要看很多很多的书籍了。
因胸联盟 该用户已被删除
8#
发表于 2015-3-20 09:12:24 | 只看该作者
语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-6-3 18:39

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表