SQL-基礎學習2--ORDER BY ,DESC,WHERE, BETWEEN,AND ,OR ,IN ,NOT


所使用的數據庫資料在:數據庫資料
 
第三課:排序檢索數據
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子句操作符
單引號的使用
例子列出所有不是供應商DLL01制造的產品:
輸入:
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.990
5.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子句
 
5.2     NOT操作符
WHERE子句中的NOT操作符有且只有一個功能,那就是否定其后所跟的任何條件。因為NOT從不單獨使用(它總是與其他操作符一起使用),所以它的語法與其他操作符有所不同。NOT關鍵字可以用在要過濾的列前,而不僅是在其后。
為了列出除DLL01之外的所有供應商制造的產品,可編寫如下的代碼:
輸入:
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可以非常簡單地找出與條件列表不匹配的行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM