一、排序檢索數據 1.排序數據:SELECT prod_name FROM Products ORDER BY prod_name(對prod_name列以字母順序排序數據) ORDER BY子句的位置在指定一條ORDER BY子句時,應該保證它是SELECT語句中最後一條子句。如果它不是最後的子句 ...
一、排序檢索數據
1.排序數據:SELECT prod_name FROM Products ORDER BY prod_name(對prod_name列以字母順序排序數據)
ORDER BY子句的位置
在指定一條ORDER BY子句時,應該保證它是SELECT語句中最後一條子句。如果它不是最後的子句,將會出現錯誤消息。
通過非選擇列進行排序
通常,ORDER BY子句中使用的列將是為顯示而選擇的列。但是,實際上並不一定要這樣,用非檢索的列排序數據是完全合法的。
2.按多個列排序:SELECT prod_id,prod_price,prod_name FROM Products ORDER BY prod_price,prod_name
重要的是理解在按多個列排序時,排序的順序完全按規定進行。換句話說,對於上述例子中的輸出,僅在多個行具有相同的prod_price值時才對產品按prod_name進行排序。如果prod_price列中所有的值都是唯一的,則不會按prod_name排序。
3.按列位置排序:SELECT prod_id,prod_price,prod_name FROM Products ORDER BY 2,3 這個和按多個列排序結果是一樣的,無非就是本來的列名稱改成了位置序號。
可以看到,這裡的輸出與上面的查詢相同,不同之處在於ORDER BY子句。SELECT清單中指定的是選擇列的相對位置而不是列名。ORDER BY 2表示按SELECT清單中的第二個列prod_name進行排序。ORDER BY 2,3表示先按prod_price,再按prod_name進行排序。
這一技術的主要好處在於不用重新輸入列名。但它也有缺點。首先,不明確給出列名有可能造成錯用列名排序。其次,在對SELECT清單進行更改時容易錯誤地對數據進行排序(忘記對ORDER BY子句做相應的改動)。最後,如果進行排序的列不在SELECT清單中,顯然不能使用這項技術。
4.指定排序方向:SELECT prod_id,prod_price,prod_name FROM Products ORDER BY prod_price DESC
SELECT prod_id,prod_price,prod_name FROM Products ORDER BY prod_price DESC,prod_name
DESC關鍵字只應用到直接位於其前面的列名。在上例中,只對prod_price列指定DESC,對prod_name列不指定。因此,prod_price列以降序排序,而prod_name列(在每個價格內)仍然按標準的升序排序。
警告:在多個列上降序排序
如果想在多個列上進行降序排序,必須對每一列指定DESC關鍵字。
請註意,DESC是DESCENDING的縮寫,這兩個關鍵字都可以使用。與DESC相對的是ASC(或ASCENDING),在升序排序時可以指定它。但實際上,ASC沒有多大用處,因為升序是預設的(如果既不指定ASC也不指定DESC,則假定為ASC)。
提示:區分大小寫和排序順序
在對文本性數據進行排序時,A與a相同嗎?a位於B之前,還是Z之後?這些問題不是理論問題,其答案取決於資料庫的設置方式。
在字典(dictionary)排序順序中,A被視為與a相同,這是大多數資料庫管理系統的預設行為。但是,許多DBMS允許資料庫管理員在需要時改變這種行為(如果你的資料庫包含大量外語字元,可能必須這樣做)。
這裡的關鍵問題是,如果確實需要改變這種排序順序,用簡單的ORDER BY子句可能做不到。你必須請求資料庫管理員的幫助。
二、過濾數據
1.where語句:SELECT prod_name,prod_price FROM Products WHERE prod_price=3.49
警告:WHERE子句的位置
在同時使用ORDER BY和WHERE子句時,應該讓ORDER BY位於WHERE之後,否則將會產生錯誤。例如:SELECT prod_name,prod_price FROM Products WHERE prod_price=3.49 ORDER BY prod_name ASC
2.檢查單個值:SELECT prod_name,prod_price FROM Products WHERE prod_price < 0
3.不匹配檢查:SELECT vend_id,prod_name FROM Products WHERE vend_id <>'DLL01'
4.範圍值檢查:SELECT prod_name,prod_price FROM Products WHERE prod_price BETWEEN 5 AND 10
5.空值檢查: SELECT cust_name FROM customers WHERE cust_email IS NULL
三、高級數據過濾
1.AND操作符:SELECT prod_id,prod_price,prod_name FROM Products WHERE vend_id='DLL01' AND prod_price <=4
此SQL語句檢索由供應商DLL01製造且價格小於等於4美元的所有產品的名稱和價格。這條SELECT語句中的WHERE子句包含兩個條件,用AND關鍵字聯結在一起。AND指示DBMS只返回滿足所有給定條件的行。如果某個產品由供應商DLL01製造,但價格高於4美元,則不檢索它。
AND
用在WHERE子句中的關鍵字,用來指示檢索滿足所有給定條件的行。
這個例子只包含一個AND子句,因此最多有兩個過濾條件。可以增加多個過濾條件,每個條件間都要使用AND關鍵字。
說明:沒有ORDER BY子句
為了節省空間,也為了減少你的輸入,我在很多例子里省略了ORDER BY子句。因此,你的輸出完全有可能與書上的輸出不一致。雖然返回行的數量總是對的,但它們的順序可能不同。當然,如果你願意也可以加上一個ORDER BY子句,它應該放在WHERE子句之後。
2.OR操作符:SELECT vend_id,prod_price,prod_name FROM Products WHERE vend_id='DLL01' OR vend_id='BRS01'
此SQL語句檢索由任一個指定供應商製造的所有產品的產品名和價格。OR操作符告訴DBMS匹配任一條件而不是同時匹配兩個條件。
3.求值順序(AND OR)
輸入:
SELECT prod_name, prod_price FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01' AND prod_price >= 10
輸出:
問題:請看上面的結果。返回的行中有4行價格小於10美元,顯然,返回的行未按預期的進行過濾。為什麼會這樣呢?原因在於求值的順序。SQL(像多數語言一樣)在處理OR操作符前,優先處理AND操作符。當SQL看到上述WHERE子句時,它理解為:由供應商BRS01製造的價格為10美元以上的所有產品,以及由供應商DLL01製造的所有產品,而不管其價格如何。換句話說,由於AND在求值過程中優先順序更高,操作符被錯誤地組合了。
解決方法:
SELECT prod_name, prod_price FROM Products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01') AND prod_price >= 10
其實只要用括弧括起來就好了
提示:在WHERE子句中使用圓括弧
任何時候使用具有AND和OR操作符的WHERE子句,都應該使用圓括弧明確地分組操作符。不要過分依賴預設求值順序,即使它確實如你希望的那樣。使用圓括弧沒有什麼壞處,它能消除歧義。
4.IN操作符
輸入:
SELECT vend_id,prod_name,prod_price FROM Products
WHERE vend_id IN ('DLL01','BRS01')
ORDER BY prod_name
輸出:
為什麼要使用IN操作符?其優點為:
- 在有很多合法選項時,IN操作符的語法更清楚,更直觀。
- 在與其他AND和OR操作符組合使用IN時,求值順序更容易管理。
- IN操作符一般比一組OR操作符執行得更快(在上面這個合法選項很少的例子中,你看不出性能差異)。
- IN的最大優點是可以包含其他SELECT語句,能夠更動態地建立WHERE子句。第11課會對此進行詳細介紹。
IN
WHERE子句中用來指定要匹配值的清單的關鍵字,功能與OR相當。
5.NOT操作符
SELECT prod_name FROM Products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;
為什麼使用NOT?對於這裡的這種簡單的WHERE子句,使用NOT確實沒有什麼優勢。但在更複雜的子句中,NOT是非常有用的。例如,在與IN操作符聯合使用時,NOT可以非常簡單地找出與條件列表不匹配的行。
作者:今孝
出處:http://www.cnblogs.com/jinxiao-pu/p/6814043.html
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。
覺得好就點個推薦把!