
一、比較運算符
在 SQL 中,我們可以使用 WHERE 子句對條件進行篩選,在此之前,你需要了解 WHERE 子句中的比較運算符。這些比較運算符的含義你可以參見下面這張表格:

實際上你能看到,同樣的含義可能會有多種表達方式,比如小于等于,可以是(<=),也可以是不大于(!>)。同樣不等于,可以用(<>),也可以用(!=),它們的含義都是相同的,但這些符號的順序都不能顛倒,比如你不能寫(=<)。需要注意的是,你需要查看使用的 DBMS 是否支持,不同的 DBMS 支持的運算符可能是不同的,比如 Access 不支持(!=),不等于應該使用(<>)。在 MySQL 中,不支持(!>)(!<)等。
查詢所有最大生命值大于 6000 的英雄:
SELECT name, hp_max FROM heros WHERE hp_max > 6000;

查詢所有最大生命值在 5399 到 6811 之間的英雄:
SELECT name, hp_max FROM heros WHERE hp_max BETWEEN 5399 AND 6811;

對 heros 表中的hp_max字段進行空值檢查
SELECT name, hp_max FROM heros WHERE hp_max IS NULL;

二、邏輯運算符
存在多個 WHERE 條件子句,可以使用邏輯運算符:
篩選最大生命值大于 6000,最大法力大于 1700 的英雄,然后按照最大生命值和最大法力值之和從高到低進行排序
SELECT name, hp_max, mp_max FROM heros WHERE hp_max > 6000 AND mp_max > 1700 ORDER BY (hp_max+mp_max) DESC;

查詢最大生命值加最大法力值大于 8000 的英雄,或者最大生命值大于 6000 并且最大法力值大于 1700 的英雄
SELECT name, hp_max, mp_max FROM heros WHERE (hp_max+mp_max) > 8000 OR hp_max > 6000 AND mp_max > 1700 ORDER BY (hp_max+mp_max) DESC;

你能看出來相比于上一個條件查詢,這次的條件查詢多出來了 10 個英雄,這是因為我們放寬了條件,允許最大生命值 + 最大法力值大于 8000 的英雄顯示出來。另外你需要注意到,當 WHERE 子句中同時存在 OR 和 AND 的時候,AND 執(zhí)行的優(yōu)先級會更高,也就是說 SQL 會優(yōu)先處理 AND 操作符,然后再處理 OR 操作符。
如果我們對這條查詢語句 OR 兩邊的條件增加一個括號
SELECT name, hp_max, mp_max FROM heros WHERE ((hp_max+mp_max) > 8000 OR hp_max > 6000) AND mp_max > 1700 ORDER BY (hp_max+mp_max) DESC;

所以當 WHERE 子句中同時出現(xiàn) AND 和 OR 操作符的時候,你需要考慮到執(zhí)行的先后順序,也就是兩個操作符執(zhí)行的優(yōu)先級。一般來說 () 優(yōu)先級最高,其次優(yōu)先級是 AND,然后是 OR。
查詢主要定位或者次要定位是法師或是射手的英雄,同時英雄的上線時間不在 2016-01-01 到 2017-01-01 之間
SELECT name, role_main, role_assist, hp_max, mp_max, birthdate
FROM heros
WHERE (role_main IN ('法師', '射手') OR role_assist IN ('法師', '射手'))
AND DATE(birthdate) NOT BETWEEN '2016-01-01' AND '2017-01-01'
ORDER BY (hp_max + mp_max) DESC;
你能看到我把 WHERE 子句分成了兩個部分。第一部分是關(guān)于主要定位和次要定位的條件過濾,使用的是role_main in ('法師', '射手') OR role_assist in ('法師', '射手')。這里用到了 IN 邏輯運算符,同時role_main和role_assist是 OR(或)的關(guān)系。
第二部分是關(guān)于上線時間的條件過濾。NOT 代表否,因為我們要找到不在 2016-01-01 到 2017-01-01 之間的日期,因此用到了NOT BETWEEN '2016-01-01' AND '2017-01-01'。同時我們是在對日期類型數(shù)據(jù)進行檢索,所以使用到了 DATE 函數(shù),將字段 birthdate 轉(zhuǎn)化為日期類型再進行比較。
三、使用通配符進行過濾
如果我們想要匹配任意字符串出現(xiàn)的任意次數(shù),需要使用(%)通配符。
查找英雄名中包含“太”字的英雄都有哪些:
SELECT name FROM heros WHERE name LIKE '%太%';

需要說明的是不同 DBMS 對通配符的定義不同,在 Access 中使用的是
*而不是%。另外關(guān)于字符串的搜索可能是需要區(qū)分大小寫的,比如'liu%'就不能匹配上'LIU BEI'。具體是否區(qū)分大小寫還需要考慮不同的 DBMS 以及它們的配置。
如果我們想要匹配單個字符,就需要使用下劃線
_通配符。%和_的區(qū)別在于,%代表一個或多個字符,而_只代表一個字符。
查找英雄名除了第一個字以外,包含“太”字的英雄有哪些。
SELECT name FROM heros WHERE name LIKE '_%太%';

同樣需要說明的是,在 Access 中使用
?來代替_,而且在 DB2 中是不支持通配符_的,因此你需要在使用的時候查閱相關(guān)的 DBMS 文檔。
你能看出來通配符還是很有用的,尤其是在進行字符串匹配的時候。不過在實際操作過程中,我還是建議你盡量少用通配符,因為它需要消耗數(shù)據(jù)庫更長的時間來進行匹配。即使你對 LIKE 檢索的字段進行了索引,索引的價值也可能會失效。如果要讓索引生效,那么 LIKE 后面就不能以
%開頭,比如使用LIKE '%太%'或LIKE '%太'的時候就會對全表進行掃描。如果使用LIKE '太%',同時檢索的字段進行了索引的時候,則不會進行全表掃描。

