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'