所使用的資料庫資料在:資料庫資料 第三課:排序檢索數據 3.1 排序數據 按單列排序 如果不排序,數據一般將以它在底層表中出現的順序顯示,這有可能是數據最初添加到表中的順序。但是,如果數據隨後進行過更新或刪除,那麼順尋將不再是當初的順序; ORDER BY 取一個或多個列的名字,併進行順序輸出
所使用的資料庫資料在:資料庫資料
第三課:排序檢索數據 3.1 排序數據 按單列排序 如果不排序,數據一般將以它在底層表中出現的順序顯示,這有可能是數據最初添加到表中的順序。但是,如果數據隨後進行過更新或刪除,那麼順尋將不再是當初的順序; ORDER BY 取一個或多個列的名字,併進行順序輸出
輸入: SELECT prod_name FROM Products ORDER BY prod_name; 輸出: 12 inch teddy bear 18 inch teddy bear 8 inch teddy bear Bird bean bag toy Fish bean bag toy King doll Queen doll Rabbit bean bag toy Raggedy Ann以字母順序排序;且需註意保證ORDER BY字句,在SELECT語句中在最後一句,否則會出錯; 3.2 按多個列排序 要按多個列排序,簡單指定列名,列名之間用逗號分開即可
輸入: SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price, prod_name; 輸出: prod_id prod_price prod_name ------- ---------- -------------------- BNBG02 3.4900 Bird bean bag toy BNBG01 3.4900 Fish bean bag toy BNBG03 3.4900 Rabbit bean bag toy RGAN01 4.9900 Raggedy Ann BR01 5.9900 8 inch teddy bear BR02 8.9900 12 inch teddy bear RYL01 9.4900 King doll RYL02 9.4900 Queen doll BR03 11.9900 18 inch teddy bear重要的是理解在按多個列排序時,排序的順序完全按規定進行。換句話說,對於上述例子中的輸出,僅在多個行具有相同的prod_price值時才對產品按prod_name進行排序。如果prod_price列中所有的值都是唯一的,則不會按prod_name排序。 3.3 按列位置排序 上面兩種情況都是按照列名進行排序,ORDER BY 還支持按相對列位置進行排序; 例子:
輸入: SELECT prod_id, prod_price, prod_name FROM Products ORDER BY 2, 3; 輸出: prod_id prod_price prod_name ------- ---------- -------------------- BNBG02 3.4900 Bird bean bag toy BNBG01 3.4900 Fish bean bag toy BNBG03 3.4900 Rabbit bean bag toy RGAN01 4.9900 Raggedy Ann BR01 5.9900 8 inch teddy bear BR02 8.9900 12 inch teddy bear RYL01 9.4900 King doll RYL02 9.4900 Queen doll BR03 11.9900 18 inch teddy bear分析: ORDER BY 2表示按SELECT清單中的第二個列prod_name進行排序。ORDER BY 2,3表示先按prod_price,再按prod_name進行排序。 3.4 指定排序方向 數據排序不限於升序排序(從A到Z),這隻是預設的排序順序。還可以使用ORDER BY子句進行降序(從Z到A)排序。為了進行降序排序,必須指定DESC關鍵字。 下麵的例子以價格降序來排序產品(最貴的排在最前面):
輸入 SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price DESC; 輸出: prod_id prod_price prod_name ------- ---------- -------------------- BR03 11.9900 18 inch teddy bear RYL01 9.4900 King doll RYL02 9.4900 Queen doll BR02 8.9900 12 inch teddy bear BR01 5.9900 8 inch teddy bear RGAN01 4.9900 Raggedy Ann BNBG01 3.4900 Fish bean bag toy BNBG02 3.4900 Bird bean bag toy BNBG03 3.4900 Rabbit bean bag to如果打算用多個列排序,該怎麼辦?下麵的例子以降序排序產品(最貴的在最前面),再加上產品名:
輸入: SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price DESC, prod_name; 輸出: prod_id prod_price prod_name ------- ---------- -------------------- BR03 11.9900 18 inch teddy bear RYL01 9.4900 King doll RYL02 9.4900 Queen doll BR02 8.9900 12 inch teddy bear BR01 5.9900 8 inch teddy bear RGAN01 4.9900 Raggedy Ann BNBG02 3.4900 Bird bean bag toy BNBG01 3.4900 Fish bean bag toy BNBG03 3.4900 Rabbit bean bag to分析▼ DESC關鍵字只應用到直接位於其前面的列名。在上例中,只對prod_price列指定DESC,對prod_name列不指定。因此,prod_price列以降序排序,而prod_name列(在每個價格內)仍然按標準的升序排序。 註意:在多個列上降序排序,如果想在多個列上進行降序排序,必須對每一列指定DESC關鍵字。 第四課:過濾數據 4.1 where 字句 只檢索所需數據需要指定搜索條件(search criteria),搜索條件也稱為過濾條件 在SELECT語句中,數據根據WHERE子句中指定的搜索條件進行過濾。WHERE子句在表名(FROM子句)之後給出,如下所示:
輸入: SELECT prod_name, prod_price FROM Products WHERE prod_price = 3.49; 輸出: prod_name prod_price ------------------- ---------- Fish bean bag toy 3.49 Bird bean bag toy 3.49 Rabbit bean bag toy 3.49分析: 這條語句從products表中檢索兩個列,但不返回所有行,只返回prod_price值為3.49的行; 註意:WHERE子句的位置 在同時使用ORDER BY和WHERE子句時,應該讓ORDER BY位於WHERE之後,否則將會產生錯誤 4.1 where 字句操作符 表4-1 WHERE子句操作符
.png)
輸入: SELECT vend_id, prod_name FROM Products WHERE vend_id <> 'DLL01' 輸出: vend_id prod_name ---------- ------------------ BRS01 8 inch teddy bear BRS01 12 inch teddy bear BRS01 18 inch teddy bear FNG01 King doll FNG01 Queen doll註意: 何時使用引號;單引號用來限定字元串。如果將值與字元串類型的列進行比較,就需要限定引號。用來與數值列進行比較的值不用引號。 4.2 範圍檢查 可以使用BETWEEN操作符,BETWEEN操作符可用來檢索價格在5美元和10美元之間的所有產品,或在指定的開始日期和結束日期之間的所有日期。 下麵的例子說明如何使用BETWEEN操作符,它檢索價格在5美元和10美元之間的所有產品:
輸入: SELECT prod_name, prod_price FROM Products WHERE prod_price BETWEEN 5 AND 10; 輸出: prod_name prod_price ------------------- ---------- 8 inch teddy bear 5.99 12 inch teddy bear 8.99 King doll 9.49 Queen doll 9.49分析: 從這個例子可以看到,在使用BETWEEN時,必須指定兩個值——所需範圍的低端值和高端值。這兩個值必須用AND關鍵字分隔。BETWEEN匹配範圍中所有的值,包括指定的開始值和結束值。 第5課:高級過濾數據(AND,OR) 這一課講授如何組合WHERE子句以建立功能更強、更高級的搜索條件。我們還將學習如何使用NOT和IN操作符。 使用邏輯操作符來聯結或改變where字句中的句子,使得條件更加高級; 5.1.1 AND操作符
輸入: SELECT prod_id, prod_price, prod_name FROM Products WHERE vend_id = 'DLL01' AND prod_price <= 4; 輸出: prod_id prod_price prod_name ------- ---------- -------------------- BNBG02 3.4900 Bird bean bag toy BNBG01 3.4900 Fish bean bag toy BNBG03 3.4900 Rabbit bean bag toy分析: 此SQL語句檢索由供應商DLL01製造且價格小於等於4美元的所有產品的名稱和價格。這條SELECT語句中的WHERE子句包含兩個條件,用AND關鍵字聯結在一起。 這個例子只包含一個AND子句,因此最多有兩個過濾條件。可以增加多個過濾條件,每個條件間都要使用AND關鍵字。 5.1.2 OR操作符 OR操作符與AND操作符正好相反,它指示DBMS檢索匹配任一條件的行。事實上,許多DBMS在OR WHERE子句的第一個條件得到滿足的情況下,就不再計算第二個條件了(在第一個條件滿足時,不管第二個條件是否滿足,相應的行都將被檢索出來)。
輸入: SELECT prod_name, prod_price FROM Products WHERE vend_id = 'DLL01' OR vend_id = ‘BRS01’; 輸出: prod_name prod_price ------------------- ---------- Fish bean bag toy 3.4900 Bird bean bag toy 3.4900 Rabbit bean bag toy 3.4900 8 inch teddy bear 5.9900 12 inch teddy bear 8.9900 18 inch teddy bear 11.9905.1.3 求值順序 AND OR 優先順序問題 假如需要列出價格為10美元及以上,且由DLL01或BRS01製造的所有產品。下麵的SELECT語句使用組合的AND和OR操作符建立了一個WHERE子句:
輸入: SELECT prod_name, prod_price FROM Products WHERE vend_id = 'DLL01' OR vend_id = ‘BRS01’ AND prod_price >= 10; 輸出: prod_name prod_price ------------------- ---------- Fish bean bag toy 3.4900 Bird bean bag toy 3.4900 Rabbit bean bag toy 3.4900 18 inch teddy bear 11.9900 Raggedy Ann 4.9900分析: 請看上面的結果。返回的行中有4行價格小於10美元,顯然,返回的行未按預期的進行過濾。為什麼會這樣呢?原因在於求值的順序。SQL(像多數語言一樣)在處理OR操作符前,優先處理AND操作符。當SQL看到上述WHERE子句時,它理解為:由供應商BRS01製造的價格為10美元以上的所有產品,以及由供應商DLL01製造的所有產品,而不管其價格如何。換句話說,由於AND在求值過程中優先順序更高,操作符被錯誤地組合了。 解決方法只需在改成 WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01') AND prod_price >=10 加上了一個優先順序更高的 小括弧就可以了; 5.2 IN操作符 IN操作符用來指定條件範圍,範圍中的每個條件都可以進行匹配。IN取一組由逗號分隔、括在圓括弧中的合法值。下麵的例子說明瞭這個操作符:
輸入: SELECT prod_name, prod_price FROM Products WHERE vend_id IN ( 'DLL01', 'BRS01' ) ORDER BY prod_name; 輸出: prod_name prod_price ------------------- ---------- 12 inch teddy bear 8.9900 18 inch teddy bear 11.9900 8 inch teddy bear 5.9900 Bird bean bag toy 3.4900 Fish bean bag toy 3.4900 Rabbit bean bag toy 3.4900 Raggedy Ann 4.9900分析: 此SELECT語句檢索由供應商DLL01和BRS01製造的所有產品。IN操作符後跟由逗號分隔的合法值,這些值必須括在圓括弧中。實際上IN操作符完成了與OR相同的功能。 為什麼要使用IN操作符?其優點為:
- 在有很多合法選項時,IN操作符的語法更清楚,更直觀。
- 在與其他AND和OR操作符組合使用IN時,求值順序更容易管理。
- IN操作符一般比一組OR操作符執行得更快
- IN的最大優點是可以包含其他SELECT語句,能夠更動態地建立WHERE子句
輸入: SELECT prod_name FROM Products WHERE NOT vend_id = 'DLL01' ORDER BY prod_name; 輸出: prod_name ------------------ 12 inch teddy bear 18 inch teddy bear 8 inch teddy bear King doll Queen dol分析: NOT 似乎也可以用<>替代,的確在上面的例子中是可以。但在更複雜的子句中,NOT是非常有用的。例如,在與IN操作符聯合使用時,NOT可以非常簡單地找出與條件列表不匹配的行。