T-SQL入门攻略之4-通配符使用 收藏
--> 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'
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wufeng4552/archive/2010/03/24/5410579.aspx