本次講到where字句中經常用到的集中較為複雜的搜索條件,包括組合的查詢條件、IN運算符、NOT運算符、LIKE運算符和相關通配符。 學習本節需要用到一下兩張表: 以下是各複雜條件的查詢: 我們再講一個ESCAPE定義轉義符: 在使用LIKE關鍵字進行模糊查詢的時候,“%”,“_”,“[]”,單獨出 ...
本次講到where字句中經常用到的集中較為複雜的搜索條件,包括組合的查詢條件、IN運算符、NOT運算符、LIKE運算符和相關通配符。
學習本節需要用到一下兩張表:
CREATE TABLE TEACHER ( TNO INT NOT NULL, --教工號 TNAME CHAR(10) NOT NULL, --教師姓名 CNO INT NOT NULL, --課程號 SAL INT, --工資 DNAME CHAR(10) NOT NULL, --所在系 TSEX CHAR(2) NOT NULL, --性別 AGE INT NOT NULL --年齡 ) alter table TEACHER alter column SAL INT null INSERT INTO dbo.TEACHER ( TNO, TNAME, CNO, SAL, DNAME, TSEX, AGE ) VALUES ( 0, -- TNO - int '', -- TNAME - char(10) 0, -- CNO - int 0, -- SAL - int '', -- DNAME - char(10) '', -- TSEX - char(2) 0 -- AGE - int ) SELECT * FROM dbo.TEACHER INSERT INTO dbo.TEACHER VALUES( 3,'王永軍',1,1000,'電腦','女',45) INSERT INTO dbo.TEACHER VALUES( 4,'劉曉婧',2,8000,'電腦','女',23) INSERT INTO dbo.TEACHER VALUES( 5,'高維',8,6000,'電子工程','男',54) INSERT INTO dbo.TEACHER VALUES( 6,'李偉',7,230,'機械工程','女',23) INSERT INTO dbo.TEACHER VALUES( 7,'劉輝',3,0,'生物','女',65) INSERT INTO dbo.TEACHER VALUES( 8,'劉偉',9,500,'電腦','男',23) INSERT INTO dbo.TEACHER VALUES( 9,'劉靜',12,0,'經濟管理','男',45) INSERT INTO dbo.TEACHER VALUES( 10,'劉奕鍇',13,70000,'電腦','女',65) INSERT INTO dbo.TEACHER VALUES( 11,'高維',14,70000,'經濟管理','男',61) CREATE TABLE COURSE ( CNO INT NOT NULL, --課程號 CNAME CHAR(30) NOT NULL, --課程名稱 CTIME INT NOT NULL, --學時 SCOUNT INT NOT NULL, --容納人數 CTEST SMALLDATETIME NOT NULL, --考試時間 ) SELECT * FROM dbo.COURSE INSERT INTO dbo.COURSE VALUES( 4,'應用數學基礎',48,120,'2006-7-10') INSERT INTO dbo.COURSE VALUES( 5,'生物工程概論',32,80,'2006-7-8') INSERT INTO dbo.COURSE VALUES( 1,'電腦軟體基礎',32,70,'2006-7-8') INSERT INTO dbo.COURSE VALUES( 2,'電腦軟體基礎',24,80,'2006-6-28') INSERT INTO dbo.COURSE VALUES( 8,'模擬電路設計',28,90,'2006-7-10') INSERT INTO dbo.COURSE VALUES( 7,'機械設計實踐',48,68,'2006-7-14') INSERT INTO dbo.COURSE VALUES( 3,'生物化學',32,40,'2006-7-2') INSERT INTO dbo.COURSE VALUES( 9,'資料庫設計',16,80,'2006-7-1') INSERT INTO dbo.COURSE VALUES( 6,'設計理論',28,45,'2006-6-30') INSERT INTO dbo.COURSE VALUES( 10,'電腦入門',25,150,'2006-6-29') INSERT INTO dbo.COURSE VALUES( 11,'數字電路設計基礎',30,125,'2006-6-20') DROP TABLE dbo.COURSE
以下是各複雜條件的查詢:
------組合查詢條件 --1、and運算符 查詢年齡大於30的女老師 SELECT * FROM dbo.TEACHER WHERE AGE>30 AND TSEX='女' --2、多個and運算符 查詢年齡大於30的電腦系女老師 SELECT * FROM dbo.TEACHER WHERE AGE>30 AND TSEX='女' AND DNAME='電腦' --3、or運算符 查詢電腦系和生物系女老師的姓名和工資 SELECT TNAME,SAL,DNAME FROM dbo.TEACHER WHERE DNAME='電腦' OR DNAME='生物' --4、or and運算符混合使用 查詢電腦系和生物系老師的姓名和工資 SELECT TNAME,SAL,DNAME FROM dbo.TEACHER WHERE DNAME='電腦' OR DNAME='生物' AND TSEX='女' ORDER BY SAL SELECT TNAME,SAL,DNAME FROM dbo.TEACHER WHERE (DNAME='電腦' OR DNAME='生物') AND TSEX='女' ORDER BY SAL --AND OR 一起使用的時候,要註意運算符的優先順序。AND要高於OR,所以第一條線執行AND,加上括弧後才是正確的結果 --5、IN和NOT IN運算符使用 查詢電腦系和生物系的所有信息 SELECT * FROM dbo.TEACHER WHERE DNAME IN('電腦','生物') SELECT * FROM dbo.TEACHER WHERE DNAME NOT IN('電腦','生物') --使用IN有以下優點 --1、當選擇條件很多時,採用IN運算符就顯得很便捷,只需要在括弧內用逗號間隔依次羅列即可,運行效率比OR運算符要高 --2、使用IN運算符,其後面所列的條件可以使另一條SELECT語句,即子查詢,如下: SELECT * FROM dbo.TEACHER WHERE DNAME IN(SELECT DNAME FROM dbo.TEACHER WHERE AGE>65) --6、NOT BETWEEN運算符混合使用 查詢年齡不在40~50歲的教師姓名,年齡,系,性別 SELECT TNAME,AGE,DNAME,TSEX FROM dbo.TEACHER WHERE AGE NOT BETWEEN 40 AND 50 ORDER BY AGE --我們在用OR來得到相同的數據,相比之下,似乎OR更簡潔,註意,MySQL不支持NOT運算符 SELECT TNAME,AGE,DNAME,TSEX FROM dbo.TEACHER WHERE AGE<40 OR age>50 ORDER BY AGE --7、使用LIKE運算符查詢 SELECT * FROM dbo.TEACHER WHERE DNAME LIKE '電腦' --%通配符,表示任意字元匹配不計較字元的多少,可以在''中間任意位置使用,以XX開頭或結尾或中間 SELECT * FROM dbo.COURSE WHERE CNAME LIKE '%電路%' --中間有"電路"的 SELECT * FROM dbo.COURSE WHERE CNAME LIKE '%基礎' --以“基礎”結尾的 SELECT * FROM dbo.COURSE WHERE CNAME LIKE '電腦%' --以“電腦”開頭的 SELECT * FROM dbo.COURSE WHERE CNAME LIKE '電腦%基礎' --_通配符,表示任意一個字元匹配,可以在''中間任意位置使用,以XX開頭或結尾或中間 -- _代表一個字元,__代表兩個字元 SELECT * FROM dbo.COURSE WHERE CNAME LIKE '__電路__' --中間帶有“電路”的 SELECT * FROM dbo.COURSE WHERE CNAME LIKE '____基礎' --以“基礎”結尾,且前面是四個字的 SELECT * FROM dbo.COURSE WHERE CNAME LIKE '電腦__' --以“電腦”開頭,兩個字結尾的 SELECT * FROM dbo.COURSE WHERE CNAME LIKE '電腦__基礎' --中間兩個字的 SELECT * FROM dbo.COURSE WHERE CNAME LIKE '____' --查詢四個字的系 --"[]"通配符用於指定一系列的字元,只要滿足這些字元其中之一且位置出現在"[]"通配符的位置,字元串就滿足查詢條件 SELECT * FROM dbo.COURSE WHERE CNAME LIKE '[模]%' --以“模“開頭的 SELECT * FROM dbo.COURSE WHERE CNAME LIKE '[^模]%' --加上"^"表示不以"模擬"開頭的 ------以上三種通配符是可以自由組合使用的
------以上所有的運算符和條件查詢都是可以組合使用的,根據實際情況選擇適合的查詢方法才是明智的選擇
我們再講一個ESCAPE定義轉義符:
在使用LIKE關鍵字進行模糊查詢的時候,“%”,“_”,“[]”,單獨出現則會被認為是通配符。為了在字元數據類型的列中查詢是否存在百分號(%),下劃線(_),方括弧([])字元,我們就需要一種方法告訴DBMS,將LIKE表達式中的這些字元看作實際值,而不是通配符。關鍵字ESCAPE允許確定一個轉義字元,告訴DBMS,緊跟ESCAPE之後的字元是實際值。
--增加兩條數據 INSERT INTO dbo.COURSE VALUES( 11,'數字電路設計基礎%',30,125,'2006-6-20') INSERT INTO dbo.COURSE VALUES( 6,'_設計理論',28,45,'2006-6-30') ----以下是將"M"後面的"%"作為實際值,也就是說查詢的是以"%"結尾的數據 SELECT * FROM dbo.COURSE WHERE CNAME LIKE '%M%' ESCAPE 'M' ----以下是將"M"後面的"_"作為實際值,也就是說查詢的是以"_"開頭的數據 SELECT * FROM dbo.COURSE WHERE CNAME LIKE 'M_%' ESCAPE 'M'
