在使用SQL語句進行查詢操作時,很多時候開發人員或者使用者並不是對資料表中的全部記錄感興趣,而只是想得到實際需要的資料記錄,這時就需要對查詢結果進行限制。在SQL語句中可以使用WHERE子句過濾掉不合格記錄。
1.比較查詢
在WHERE子句中可以使用比較子對數值、字元值等資訊進行查詢。比較子這裡歸納為三類:算術比較子、BETWEEN…AND運算子和IN運算子。這一節將分別對對這三種比較子的查詢方法進行介紹。最後還將介紹WHERE子句中字串和時間的比較方法。
算術比較子
SQL語句中的算術比較子主要包括=(等於)、>=(大於等於)、<=(小於等於)、>(大於)、<(小於)、!=(不等於)、 <>(不等於)、!>(不大於)、!<(不小於)。在SELECT語句的WHERE子句中可以使用算術比較子對指定列進行比較,其文法格式如下:
欄位1 比較子 值
其中,欄位1表示資料表中需要查詢的欄位列名,欄位1後面跟的是算術比較子,值表示的是指定列要比較的數值。使用比較子返回的結果是一個邏輯值。如果邏輯值為TRUE,則會返回查詢到的記錄,如果邏輯值為FALSE,則不會返回相應的查詢結果。
注意:在WHERE子句中比較的是數值型資料時,可以不使用單引號;如果是其他類型的資料(例如,字串、時間型等)則必須使用單引號將其引住。另外,WHERE子句中比較子的左側和右側的資料類型必須是相容的。
BETWEEN…AND運算子查詢指定條件範圍的記錄
BETWEEN…AND運算子可以用來查詢指定條件範圍的記錄。使用BETWEEN…AND運算子查詢時在BETWEEN運算子和AND運算子後面都需要給定一個值。其文法格式如下:
欄位1 BETWEEN 值1 AND 值2
其中,欄位1表示資料表中需要查詢的欄位;值1為給定數值中較小的值;值2為給定數值中較大的值。其最終查詢的結果也包括值1和值2本身的值。
提示:SQL中,可以使用NOT BETWEEN AND運算子來排除一些記錄。例如要查詢教師資訊表中年齡不在30~50之間的教師資訊,就可以通過NOT BETWEEN AND來實現。
IN運算子查詢與列表匹配的記錄
IN運算子查詢用來查詢與列表匹配的記錄。使用IN運算子,可以將滿足列表中滿足指定運算式的任何一個值都查詢出來。IN運算子後的屬性值可以是一個,也可以有多個,多個屬性值之間需要要用逗號分隔。其文法格式如下:
欄位1 IN(屬性值1, 屬性值2, 屬性值3…)
其中欄位1表示資料表中需要查詢的欄位;屬性值1, 屬性值2, 屬性值3分別表示需要查詢的值。屬性值既可以是數字類型的也可以是字元類型的值。如果屬性值是字元類型的值,則需要使用單引號將其引住。
字串比較
在使用SQL語句進行比較查詢時,經常會遇到字串比較問題。對字串進行比較時,常用的資料庫都可以使用比較子對字串進行比較,另外,在MySQL資料庫中還可以使用關鍵字BINARY對字串進行二進位比較。
使用比較子對字串進行比較時,比較子的左右兩側字元值應該用單引號引住。
SELECT 'mysql' = 'MySQL'
如果希望比較的字串區分大小寫,可以使用BINARY關鍵字對字串進行二進位比較。使用BINARY關鍵字,會把一個字串(數字)轉換成一個二進位對象。格式如下:
SELECT string1 比較子 BINARY string2 或SELECT BINARY string1 比較子 string2
SELECT 'mysql' = BINARY 'MySQL'
日期時間的比較
在WHERE子句中對日期值和時間進行比較時,要比較的日期和時間必須是資料庫伺服器可以接受的字串格式。例如,在學生資訊表(T_student)中,學生的出生日期被設定為DATETIME日期類型的變數。要想在WHERE子句中對學生的出生日期值進行比較,可以使用單引號將該日期值引住。
2.邏輯查詢
在SQL語句中邏輯運算子主要包括AND、OR和NOT三種。其中AND運算子用來查詢同時滿足多個條件的記錄,OR運算子用來查詢多個條件中滿足其中任一個條件的記錄,NOT運算子用來查詢滿足相反條件的記錄。
使用AND運算子查詢同時滿足多個條件的記錄
在SQL的執行操作中,很多情況下,WHERE子句並不是只希望滿足一個條件,而是希望最終查詢的結果必須同時滿足多個條件(兩個或者兩個以上)。這個時候就需要使用AND運算子。其文法格式如下:
條件1 AND 條件2
其中條件1,條件2是在WHERE子句中進行查詢時需要滿足的條件。如果希望使用AND運算子在WHERE子句中串連多個條件。可以使用下面的文法格式。
條件1 AND 條件2 AND條件3 …
這裡使用兩個AND運算子來串連3個條件。多個AND運算子進行串連操作時,每一個AND運算子兩側的值必須都為TRUE,也就是說這些條件都同時被滿足的情況下,結果才會被顯示出來。
說明:在Microsoft SQL Server資料庫中,使用“&”符號代替AND運算子表示邏輯與運算。
使用OR運算子查詢滿足任一條件的記錄
在使用SQL進行查詢操作時,有些時只是希望查詢的結果中滿足多個條件中的任一條件即可。這個時候就需要使用OR運算子。使用OR運算子可以用來查詢滿足任一條件的記錄。其文法格式如下:
條件1 OR條件2
其中條件1,條件2是在WHERE子句中進行查詢時需要的條件。這兩個條件中,只要符合其中任何一個條件,則符合該條件的記錄就會被檢索出來。如果希望使用OR運算子在WHERE子句中串連多個條件。可以使用下面的文法格式
條件1 OR條件2 OR條件3 …
這裡使用兩個OR運算子來串連3個條件。多個OR運算子進行串連操作時,兩側的條件中任何一個條件為TRUE,滿足該條件的記錄就會被顯示出來。
說明:在Microsoft SQL Server資料庫中,使用“|”符號代替OR運算子表示邏輯與運算。
使用NOT運算子對查詢條件的布爾值求反
有些時候,需要查詢不滿足指定條件的記錄,這個時候就需要使用NOT運算子。NOT運算子對查詢條件的布爾值求反。
說明:在Microsoft SQL Server資料庫中,使用“~”符號代替NOT運算子表示邏輯與運算。
這3個邏輯運算子也可以放到一個SQL語句中混合使用。在這3個邏輯運算子中,NOT的優先順序最高,AND的優先順序要高於OR。為了便於理解,一般在混合使用這3個邏輯運算子時,可以使用括弧將每一個部分括起來。
3.空值查詢
在使用SQL語句執行查詢操作時,還有一種是空值查詢。在資料表中,如果一個表的行屬性中不存在任何值的時候,也就是說該表的行屬性中沒有任何資料記錄。那麼就將其稱之為空白值。在SQL的查詢中,NULL可以用來表示空值的含義。在SQL語句中,可以使用IS NULL或者IS NOT NULL關鍵字來判斷空值。
4.使用LIKE操作符實現模糊查詢
在使用SQL語句進行查詢時,經常會遇到這樣一種情況,就是不能完全確定所需要查詢資訊的完整條件,但是這些資訊又具有某些明顯的特徵。例如,想學習SQL語言,希望到圖書館中找一些相關的資料,但是又不知道有關SQL語言的書都有哪些,這個時候一般都會在圖書管理系統中輸入關鍵字SQL,這樣與SQL有關的所有書籍就都會查到了。這就是模糊查詢。在SQL語言中就提供了用於模糊查詢的關鍵字LIKE,它需要和萬用字元“%”和“_”配合使用。
在SQL語句中,萬用字元“_”表示匹配單個字元。即在查詢語句中,一個“_”只能表示匹配一個字元。
在SQL語句中,萬用字元“%”表示匹配0個或者多個字元。即一個“%”可以表示0個字元,也可以表示一個字元,也可以表示兩個或者更多的字元。
在使用SQL執行模糊查詢時,有時資料表某個欄位中的字元值本身就含有“%”或者是“_”這兩個字元。開發人員希望在查詢時,將字元值本身就含有“%”或者是“_”兩個字元作為該字元的一部分查詢出來,這個時間就需要使用ESCAPE關鍵字對其進行轉義操作。使用ESCAPE關鍵字進行轉義操作步驟如下:
(1)在需要轉義的“%” 或者是“_”字元前加一個轉義符,該轉義符可以是一個任一字元。
(2)在ESCAPE關鍵字後制定該轉義符的名稱。
經過這兩個步驟之後,位於該轉義符之後的那個萬用字元(“%” 或者是“_”字元)就會被轉義為一個一般字元。
5.使用REGEXP關鍵字進行模式比對(regular expression)
在MySQL資料庫中,還提供了一種更加靈活的模式比對方法,就是使用REGEXP關鍵字對字串進行模式比對。使用REGEXP關鍵字對字串進行模式比對,只要是在被匹配的字串中含有與匹配模版中相匹配的子串,就被認為是模式比對。其傳回值就為TRUE。
在MySQL資料庫中,使用REGEXP關鍵字對字串進行模式比對時,可以使用一些模式比對修飾符對模式比對進行測試。
^:用來匹配字串的開始。
$:用來匹配字串的結尾。
[]:在方括弧中的任何字元都可以匹配。例如[abc]表示匹配方括弧中的字元a、字元b或者是字元c。
-:連字號用來表示字元匹配的範圍。例如[a-z]表示匹配方括弧中字元a到字元z中的任何一個字元。
+:表示用於匹配的該字元在被匹配的字串中出現至少一次或者多次。
*:表示用於匹配的該字元在被匹配的字串中出現零次或者多次。
():在圓括弧中的內容將被看做一個整體。例如(abc),表示匹配樣式(abc)的字串是abc。
{m}:其中整數m表示花括弧前的字串需要出現的次數。例如{abc}{2}表示匹配樣式{abc}{2}的字串是abcabc。
另外,REGEXP還可以對字串進行模式比對測試。
SELECT 'agf' REGEXP '[a-d]+','banana' REGEXP '(ana){2}'