SQLite | Where 子句
文章目錄
- 1. Where
- 1.1 篩選記錄
- 1.2 Using WHERE on Numbers
- 1.3 邏輯判斷
- 1.4 Using WHERE on Text
- 1.5 Using Where on Booleans
- 1.6 處理缺失值
- 參考資料
1. Where
我們在上一篇中介紹了 Select 語句,接下來我們將使用 Where 子句,對數據進行篩選。
-
使用Jupyter Notebook 運行 SQL 語句需安裝 ipython-sql
-
%sql 以及 %%sql 為在 Notebook 中運行 SQL 語句,在 SQLite 命令行或 SQLite Stiduo 中不需要 %sql 或 %%sql
載入 SQL 以及連接 SQLite:
%load_ext sql %sql sqlite:///DataBase/weather_stations.db 'Connected: @DataBase/weather_stations.db'1.1 篩選記錄
本文將使用 weather_stations.db 數據庫,其中包含了 STATION_DATA 表。
首先查看 STATION_DATA 表中的數據:
%sql select * from station_data limit 0,10; -- 篩選前十行 * sqlite:///DataBase/weather_stations.db Done.| 143080 | 34DDA7 | 2002 | 12 | 21 | 33.8 | 987.4 | 3.4 | 0.2 | 36 | 0 | None | 1 | 1 | 1 | 1 | 1 |
| 766440 | 39537B | 1998 | 10 | 1 | 72.7 | 1014.6 | 5.9 | 6.7 | 83.3 | 0 | None | 0 | 0 | 0 | 0 | 0 |
| 176010 | C3C6D5 | 2001 | 5 | 18 | 55.7 | None | 7.3 | 4.3 | 69.1 | 0 | None | 0 | 0 | 0 | 0 | 0 |
| 125600 | 145150 | 2007 | 10 | 14 | 33 | None | 6.9 | 2.5 | 39.7 | 0 | None | 0 | 0 | 0 | 0 | 0 |
| 470160 | EF616A | 1967 | 7 | 29 | 65.6 | None | 9.2 | 1.2 | 72.4 | 0.04 | None | 0 | 0 | 0 | 0 | 0 |
| 821930 | 1F8A7B | 1953 | 6 | 18 | 72.8 | 1007.1 | 12.4 | 3.6 | 81.3 | 0 | None | 0 | 0 | 0 | 0 | 0 |
| 478070 | D028D8 | 1981 | 6 | 27 | 73.4 | None | 7.9 | 3 | 77 | 1.93 | None | 0 | 0 | 0 | 0 | 0 |
| 719200 | C74611 | 1978 | 2 | 5 | -4.4 | 962.9 | 14.9 | 13.3 | 1.6 | 0 | 9.8 | 0 | 0 | 0 | 0 | 0 |
| 477460 | 737090 | 1962 | 8 | 14 | 72.3 | 1009.6 | 24.1 | 5.1 | 84.5 | 0 | None | 0 | 0 | 0 | 0 | 0 |
| 598550 | C5C66E | 2006 | 10 | 15 | 72.9 | None | 14.2 | 1.7 | 82 | 0 | None | 0 | 0 | 0 | 0 | 0 |
1.2 Using WHERE on Numbers
圖1 SQLite 內置比較符假如我們只對 STATION_DATA 表中 2010 年的數據感興趣,則使用 Where 子句是一個非常直接的方法。通過這個查詢,你可以只返回 year 中只等于 2010 的記錄:
%%sql select * from station_data where year == 2010 limit 0,3; -- 由于數據太多,我們只展示前 3 條記錄 * sqlite:///DataBase/weather_stations.db Done.| 719160 | BAB974 | 2010 | 1 | 22 | -22.8 | 1014.2 | None | 10.2 | -18.5 | 0 | 9.4 | 0 | 0 | 0 | 0 | 0 |
| 766870 | 7C0938 | 2010 | 3 | 22 | 48 | 871.2 | 4.4 | 1.5 | 50.8 | 0.11 | None | 1 | 1 | 1 | 1 | 1 |
| 134624 | 11CEA1 | 2010 | 2 | 17 | 46 | None | 3.4 | 2.6 | 46 | None | None | 0 | 0 | 0 | 0 | 0 |
同樣的,你也可以使用 !< 或者 <> 來篩選信息:
%%sql select * from station_data where year != 2010 limit 0,3; -- 由于數據太多,我們只展示前 3 條記錄 * sqlite:///DataBase/weather_stations.db Done.| 143080 | 34DDA7 | 2002 | 12 | 21 | 33.8 | 987.4 | 3.4 | 0.2 | 36 | 0 | None | 1 | 1 | 1 | 1 | 1 |
| 766440 | 39537B | 1998 | 10 | 1 | 72.7 | 1014.6 | 5.9 | 6.7 | 83.3 | 0 | None | 0 | 0 | 0 | 0 | 0 |
| 176010 | C3C6D5 | 2001 | 5 | 18 | 55.7 | None | 7.3 | 4.3 | 69.1 | 0 | None | 0 | 0 | 0 | 0 | 0 |
我們也可以使用 between 條件來篩選范圍:
%%sql select * from station_data where year between 2005 and 2010 limit 0,3; -- 由于數據太多,我們只展示前 3 條記錄 * sqlite:///DataBase/weather_stations.db Done.| 125600 | 145150 | 2007 | 10 | 14 | 33 | None | 6.9 | 2.5 | 39.7 | 0 | None | 0 | 0 | 0 | 0 | 0 |
| 598550 | C5C66E | 2006 | 10 | 15 | 72.9 | None | 14.2 | 1.7 | 82 | 0 | None | 0 | 0 | 0 | 0 | 0 |
| 941830 | 229317 | 2007 | 4 | 19 | 66.5 | 994.9 | None | 4 | 76.3 | 0 | None | 0 | 0 | 0 | 0 | 0 |
1.3 邏輯判斷
圖2 SQLite 內置邏輯判斷符一個 between 條件相當于表達了大于等于和小于等于,即 and 條件:
%%sql select * from station_data where year >=2005 and year <=2010 limit 0,3; -- 由于數據太多,我們只展示前 3 條記錄 * sqlite:///DataBase/weather_stations.db Done.| 125600 | 145150 | 2007 | 10 | 14 | 33 | None | 6.9 | 2.5 | 39.7 | 0 | None | 0 | 0 | 0 | 0 | 0 |
| 598550 | C5C66E | 2006 | 10 | 15 | 72.9 | None | 14.2 | 1.7 | 82 | 0 | None | 0 | 0 | 0 | 0 | 0 |
| 941830 | 229317 | 2007 | 4 | 19 | 66.5 | 994.9 | None | 4 | 76.3 | 0 | None | 0 | 0 | 0 | 0 | 0 |
也可以通過 or 條件篩選記錄:
%%sql select * from station_data where Month==3 or Month==6 or Month==9 or Month==12 limit 0,3; * sqlite:///DataBase/weather_stations.db Done.| 143080 | 34DDA7 | 2002 | 12 | 21 | 33.8 | 987.4 | 3.4 | 0.2 | 36 | 0 | None | 1 | 1 | 1 | 1 | 1 |
| 821930 | 1F8A7B | 1953 | 6 | 18 | 72.8 | 1007.1 | 12.4 | 3.6 | 81.3 | 0 | None | 0 | 0 | 0 | 0 | 0 |
| 478070 | D028D8 | 1981 | 6 | 27 | 73.4 | None | 7.9 | 3 | 77 | 1.93 | None | 0 | 0 | 0 | 0 | 0 |
這看起來有點麻煩,我們可以使用 in 來同樣篩選記錄:
%%sql select * from station_data where Month in (3,6,9,12) limit 0,3; * sqlite:///DataBase/weather_stations.db Done.| 143080 | 34DDA7 | 2002 | 12 | 21 | 33.8 | 987.4 | 3.4 | 0.2 | 36 | 0 | None | 1 | 1 | 1 | 1 | 1 |
| 821930 | 1F8A7B | 1953 | 6 | 18 | 72.8 | 1007.1 | 12.4 | 3.6 | 81.3 | 0 | None | 0 | 0 | 0 | 0 | 0 |
| 478070 | D028D8 | 1981 | 6 | 27 | 73.4 | None | 7.9 | 3 | 77 | 1.93 | None | 0 | 0 | 0 | 0 | 0 |
或者這樣寫:
%%sql select * from station_data where Month % 3 == 0 limit 0,3; * sqlite:///DataBase/weather_stations.db Done.| 143080 | 34DDA7 | 2002 | 12 | 21 | 33.8 | 987.4 | 3.4 | 0.2 | 36 | 0 | None | 1 | 1 | 1 | 1 | 1 |
| 821930 | 1F8A7B | 1953 | 6 | 18 | 72.8 | 1007.1 | 12.4 | 3.6 | 81.3 | 0 | None | 0 | 0 | 0 | 0 | 0 |
| 478070 | D028D8 | 1981 | 6 | 27 | 73.4 | None | 7.9 | 3 | 77 | 1.93 | None | 0 | 0 | 0 | 0 | 0 |
如果你不想要 3,6,9,12 月份的數據,你可以使用 not in:
%%sql select * from station_data where Month not in (3,6,9,12) limit 0,3; * sqlite:///DataBase/weather_stations.db Done.| 766440 | 39537B | 1998 | 10 | 1 | 72.7 | 1014.6 | 5.9 | 6.7 | 83.3 | 0 | None | 0 | 0 | 0 | 0 | 0 |
| 176010 | C3C6D5 | 2001 | 5 | 18 | 55.7 | None | 7.3 | 4.3 | 69.1 | 0 | None | 0 | 0 | 0 | 0 | 0 |
| 125600 | 145150 | 2007 | 10 | 14 | 33 | None | 6.9 | 2.5 | 39.7 | 0 | None | 0 | 0 | 0 | 0 | 0 |
1.4 Using WHERE on Text
圖2 SQLite 內置文字函數我們已經舉了幾個將 where 用于數字字段的例子,對于文字字段,方法也是大同小異的,同樣可以使用 =, AND, OR 和 IN 。不同的是,對于文字,需要使用單引號:
%%sql select * from station_data where report_code == '513A63'; * sqlite:///DataBase/weather_stations.db Done.| 702223 | 513A63 | 2010 | 1 | 22 | -23.1 | None | 10 | 0.8 | -15.6 | 0 | None | 0 | 0 | 0 | 0 | 0 |
注意 report_code 的格式是 text(而不是number),我們需要加上單引號 ‘513A63’ ,如果沒有單引號,SQL將會誤認為 513A63 是一列而不是一個值,這將會造成錯誤。
單引號適用于所有的文字操作,包括 IN 操作:
%%sql select * from station_data where report_code in ('513A63', '1F8A7B', 'EF616A') limit 0,3; * sqlite:///DataBase/weather_stations.db Done.| 470160 | EF616A | 1967 | 7 | 29 | 65.6 | None | 9.2 | 1.2 | 72.4 | 0.04 | None | 0 | 0 | 0 | 0 | 0 |
| 821930 | 1F8A7B | 1953 | 6 | 18 | 72.8 | 1007.1 | 12.4 | 3.6 | 81.3 | 0 | None | 0 | 0 | 0 | 0 | 0 |
| 702223 | 513A63 | 2010 | 1 | 22 | -23.1 | None | 10 | 0.8 | -15.6 | 0 | None | 0 | 0 | 0 | 0 | 0 |
在使用 Where 和 Select 時,還有一些很有用的文字操作和函數,比如 length() 函數可以計算長度,來返回 report_code 不等于 6 的記錄:
%%sql select * from station_data where length(report_code) != 6;另一個常見的操作符為一個通配符加上一個 like 表達,% 為任意長度的字符、_ 為任意單字符。如果你想要找到 report_code 中以 “A” 開頭的記錄,可以使用 ‘A%’:
%%sql select * from station_data where report_code like 'A%' limit 0,3; * sqlite:///DataBase/weather_stations.db Done.| 484750 | A38C90 | 1988 | 6 | 24 | 72.6 | None | 8.7 | 3.1 | 87.5 | 0 | None | 0 | 0 | 0 | 0 | 0 |
| 985310 | A79DEC | 2007 | 7 | 31 | 77.6 | None | 11.8 | 3.4 | 82.5 | 0 | None | 0 | 0 | 0 | 0 | 0 |
| 724505 | A49553 | 2005 | 4 | 28 | 42.7 | None | 6.8 | 11.2 | 55.4 | 0.42 | None | 0 | 0 | 0 | 0 | 0 |
如果你想要尋找以 “B” 開頭并且第三個字母是 “C” 的記錄,你可以使用下劃線(_)來作為第二個位置:
%%sql select * from station_data where report_code like 'B_C%' limit 0,3; * sqlite:///DataBase/weather_stations.db Done.| 999999 | B6C2DE | 1966 | 2 | 8 | 38.8 | 992.9 | 15.2 | 5.5 | 52.5 | 0 | None | 0 | 0 | 0 | 0 | 0 |
| 60110 | B8CB27 | 1997 | 1 | 20 | 41.7 | 1008.3 | 13.1 | 19.1 | 44.7 | 0.04 | None | 0 | 0 | 0 | 0 | 0 |
| 64080 | BECB51 | 1982 | 8 | 8 | 59 | None | 2.5 | 11 | 65.5 | 0 | None | 0 | 0 | 0 | 0 | 0 |
1.5 Using Where on Booleans
布爾值是 true 或 false 值。在某些數據庫中,使用 1、0 來代替 true 和 false,還有一些數據庫(如MySQL)允許你直接使用 true 和 false,比如:
%%sql select * from station_data where tornado == true and hail == true limit 0,3; * sqlite:///DataBase/weather_stations.db Done.| 143080 | 34DDA7 | 2002 | 12 | 21 | 33.8 | 987.4 | 3.4 | 0.2 | 36 | 0 | None | 1 | 1 | 1 | 1 | 1 |
| 724320 | 207979 | 1988 | 3 | 4 | 33.1 | 999.4 | 3.1 | 9.3 | 35.1 | 0.23 | None | 1 | 1 | 1 | 1 | 1 |
| 743920 | 2ABE7D | 1996 | 5 | 21 | 57.6 | None | 5.8 | 7.5 | 70 | 0 | None | 1 | 1 | 1 | 1 | 1 |
SQLite 之前好像不支持直接使用 true 和 false ,只能使用 1 和 0,但經測試現在也可以了
在 SQLite 中也可以使用這種形式:
%%sql select * from station_data where tornado == 1 and hail == 1 limit 0,3; * sqlite:///DataBase/weather_stations.db Done.| 143080 | 34DDA7 | 2002 | 12 | 21 | 33.8 | 987.4 | 3.4 | 0.2 | 36 | 0 | None | 1 | 1 | 1 | 1 | 1 |
| 724320 | 207979 | 1988 | 3 | 4 | 33.1 | 999.4 | 3.1 | 9.3 | 35.1 | 0.23 | None | 1 | 1 | 1 | 1 | 1 |
| 743920 | 2ABE7D | 1996 | 5 | 21 | 57.6 | None | 5.8 | 7.5 | 70 | 0 | None | 1 | 1 | 1 | 1 | 1 |
如果你正在查找為 true 的值,你甚至可以不使用 == 1 的表達,因為它的格式已經是布爾值了,因此你也可以這樣寫:
%%sql select * from station_data where tornado and hail limit 0,3; * sqlite:///DataBase/weather_stations.db Done.| 143080 | 34DDA7 | 2002 | 12 | 21 | 33.8 | 987.4 | 3.4 | 0.2 | 36 | 0 | None | 1 | 1 | 1 | 1 | 1 |
| 724320 | 207979 | 1988 | 3 | 4 | 33.1 | 999.4 | 3.1 | 9.3 | 35.1 | 0.23 | None | 1 | 1 | 1 | 1 | 1 |
| 743920 | 2ABE7D | 1996 | 5 | 21 | 57.6 | None | 5.8 | 7.5 | 70 | 0 | None | 1 | 1 | 1 | 1 | 1 |
同樣,對于 false 也有兩種表達:
%%sql select * from station_data where tornado == 0 and hail == 1; * sqlite:///DataBase/weather_stations.db Done.1.6 處理缺失值
你可能發現了某一些列包含了缺失值(null values),比如 station_pressure 和 snow_depth。Null 無法使用 == 來查找,你需要使用 IS NULL 或 IS NOT NULL 來浮現缺失值。因此,為了到所有沒有 snow_depth 數據的記錄,你可以使用以下查詢:
%%sql select * from station_data where snow_depth IS NULL limit 0,3; * sqlite:///DataBase/weather_stations.db Done.| 143080 | 34DDA7 | 2002 | 12 | 21 | 33.8 | 987.4 | 3.4 | 0.2 | 36 | 0 | None | 1 | 1 | 1 | 1 | 1 |
| 766440 | 39537B | 1998 | 10 | 1 | 72.7 | 1014.6 | 5.9 | 6.7 | 83.3 | 0 | None | 0 | 0 | 0 | 0 | 0 |
| 176010 | C3C6D5 | 2001 | 5 | 18 | 55.7 | None | 7.3 | 4.3 | 69.1 | 0 | None | 0 | 0 | 0 | 0 | 0 |
如果你想要將缺失值替換為一個確切的值,你可以使用 coalesce() 函數,如將降雨量為缺失值的數據替換為 0 ,同時篩選其中小于等于 0 的數據:
%%sql select * from station_data where coalesce(precipitation, 0) <= 0.5 limit 0,3; * sqlite:///DataBase/weather_stations.db Done.| 143080 | 34DDA7 | 2002 | 12 | 21 | 33.8 | 987.4 | 3.4 | 0.2 | 36 | 0 | None | 1 | 1 | 1 | 1 | 1 |
| 766440 | 39537B | 1998 | 10 | 1 | 72.7 | 1014.6 | 5.9 | 6.7 | 83.3 | 0 | None | 0 | 0 | 0 | 0 | 0 |
| 176010 | C3C6D5 | 2001 | 5 | 18 | 55.7 | None | 7.3 | 4.3 | 69.1 | 0 | None | 0 | 0 | 0 | 0 | 0 |
coalesce() 函數不僅可以用于 where 子句中, 還可以用于 select 語句中,如:
%%sql select report_code, coalesce(precipitation, 0) as rainfall from station_data limit 0,3; * sqlite:///DataBase/weather_stations.db Done.| 34DDA7 | 0 |
| 39537B | 0 |
| C3C6D5 | 0 |
參考資料
[1] Thomas Nield.Getting Started with SQL[M].US: O’Reilly, 2016: 29-37
相關文章:
SQL | 目錄
SQLite | SQLite 與 Pandas 比較篇之一
SQLite | Select 語句
SQLite | Group by 與 Order by 子句
SQLite | CASE 子句
SQLite | Join 語句
SQLite | 數據庫設計與 Creat Table 語句
SQLite | Insert、Delete、Updata 與 Drop 語句
總結
以上是生活随笔為你收集整理的SQLite | Where 子句的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python实现图片文件批处理
- 下一篇: SQL | 目录(持续更新)