Last Updated on 2021-05-15 by Clay
之前曾經簡略地提過 WHERE 指令可以當作 IF 條件判斷式一樣地使用,今天就繼續來紀錄 WHERE 後頭可以使用的指令。
- IN: 判斷我們要查找的欄位是否屬於 IN 函式後判斷的值
- BETWEEN: 可以一次判斷我們欄位的值屬於某個區間的有哪些
- LIKE: 可以讓我們依照某個『pattern』來判斷有哪些欄位的值符合
- %, _: 這兩個字元為所謂的『萬用字元』,可以用來製作 LIKE 的 pattern
WHERE 的基本使用
WHERE 可以使用我們寫程式常用到的『比較運算子』來進行判斷:
= | 等於 |
!= | 不等於 |
< | 小於 |
> | 大於 |
<= | 小於等於 |
>= | 大於等於 |
我們也可以使用『邏輯運算子』來將不同的判斷串在一起。
AND | 而且 |
OR | 或 |
NOT | 非 |
我們還是拿 MySQL 裡面自帶的 world 資料庫來進行示範:
select Name, SurfaceArea from country where SurfaceArea > 10000 and SurfaceArea < 20000 order by SurfaceArea desc;
Output:
Name | SurfaceArea |
New Caledonia | 18575.00 |
Fiji Islands | 18274.00 |
Kuwait | 17818.00 |
Swaziland | 17364.00 |
East Timor | 14874.00 |
Bahamas | 13878.00 |
Vanuatu | 12189.00 |
Falkland Islands | 12173.00 |
Gambia | 11295.00 |
Qatar | 11000.00 |
Jamaica | 10990.00 |
Lebanon | 10400.00 |
依照上面的指令,我們就可以查詢出 SurfaceArea 介於 10000 - 20000 之間的國家了。
IN
IN 是 WHERE 當中可以判斷多種條件的指令,這樣一來我們要判斷特定的『值』是否在我們 Table 裡的欄位時,就不用辛苦地寫很多 OR 了。
比如說我們可以像下面的指令這樣判斷多個項目:
select Name, SurfaceArea from country where SurfaceArea in (10400, 11000, 8000);
Output:
Name | SurfaceArea |
Lebanon | 10400.00 |
Qatar | 11000.00 |
從剛才介紹 WHERE 的基本使用中我們可以看出來, 10400 以及 11000 都是某個國家的表面積,而 8000 我們則不確定是否存在這個 Table 上的國家中。從返回的結果看起來,表面積 8000 的國家至少不存在於這個資料庫的 Country Table 中。
BETWEEN
BETWEEN 可以判斷我們要查找欄位的值是否位於某個區間,只需要將 BETWENN 的兩個值之間用 AND 連起來即可。
select Name, SurfaceArea from country where SurfaceArea between 10000 and 20000 order by SurfaceArea desc;
Output:
Name | SurfaceArea |
New Caledonia | 18575.00 |
Fiji Islands | 18274.00 |
Kuwait | 17818.00 |
Swaziland | 17364.00 |
East Timor | 14874.00 |
Bahamas | 13878.00 |
Vanuatu | 12189.00 |
Falkland Islands | 12173.00 |
Gambia | 11295.00 |
Qatar | 11000.00 |
Jamaica | 10990.00 |
Lebanon | 10400.00 |
我們可以使用 BETWEEN 指令達成跟上方 WHERE 的判斷式一樣的結果。
LIKE
LIKE 還滿常用於匹配字元的情況,通常搭配 "%", "_" 等等的字元一起使用。
- %: 代表著不限字元長度的匹配
- _: 代表著僅限一個字元長度的匹配
像是以下的範例:
select Name from country where Name like '%gol%';
Output:
Name |
Angola |
Mongolia |
會找到這樣的兩個國家名稱。因為 "%xxx%" 是匹配名稱當中是否有包含 "xxx" 的情況,前後都可以有『任何長度的字元』。
如果我們將程式修改一下:
select Name from country where Name like '%gol_';
Output:
Name |
Angola |
這次由於我們的指令只匹配 "gol" 前面多長字元都無所謂、可是後面只能接受『一個字元』的情況,所以這次我們的找到的結果只返回 Angola。
以上,就是關於 WHERE 一些匹配方式的心得紀錄。