VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 数据库 > MongoDB >
  • SQL Server 2008教程之WHERE 语法

WHERE 语法
[ WHERE <search_condition> ]
 
< search_condition > ::=
    { [ NOT ] <predicate> | ( <search_condition> ) }
    [ { AND | OR } [ NOT ] { <predicate> | ( <search_condition> ) } ]
[ ,...n ]
 
<predicate> ::=
    { expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } expression
    | string_expression [ NOT ] LIKE string_expression
  [ ESCAPE 'escape_character' ]
    | expression [ NOT ] BETWEEN expression AND expression
    | expression IS [ NOT ] NULL
    | CONTAINS
    ( { column | * } , '< contains_search_condition >' )
    | FREETEXT ( { column | * } , 'freetext_string' )
    | expression [ NOT ] IN ( subquery | expression [ ,...n ] )
    | expression { = | < > | ! = | > | > = | ! > | < | < = | ! < }
  { ALL | SOME | ANY} ( subquery )
| EXISTS ( subquery )     }
 
例子说明
SELECT 产品.*
       FROM 产品 JOIN 类别
       ON 产品.类别ID = 类别.类别ID
       WHERE 产品.库存量 = 0 AND 类别.类别名称 = N'调味品'
 
SELECT 产品.*
       FROM 产品 JOIN 类别
       ON 产品.类别ID = 类别.类别ID
       WHERE 产品.库存量 = 0  AND
              (类别.类别名称 = N'调味品'  OR 类别.类别名称 = N'日用品')
 
SELECT * FROM 雇员
       WHERE 雇用日期< CONVERT(DATETIME, '1993.1.1', 102)
说明:CONVERT将字符串'1993.1.1',转换成日期型,格式“102
 
 
SELECT * FROM 雇员
       WHERE 雇用日期< '1993.1.1'
说明:这是隐式转换,效果等同以上语句
 
 
SELECT *
FROM 雇员
WHERE Year(Getdate()).Year(雇用日期) >13
说明:Getdate()获取系统当前时间
 
 
查询两个条件之间的记录BETWEEN 
SELECT  *
FROM 雇员
WHERE 雇用日期 BETWEEN  CONVERT(DATETIME, '1993.01.01', 102)
       AND CONVERT(DATETIME, '1994.12.31', 102)
SQL BETWEEN 操作符
BETWEEN 操作符在 WHERE 子句中使用,作用是选取介于两个值之间的数据范围。
BETWEEN 操作符
操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
SQL BETWEEN 语法
SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2
原始的表 (在实例中使用:)
Persons 表:
Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing
4 Gates Bill Xuanwumen 10 Beijing
BETWEEN 操作符实例
如需以字母顺序显示介于 "Adams"(包括)和 "Carter"(不包括)之间的人,请使用下面的 SQL:
SELECT * FROM Persons
WHERE LastName
BETWEEN 'Adams' AND 'Carter'
结果集:
Id LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
重要事项:不同的数据库对 BETWEEN...AND 操作符的处理方式是有差异的。某些数据库会列出介于 "Adams" 和 "Carter" 之间的人,但不包括 "Adams" 和 "Carter" ;某些数据库会列出介于 "Adams" 和 "Carter" 之间并包括 "Adams" 和 "Carter" 的人;而另一些数据库会列出介于 "Adams" 和 "Carter" 之间的人,包括 "Adams" ,但不包括 "Carter" 。
所以,请检查你的数据库是如何处理 BETWEEN....AND 操作符的!
实例 2
如需使用上面的例子显示范围之外的人,请使用 NOT 操作符:
SELECT * FROM Persons
WHERE LastName
NOT BETWEEN 'Adams' AND 'Carter'
结果集:
Id LastName FirstName Address City
3 Carter Thomas Changan Street Beijing
4 Gates Bill Xuanwumen 10 Beijing
 
查询记录为空值NULL的记录
SELECT  *
       FROM 雇员
       WHERE  上级 IS NULL
 
 
条件OR的使用
SELECT  *
       FROM 雇员
       WHERE  雇员ID = 1 OR 雇员ID = 3 OR 雇员ID = 4
              OR 雇员ID = 7 OR 雇员ID = 9
 
条件IN的使用
SELECT *
       FROM 雇员
       WHERE 雇员ID IN (1,3,4,7,9)
 
条件NOT的使用
SELECT *
       FROM 雇员
       WHERE 雇员ID NOT IN (1,3,4,7,9)
 
将某个查询结果集作为条件使用
SELECT *
       FROM 订单明细
       WHERE 产品ID IN
              (SELECT 产品ID
                     FROM 产品 JOIN 类别
                     ON 产品.类别ID  = 类别.类别ID
                     WHERE 类别.类别名称 = N'日用品')
 
 
 
模糊查询
 
SQL 模糊查询
在进行数据库查询时,有完整查询和模糊查询之分。
一般模糊查询语句如下:
SELECT 字段 FROM 表 WHERE 某字段 Like 条件
其中关于条件,SQL提供了四种匹配模式:
1,% :表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。
比如 SELECT * FROM [user] WHERE u_name LIKE '%三%'
将会把u_name为“张三”,“张猫三”、“三脚猫”,“唐三藏”等等有“三”的记录全找出来。
另外,如果需要找出u_name中既有“三”又有“猫”的记录,请使用and条件
SELECT * FROM [user] WHERE u_name LIKE '%三%' AND u_name LIKE '%猫%'
若使用 SELECT * FROM [user] WHERE u_name LIKE '%三%猫%'
虽然能搜索出“三脚猫”,但不能搜索出符合条件的“张猫三”。

2_ 表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句:
比如 SELECT * FROM [user] WHERE u_name LIKE '_三_'
只找出“唐三藏”这样u_name为三个字且中间一个字是“三”的;
再比如 SELECT * FROM [user] WHERE u_name LIKE '三__';
只找出“三脚猫”这样name为三个字且第一个字是“三”的;

3[ ] :表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。
比如 SELECT * FROM [user] WHERE u_name LIKE '[张李王]三'
将找出“张三”、“李三”、“王三”(而不是“张李王三”);
如 [ ] 内有一系列字符(01234、abcde之类的)则可略写为“0-4”、“a-e”
SELECT * FROM [user] WHERE u_name LIKE '老[1-9]'
将找出“老1”、“老2”、……、“老9”;

4[^ ] :表示不在括号所列之内的单个字符。其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
比如 SELECT * FROM [user] WHERE u_name LIKE '[^张李王]三'
将找出不姓“张”、“李”、“王”的“赵三”、“孙三”等;
SELECT * FROM [user] WHERE u_name LIKE '老[^1-4]';
将排除“老1”到“老4”,寻找“老5”、“老6”、……

5,查询内容包含通配符时
由于通配符的缘故,导致我们查询特殊字符“%”、“_”、“[”的语句无法正常实现,而把特殊字符用“[ ]”括起便可正常查询。据此我们写出以下函数:

function sqlencode(str)
str=replace(str,"[","[[]") '此句一定要在最前
str=replace(str,"_","[_]")
str=replace(str,"%","[%]")
sqlencode=str
end function
在查询前将待查字符串先经该函数处理即可,并且在网页上连接数据库用到这类的查询语句时侯要注意:
如Select * FROM user Where name LIKE '老[^1-4]';上面 《'》老[^1-4]《'》是要有单引号的,别忘了,我经常忘!
----------------------------------------------------------------------------------------------------------
SQL模糊查询,使用like比较关键字,加上SQL里的通配符,请参考以下:
1、LIKE'Mc%' 将搜索以字母 Mc 开头的所有字符串(如 McBadden)。
2、LIKE'%inger' 将搜索以字母 inger 结尾的所有字符串(如 Ringer、Stringer)。
3、LIKE'%en%' 将搜索在任何位置包含字母 en 的所有字符串(如 Bennet、Green、McBadden)。
4、LIKE'_heryl' 将搜索以字母 heryl 结尾的所有六个字母的名称(如 Cheryl、Sheryl)。
5、LIKE'[CK]ars[eo]n' 将搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。
6、LIKE'[M-Z]inger' 将搜索以字符串 inger 结尾、以从 M 到 Z 的任何单个字母开头的所有名称(如 Ringer)。
7、LIKE'M[^c]%' 将搜索以字母 M 开头,并且第二个字母不是 c 的所有名称(如MacFeather)。
-------------------------------------------------
下面这句查询字,根据变量 zipcode_key 在邮政编码表 zipcode 中查询对应的数据,这句是判断变量 zipcode_key 为非数字时的查询语句,用 % 来匹配任意长度的字符串,从表中地址、市、省三列中查询包含关键字的所有数据项,并按省、市、地址排序。这个例子比较简单,只要你理解了方法就可以写出更复杂的查询语句。
sql = "select * from zipcode where (address like'%" & zipcode_key & "%') or (city like'%" & zipcode_key & "%') or (province like'%" & zipcode_key & "%') order by province,city,address
存储过程中使用模糊查询的例子:
SELECT * FROM Questions where QTitle like ' % [ '+ @KeyWord +' ] % ' and IsFinish = @IsFinsih
语句中成对的方括号 是书写格式的关键
 
相关例子精粹
--> Title  : T-SQL入门攻略之4-通配符使用
--> Author : wufeng4552
--> Date   : 2010-03-24
1:通配符”%” 該通配符可以與任意字符串相匹配(包括空值)
SELECT s_no as 学号,
       s_name 姓名,
       s_sex 性别 ,
       s_birthday 年龄 ,
       s_speciality 专業,
       s_avgrade 平均成绩 ,
       s_dept 系别
FROM student --依然使用上節目的數據表student
Where s_name like '王%'
以上查詢所有姓王的學生
同樣如果可以與謂詞NOT配合查詢,實現對某一類的排除查詢
如:查詢所有非姓王的學生
Where s_name NOT like '王%'
同樣如果查詢包含“王”字的學生,不僅僅是“王”字開頭的
Where s_name  like '%王%'
2:通配符”_” 該通配符可以與任意的單字符相匹配
SELECT s_no as 学号,
       s_name 姓名,
       s_sex 性别 ,
       s_birthday 年龄 ,
       s_speciality 专業,
       s_avgrade 平均成绩 ,
       s_dept 系别
FROM student --依然使用上節目的數據表student
WHERE rtrim(s_name) LIKE N'王_'
以上查詢所有王姓的,同時是兩個字的學生
注:rtrim()作用是去掉結尾的空格,因為s_name是nchar()會在後面生成空格
但是你用len()函數測試的時候又會發現長度依然是2
那是因為len()不計尾部空格,初學者對這個開始時候比較迷茫,故在此解釋
WHERE rtrim(s_name) LIKE N'王_'
等同與
WHERE s_name LIKE N'王%' and len(s_name)=2
同樣可以用謂詞實現相反的查詢
WHERE rtrim(s_name)NOT LIKE N'王_'
同樣可以查詢姓名是兩個字的學生
WHERE rtrim(s_name) LIKE N'__'
2:通配符”[]”該通配符實現在指定範圍內單字符匹配”[]”用於指定範圍,
同時如果實現與”%”,”_”(此時不錯通配符)實現匹配也可以使用通配符,將他們放入”[]”內即可。
SELECT s_no as 学号,
       s_name 姓名,
       s_sex 性别 ,
       s_birthday 年龄 ,
       s_speciality 专業,
       s_avgrade 平均成绩 ,
       s_dept 系别
FROM student --依然使用上節目的數據表student
WHERE s_no like '2006020[134]'
以上查詢學好尾數是134的學生
通過上述介紹查詢字段中包含”%”,”_”的記錄用like ”%”,”_”無法實現預期目的
創建測試數據
if object_id('student2','U')is not null drop table student2
go
CREATE TABLE student2(
s_no nchar(8) PRIMARY KEY,
s_name nchar(8)NOT NULL,
s_sex nchar(2)CHECK(s_sex = N'男' OR s_sex = N'女'),
s_birthday smalldatetime CHECK(s_birthday>='1970-1-1' AND s_birthday<='2000-1-1'),
s_speciality nvarchar(50)DEFAULT  N'计算机软件与理论',
s_avgrade numeric(3,1)CHECK(s_avgrade >= 0 AND s_avgrade <= 100),
s_dept nvarchar(50)    DEFAULT  N'计算机科学系'
);
INSERT INTO student2 Values('20060201',N'李好',N'男', '1987-1-1', N'计算机应用技术', 94.5, N'计算机系');
INSERT INTO student2 Values('20060202',N'王丫',N'女', '1987-2-23', N'计算机软件与理论', 88.8, N'计%机系');
INSERT INTO student2 Values('20060203',N'王智高',N'男', '1986-12-25', N'网络工程', 85.8, N'信%程系');
INSERT INTO student2 Values('20060204',N'赵刚',N'男', '1988-7-1', N'网络工程', 77.8, N'信息工程系');
INSERT INTO student2 Values('20060205',N'贾志',N'男', '1985-9-18', N'计算机应用技术', 45.0, N'计_机系');
INSERT INTO student2 Values('20060206',N'丽思',N'女', '1984-8-1', N'计算机应用技术', 61.3, N'计_机系');
INSERT INTO student2 Values('20060207',N'赵智远',N'男', '1983-11-2', N'电子商务', 72.8, N'电子商务系');
INSERT INTO student2 Values('20060208',N'王可',N'女', '1985-5-28', N'电子商务', 55.7, N'_商务系');
SELECT s_no 学号,
       s_name 姓名,
       s_sex 性别 ,
       s_avgrade 平均成绩 ,
       s_dept 系别 FROM student2
WHERE s_dept LIKE '%[%]%'
--以上查詢系別中含有%的紀錄
同樣可以查詢系別中含有_的記錄
WHERE s_dept LIKE '%[-]%'
3:通配符”[^]”作用與”[]”相反 用於匹配沒有在方括號中列出的字符
 
SELECT s_no as 学号,
       s_name 姓名,
       s_sex 性别 ,
       s_birthday 年龄 ,
       s_speciality 专業,
       s_avgrade 平均成绩 ,
       s_dept 系别
FROM student --依然使用上節目的數據表student
WHERE s_no like '2006020[^134]'
以上查詢學好尾數不是134的學生
等價語句為
WHERE s_no NOT like '2006020[134]
同時語句
WHERE s_no not like '2006020[^134]'
與下面語句等價
WHERE s_no like '2006020[134]'
4:使用關鍵字Escape定義轉義字符
如果列值中包含”%”,”_”,”[]”,”[^]”等字符時候可以用ESCAPE定義轉義字符的功能來實現對此類字符的查詢。
ESCAPE的作用就是將一個字符定義為轉義字符,格式如下:
Like 's1Xts2' escape 'X'
以上t是某一個通配符,s1和s2可以是任意的字符串(含通配符),其作用是將字符X定義成轉義字符,執行時DBMS將字符's1Xts2'中的通配符t作為實際值處理,從而使得t失去通配符的作用
上面的語句
SELECT s_no 学号,
       s_name 姓名,
       s_sex 性别 ,
       s_avgrade 平均成绩 ,
       s_dept 系别 FROM student2
WHERE s_dept LIKE '%[%]%'
等價於下面語句
SELECT s_no 学号,
       s_name 姓名,
       s_sex 性别 ,
       s_avgrade 平均成绩 ,
       s_dept 系别 FROM student2
WHERE s_dept LIKE '%X%%'escape 'X'
同樣查詢包含”[^]”可以這樣
 WHERE s_dept LIKE '%X[^]%'escape 'X'


相关教程