使用MySQL之過濾資料

hisun9發表於2024-10-16

使用WHERE子句

在SELECT語句中,資料根據WHERE子句中指定的搜尋條件進行過濾。WHERE子句在表名(FROM子句)之後給出。

比如:

select prod_name, prod_price from products where prod_price = 2.50;

輸出如下:

img

這條語句從products表中檢索兩個列,但不返回所有行,只返回prod_price值為2.50的行。

注意

  1. SQL過濾與應用過濾:

    資料也可以在應用層過濾。為此目的,SQL的SELECT語句為客戶機應用檢索出超過實際所需的資料,然後客戶機程式碼對返回資料進行迴圈,以提取出需要的行。

    通常,這種實現並不令人滿意。因此,對資料庫進行了最佳化,以便快速有效地對資料進行過濾。讓客戶機應用(或開發語言)處理資料庫的工作將會極大地影響應用的效能,並且使所建立的應用完全不具備可伸縮性。此外,如果在客戶機上過濾資料,伺服器不得不透過網路傳送多餘的資料,這將導致網路頻寬的浪費。

  2. WHERE子句的位置: 在同時使用ORDER BY和WHERE子句時,應該讓ORDER BY位於WHERE之後,否則將會產生錯誤。

WHERE子句運算子

MySQL支援表6-1列出的所有條件運算子。

img

檢索單個值

  1. 使用等號(=):

    比如:

    select prod_name, prod_price from products where prod_name = 'fuses';
    
    

    輸出如下:

    img

    檢查WHERE prod_name=‘fuses’語句,它返回prod_name的值為Fuses的一行。MySQL在執行匹配時預設不區分大小寫,所以fuses與Fuses匹配。

  2. 使用小於號(<):

    比如:

    select prod_name, prod_price from products where prod_price < 10;
    

    輸出如下:

    img

    列出價格小於10美元的所有產品。

  3. 使用小於等於號(<=):

    比如:

    select prod_name, prod_price from products where prod_price <= 10;
    

    輸出如下:

    img

    檢索價格小於等於10美元的所有產品(輸出的結果比第一個例子輸出的結果多兩種產品)

不匹配檢查

以下例子列出不是由供應商1003製造的所有產品:

select vend_id, prod_name from products where vend_id <> 1003;

輸出如下:

img

注意:

何時使用引號: 如果仔細觀察上述WHERE子句中使用的條件,會看到有的值括在單引號內(如前面使用的'fuses'),而有的值未括起來。單引號用來限定字串。如果將值與串型別的列進行比較,則需要限定引號。用來與數值列進行比較的值不用引號。

下面是相同的例子,其中使用!=而不是<>運算子:

select vend_id, prod_name from products where vend_id != 1003;

輸出如下:

img

範圍值檢查

為了檢查某個範圍的值,可使用BETWEEN運算子。其語法與其他WHERE子句的運算子稍有不同,因為它需要兩個值,即範圍的開始值和結束值。例如,BETWEEN運算子可用來檢索價格在5美元和10美元之間或日期在指定的開始日期和結束日期之間的所有產品。

下面的例子說明如何使用BETWEEN運算子,它檢索價格在5美元和10美元之間的所有產品:

select prod_name, prod_price from products where prod_price between 5 and 10;

輸出如下:

img

從這個例子中可以看到,在使用BETWEEN時,必須指定兩個值——所需範圍的低端值和高階值。這兩個值必須用AND關鍵字分隔。BETWEEN匹配範圍中所有的值,包括指定的開始值和結束值。

空值檢查

在建立表時,表設計人員可以指定其中的列是否可以不包含值。在一個列不包含值時,稱其為包含空值NULL。

NULL:無值(no value),它與欄位包含0、空字串或僅僅包含空格不同。

SELECT語句有一個特殊的WHERE子句,可用來檢查具有NULL值的列。這個WHERE子句就是IS NULL子句。

比如:

select prod_name from products where prod_price is null;

輸出如下:

img

這條語句返回沒有價格(空prod_price欄位,不是價格為0)的所有產品,由於表中沒有這樣的行,所以沒有返回資料。

但是,customers表確實包含有具有空值的列,如果在檔案中沒有某位顧客的電子郵件地址,則cust_email列將包含NULL值:

select cust_id from customers where cust_email is null;

輸出如下:

img

注意:

  • NULL與不匹配:

    在透過過濾選擇出不具有特定值的行時,你可能希望返回具有NULL值的行。但是,不行。因為未知具有特殊的含義,資料庫不知道它們是否匹配,所以在匹配過濾或不匹配過濾時不返回它們。

    因此,在過濾資料時,一定要驗證返回資料中確實給出了被過濾列具有NULL的行。

    舉個例子來說明:

    select * from customers;
    
    select cust_id, cust_email from customers where cust_email != 'ylee@coyote.com';
    

    輸出結果如下:

    第一個select語句:

    img

    第二個select語句:

    img

  • 如果我們想要檢索不具有NULL值的行,可以使用IS NOT NULL運算子

相關文章