本次講到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
如下是各複雜條件的查詢:ide
------組合查詢條件 --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以後的字符是實際值。spa
--增長兩條數據 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'