现在的位置: 首页 > 综合 > 正文

T-SQL入门攻略之4

2014年09月08日 ⁄ 综合 ⁄ 共 3341字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.