《SQL必知必會》筆記(MySQL實現)---數據過濾

這篇文章主要是學習一下SELECT語句的WHERE子句的使用和一些需要注意的問題。

在?大部分情況下,我們只需要檢索數據庫中的一些特定的數據子集而不是所有的數據。?完成這種類似操作需要指定 搜索條件(search criteria) ,搜索條件也被叫做 過濾條件(filter condition) 。在SELECT語句中,可以使用 WHERE 子句來指定過濾的搜索條件,WHERE子句在FROM子句之后給出。

簡單的過濾

首先看一個最基本的例子,從產品表中選取產品單價為3.49的行:

SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49

結果如下:

簡單的過濾.png

這條語句從Products表中檢索兩個列,并且只返回了prod_price為3.49的行。

使用WHERE子句時也可以使?ORDER BY子句,只需要注意,因該讓ORDER BY子句位于WHERE之后,否則會出現錯誤。

在繼續下一步的學習之前,還有一個問題需要討論,那就是 應該把數據過濾的操作放在應用層還是放在數據庫層 。在一些實際開發中,尤其是一些操作流程不規范的項目中,后臺喜歡把所有數據都返回給前端,要前端去對數據過濾然后渲染。一般情況下,這種做法是很不妥當的。首先,讓應用層處理數據庫的操作將會對應用的性能造成很大的影響,并且這種影響是很消極的。其次,數據庫進行優化之后,可以更快速有效的對數據進行過濾,其效率遠高于在應用層進行過濾。此外,在應用?層過濾數據,服務器將不得不通過網絡發送多余的數據,這會導致網絡帶寬的浪費。所以總的來說, 在數據庫層對數據進行過濾 是較為高效和合理的方式。

條件操作符

在使用WHERE子句進行數據過濾時,主要還是使用條件操作符來對數據進行判斷,從而選取到需要的數據。
首先看一下標準的SQL中所有的條件操作符:

操作符 說明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
!< 不小于
> 大于
>= 大于等于
!> 不大于
?BETWEEN 在指定的兩個值之間
IS NULL 為NULL值

之前已經看過了校驗相等的例子,基本上其它條件操作符的使用都和等號操作符的使用差不多,需要注意的是下面幾個操作符。

首先看一下不等于操作符。不等于操作符有兩種寫法, !=<> 這兩個操作符通常情況下是可以相互替換的,但是在不同的DBMS下可能情況會不一樣,使用時需要查閱對應的DBMS文檔。來看一個例子:

SELECT vend_id, prod_name
FROM Products
WHERE vend_id <> 'DLL01';

結果如下:

不等于操作符.png

使用 != 操作符將會得到相同的結果。

通過這個例子還想說明的一個需要注意的?地方是,WHERE子句中的條件,有些值被單引號括起來了,?有些沒有。這是因為,單引號是用來限定字符串的,如果將值與字符串類型的列進行比較,就需要限定單引號。如果是與數值類型比較的話,就不需要單引號。

當需要檢查某列的值是否在某個范圍內時,可以使用 BETWEEN 操作符?。其語法與其他的條件操作符有所不同,因為它需要兩個值,即范圍的開始值和結束值。下面這個例子說明如何使BETWEEN操作符:

SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;

結果如下:

BETWEEN操作符.png

上面這個例子是檢索單價在5和10之間的所有產品,通過這個例子可以看到,使用BETWEEN操作符時?,要使用 AND 關鍵字將指定的開始值和結束值分隔。BETWEEN語句會匹配這個范圍中所有的值,包括開始值和結束值。

還有一個需要注意的地方是,對于空值的檢查。在創建表的時候,設計人員會指定某一列是否能夠為空,當一列可以為空的時候,被稱為包含空值NULL。

NULL被定義為無值(no value),它與包含字段為0,空字符串或僅僅包含空格不同。

要判斷值是否為空,不能簡單的使用 value = NULL 。SELECT語句有一個特殊的WHERE子句,可以用來檢查具有NULL值的列。這個WHERE子句就是 IS NULL 子句。先看一個例子:

SELECT cust_name
FROM Customers
WHERE cust_email IS NULL;

結果如下:

IS NULL操作符.png

為了驗證這個檢索結果的正確性,可以使用SELECT cust_name, cust_email FROM Customers;來看一下未經過濾掉顧客信息。?

當表中沒有?IS NULL的列時,會返回一個空的結果。

還有一點需要注意的是,當通過過濾選擇不包含指定值的所有列時,可能會希望返回包含?NULL值的行,但是這做不到。因為NULL有特殊含義,數據庫不知道它們是否匹配,所以在進行匹配過濾或者非匹配過濾時,不會返回這些結果。下面用一個例子來說明這個嗯題:

SELECT cust_name, cust_email
FROM Customers
WHERE cust_email <> 'sales@villagetoys.com';

結果如下:

NULL和非匹配.png

結合之前驗證IS NULL語句檢索結果正確性的語句的檢索結果可以看出來,cust_email為NULL的行沒有被檢索出來。

最后需要提到的是,許多的DBMS擴展了標準的操作符集,提供了更高級的過濾選擇,具體的信息可以查閱對應的DBMS的文檔。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容

  • 這篇文章主要是討論通過組合WHERE子句來建立功能更強,更高級的搜索條件,其中包括NOT和IN操作符 此前我們講過...
    CoolForrest閱讀 376評論 0 1
  • 數據庫入門 數據庫: 保存有組織的數據的容器(通常是一個文件或一組文件).數據庫軟件應該稱為 DBMS(DataB...
    Mjericho閱讀 509評論 0 0
  • SQL與MySQL簡介 數據庫基礎 從SQL的角度來看,數據庫就是一個以某種有組織的方式存儲的數據集合。我們可以采...
    heming閱讀 3,124評論 1 8
  • 很多次的同學聚會,我都會驚訝于同學的成長速度飛快,反觀自己也被自己嚇一跳,速度太慢了。自己腦海深處潛意識是...
    開啟2017閱讀 328評論 2 3
  • 上上周日在雷克雅未克碰到了一個很有趣的活動,只要有能上網的智能手機,就可以每晚在音樂廳Harpa的立面上玩乓(Po...
    tftlg閱讀 311評論 0 1