-
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)
查询记录为空值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'日用品')
模糊查询
[ 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 表:
如需以字母顺序显示介于 "Adams"(包括)和 "Carter"(不包括)之间的人,请使用下面的 SQL:
SELECT * FROM Persons
结果集:WHERE LastName BETWEEN 'Adams' AND 'Carter'
所以,请检查你的数据库是如何处理 BETWEEN....AND 操作符的! 实例 2 如需使用上面的例子显示范围之外的人,请使用 NOT 操作符:
SELECT * FROM Persons
结果集:WHERE LastName NOT BETWEEN 'Adams' AND 'Carter'
|
查询记录为空值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 模糊查询 在进行数据库查询时,有完整查询和模糊查询之分。 一般模糊查询语句如下:
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,查询内容包含通配符时 由于通配符的缘故,导致我们查询特殊字符“%”、“_”、“[”的语句无法正常实现,而把特殊字符用“[ ]”括起便可正常查询。据此我们写出以下函数:
如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' |
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式