posts - 116,  comments - 34,  trackbacks - 0
   CA
Locksley      CA
Yokomoto      CA
DeFrance      IN
Stringer      CA
MacFeather      CA
Karsen      CA
Panteley            MD
Hunter            CA
McBadden            CA

(17 row(s) affected)

B. 将 IN 与子查询一起使用
下面的示例在 titleauthor 表中查找从任一种书得到的版税少于 50% 的所有作者的 au_ids,然后从
authors 表中选择 au_ids 与 titleauthor 查询结果匹配的所有作者的姓名。结果显示有一些作者属于得
到的版税少于 50% 的一类。

USE pubs
SELECT au_lname, au_fname
FROM authors
WHERE au_id IN
   (SELECT au_id
   FROM titleauthor
   WHERE royaltyper < 50)

下面是结果集:

au_lname                                 au_fname            
---------------------------------------- --------------------
Green                                    Marjorie            
O’Leary                                  Michael             
Gringlesby                               Burt                
Yokomoto                                 Akiko               
MacFeather                               Stearns             
Ringer                                   Anne                

(6 row(s) affected)

C. 将 NOT IN 与子查询一起使用
NOT IN 将找到那些与值列表中的项目不匹配的作者。下面的示例查找至少有一种书取得不少于 50% 的版税的
作者姓名:

USE pubs
SELECT au_lname, au_fname
FROM authors
WHERE au_id NOT IN
   (SELECT au_id
   FROM titleauthor
   WHERE royaltyper < 50)

下面是结果集:

au_lname                                 au_fname            
---------------------------------------- --------------------
White                                    Johnson             
Carson                                   Cheryl              
Straight                                 Dean                
Smith                                    Meander             
Bennet                                   Abraham             
Dull                                     Ann                 
Locksley                                 Charlene            
Greene                                   Morningstar         
Blotchet-Halls                           Reginald            
del Castillo                             Innes               
DeFrance                                 Michel              
Stringer                                 Dirk                
Karsen                                   Livia               
Panteley                                 Sylvia              
Hunter                                   Sheryl              
McBadden                                 Heather             
Ringer                                   Albert              

(17 row(s) affected)

 

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

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

参数
match_expression

任何字符串数据类型的有效 SQL Server 表达式。

pattern

match_expression 中的搜索模式,可以包含下列有效 SQL Server 通配符。

通配符 描述 示例
% 包含零个或更多字符的任意字符串。 WHERE title LIKE ’%computer%’ 将查找处于书名任意位置的包含
单词 computer 的所有书名。
_(下划线) 任何单个字符。 WHERE au_fname LIKE ’_ean’ 将查找以 ean 结尾的所有 4 个字母的名字
(Dean、Sean 等)。
[ ] 指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符。 WHERE au_lname LIKE ’[C-P]arsen’
将查找以arsen 结尾且以介于 C 与 P 之间的任何单个字符开始的作者姓氏,例如,Carsen、Larsen、
Karsen 等。
[^] 不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符。 WHERE au_lname LIKE ’de[^l]%’
将查找以 de 开始且其后的字母不为 l 的所有作者的姓氏。


escape_character

字符串数据类型分类中的所有数据类型的任何有效 SQL Server 表达式。escape_character 没有默认值,
且必须仅包含一个字符。

结果类型
Boolean

结果值
如果 match_expression 匹配指定模式,LIKE 将返回 TRUE。

注释
当使用 LIKE 进行字符串比较时,模式字符串中的所有字符都有意义,包括起始或尾随空格。如果查询中的比
较要返回包含"abc "(abc 后有一个空格)的所有行,则将不会返回包含"abc"(abc 后没有空格)的列所在
行。但是可以忽略模式所要匹配的表达式中的尾随空格。如果查询中的比较要返回包含"abc"(abc 后没有空
格)的所有行,则将返回以"abc"开始且具有零个或多个尾随空格的所有行。

由于数据存储方式的原因,使用包含 char 和 varchar 数据模式的字符串比较可能无法通过 LIKE 比较。了
解每种数据类型的存储方式以及导致 LIKE 比较失败的原因十分重要。下面的示例将局部 char 变量传递给存
储过程,然后使用模式匹配查找某个作者的所有著作。在此过程中,作者的姓将作为变量传递。

CREATE PROCEDURE find_books @AU_LNAME char(20)
AS
SELECT @AU_LNAME = RTRIM(@AU_LNAME) + ’%’
SELECT t.title_id, t.title
FROM authors a, titleauthor ta, titles t
WHERE a.au_id = ta.au_id AND ta.title_id = t.title_id
   AND a.au_lname LIKE @AU_LNAME

当名字中包含的字符数小于 20 时,char 变量 (@AU_LNAME) 将包含尾随空格,这导致 find_books 过程中
没有行返回。由于 au_lname 列为 varchar 类型,所以没有尾随空格。因为尾随空格是有意义的,所以此过
程失败。

但下面的示例是成功的,因为尾随空格没有被添加到 varchar 变量中:

USE pubs
GO
CREATE PROCEDURE find_books2 @au_lname varchar(20)
AS
SELECT t.title_id, t.title
FROM authors a, titleauthor ta, titles t
WHERE a.au_id = ta.au_id AND ta.title_id = t.title_id
   AND a.au_lname LIKE @au_lname + ’%’

EXEC find_books2 ’ring’

下面是结果集:

title_id title                                                                           
-------- ---------------------------------------------------------------
MC3021   The Gourmet Microwave                                                           
PS2091   Is Anger the Enemy?                                                             
PS2091   Is Anger the Enemy?                                                             
PS2106   Life Without Fear                                                               

(4 row(s) affected)

使用 LIKE 的模式匹配
当搜索 datetime 值时,推荐使用 LIKE,因为 datetime 项可能包含各种日期部分。例如,如果将值
19981231 9:20 插入到名为 arrival_time 的列中,则子句 WHERE arrival_time = 9:20 将无法找到
9:20 字符串的精确匹配,因为 SQL Server 将其转换为 1900 年 1 月 1 日上午 9:20。然而,子句
WHERE arrival_time LIKE ’%9:20%’ 将找到匹配。

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 的早期版本兼容。

下面的一系列示例显示 ASCII LIKE 模式匹配与 Unicode LIKE 模式匹配所返回的行之间的差异:

-- ASCII pattern matching with char column
CREATE TABLE t (col1 char(30))
INSERT INTO t VALUES (’Robert King’)
SELECT *
FROM t
WHERE col1 LIKE ’% King’   -- returns 1 row

-- Unicode pattern matching with nchar column
CREATE TABLE t (col1 nchar(30))
INSERT INTO t VALUES (’Robert King’)
SELECT *
FROM t
WHERE col1 LIKE ’% King’   -- no rows returned

-- Unicode pattern matching with nchar column and RTRIM
CREATE TABLE t (col1 nchar (30))
INSERT INTO t VALUES (’Robert King’)
SELECT *
FROM t
WHERE RTRIM(col1) LIKE ’% King’   -- returns 1 row

 

说明  如果使用 LIKE 进行字符串比较,模式字符串中的所有字符都有意义,包括起始空格或尾随空格。


使用 % 通配符
如果指定 LIKE ’5%’,SQL Server 将搜索后面带有零个或多个任意字符的数字 5。

例如,此查询将显示数据库中所有的系统表,因为它们都以字母 sys 开始:

SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE ’sys%’

 

说明  请注意:系统表可以随版本不同而更改。推荐使用信息架构视图或适用的存储过程处理 SQL Server
系统表。


若要查阅非系统表的所有对象,请使用 NOT LIKE ’sys%’。如果共有 32 个对象且 LIKE 找到 13 个与模式
匹配的名称,则 NOT LIKE 将找到 19 个与 LIKE 模式不匹配的对象。

使用 LIKE ’[^s][^y][^s]%’ 模式不一定每次找到的名称都相同。可能仅得到 14 个名称(而不是 19
个),除了系统表名称外,所有以 s 开始或第二个字母为 y 或第三个字母为 s 的名称也都将从结果中消
除。这是因为用反向通配符匹配字符串是分步骤进行计算的,一次一个通配符。如果在计算过程中任一环节匹
配失败,那么就会将其消除。

将通配符作为文字使用
可以将通配符模式匹配字符串用作文字字符串,方法是将通配符放在括号中。下表显示了使用 LIKE 关键字
和 [ ] 通配符的示例。

符号 含义
LIKE ’5[%]’ 5%
LIKE ’[_]n’ _n
LIKE ’[a-cdf]’ a、b、c、d 或 f
LIKE ’[-acdf]’ -、a、c、d 或 f
LIKE ’[ [ ]’ [
LIKE ’]’ ]
LIKE ’abc[_]d%’ abc_d 和 abc_de
LIKE ’abc[def]’ abcd、abce 和 abcf


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

下例说明如何在 pubs 数据库 titles 表的 notes 列中搜索字符串"50% off when 100 or more copies
are purchased":

USE pubs
GO
SELECT notes
FROM titles
WHERE notes LIKE ’50%% off when 100 or more copies are purchased’
   ESCAPE ’%’
GO

示例
A. 使用带 % 通配符的 LIKE
下例查找 authors 表中所有区号为 415 的电话号码。

USE pubs
GO
SELECT phone
FROM authors
WHERE phone LIKE ’415%’
ORDER by au_lname
GO

下面是结果集:

phone       
------------
415 658-9932
415 548-7723
415 836-7128
415 986-7020
415 836-7128
415 534-9219
415 585-4620
415 354-7128
415 834-2919
415 843-2991
415 935-4228

(11 row(s) affected)

B. 使用带 % 通配符的 NOT LIKE
下例查找 authors 表中所有区号不是 415 的电话号码。

USE pubs
GO
SELECT phone
FROM authors
WHERE phone NOT LIKE ’415%’
ORDER BY au_lname
GO

下面是结果集:

phone       
------------
503 745-6402
219 547-9982
615 996-8275
615 297-2723
707 938-6445
707 448-4982
408 286-2428
301 946-8853
801 826-0752
801 826-0752
913 843-0462
408 496-7223

(12 row(s) affected)

C. 使用 ESCAPE 子句
下例使用 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

D. 使用 [ ] 通配符
下例查找名字为 Cheryl 或 Sheryl 的作者。

USE pubs
GO
SELECT au_lname, au_fname, phone
FROM authors
WHERE au_fname LIKE ’[CS]heryl’
ORDER BY au_lname ASC, au_fname ASC
GO

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

USE pubs
GO
SELECT au_lname, au_fname, phone
FROM authors
WHERE au_lname LIKE ’[CK]ars[eo]n’
ORDER BY au_lname ASC, au_fname ASC
GO

 

8.NOT
对布尔型输入取反。

语法
[ NOT ] boolean_expression

参数
boolean_expression

是任何有效的 Microsoft? SQL Server? 布尔表达式。

结果类型
Boolean

结果值
NOT 反转任何布尔表达式的值。

注释
可用 NOT 对一个表达式求反。

下面的表显示使用 NOT 运算符比较 TRUE 和 FALSE 值的结果。

  NOT
TRUE FALSE
FALSE TRUE
UNKNOWN UNKNOWN


示例
下面的示例查找所有预付款不超过 $5,500 的商业和心理学丛书。

USE pubs
GO
SELECT title_id, type, advance
FROM titles
WHERE (type = ’business’ OR type = ’psychology’)
   AND NOT advance > $5500
ORDER BY title_id ASC
GO

下面是结果集:

title_id type         advance              
-------- ------------ ---------------------
BU1032   business     5000.0000
BU1111   business     5000.0000
BU7832   business     5000.0000
PS2091   psychology   2275.0000
PS3333   psychology   2000.0000
PS7777   psychology   4000.0000

(6 row(s) affected)

 

9.OR
将两个条件结合起来。当在一个语句中使用多个逻辑运算符时,在 AND 运算符之后求 OR 运算符的值。但
是,通过使用括号可以更改求值的顺序。

语法
boolean_expression OR boolean_expression

参数
boolean_expression

是任何返回 TRUE、FALSE 或 UNKNOWN 的有效 Microsoft? SQL Server? 表达式。

结果类型
Boolean

结果值
当两个条件中的任何一个为 TRUE 时,OR 返回 TRUE。

注释
下表显示 OR 运算符的结果。

  TRUE FALSE UNKNOWN
TRUE TRUE TRUE TRUE
FALSE TRUE FALSE UNKNOWN
UNKNOWN TRUE UNKNOWN UNKNOWN


示例
下面的示例检索某些书名,这些书具有大于 $5,500 的预付款,并且这些书籍是商业书籍或心理学书籍。如果
没有括号,那么 WHERE 子句就会检索预付款超过 $5,500 的所有商业书籍或者心理学书籍。

USE pubs
GO
SELECT SUBSTRING(title, 1, 30) AS Title, type
FROM titles
WHERE (type = ’business’ OR type = ’psychology’) AND
   advance > $5500
ORDER BY title
GO

下面是结果集:

Title                          type        
------------------------------ ------------
Computer Phobic AND Non-Phobic psychology  
Life Without Fear              psychology  
You Can Combat Computer Stress business    

(3 row(s) affected)

posted on 2005-10-28 11:31 萌芽的叶子 阅读(283) 评论(0)  编辑 收藏 引用 所属分类: 程序思想感悟
只有注册用户登录后才能发表评论。

<2006年4月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

常用链接

留言簿(3)

随笔分类(115)

随笔档案(116)

文章分类(4)

相册

收藏夹(78)

.net中文社区

.net博客

.net英文社区

AJAX

ASP.NET 2.0

ASP.NET 学习

DataBase

ERP

E杂志

Html&Css

JavaScript

Microsoft

Open Sourse

SAP

WebCasts

WebServices

XML

其他

好友Blog

好文章连接

开发工具

控件

物流

职业经理人

设计模式

读书网站

非技术

项目管理

搜索

  •  

积分与排名

  • 积分 - 58436
  • 排名 - 106

最新评论

阅读排行榜

评论排行榜