參考資料SQL必知必會
對于資料庫來說我們可以想象,我們最需要的功能肯定是查詢功能,這本書裡大部分也在講解查詢功能,書上的講解非常全面,大部分也是直接照搬過來,有些地方加點自己的了解
SELECT語句就是傳回資料,無論什麼時候都是傳回檢索的值,隻要記住這點就不會,因為過長的代碼而混亂
SELECT語句
檢索單個列
SELECT prod_name FROM Products;
檢檢索多個列
SELECT prod_id, prod_name, prod_price FROM Products;
檢檢索所有列
SELECT * FROM Products;
檢索不同的值
SELECT DISTINCT vend_id FROM Products;
不能部分使用DISTINCT DISTINCT關鍵字作用于所有的列,不僅僅是跟在其後的那一列。例如,你指定SELECT DISTINCT vend_id, prod_price,除非指定的兩列完全相同,否則所有的行都會被檢索出來。
限制結果
SELECT prod_name FROM Products LIMIT 5;
上述代碼使用SELECT語句來檢索單獨的一列資料。LIMIT 5訓示MySQL等DBMS傳回不超過5行的資料。這個語句的輸出參見下面的代碼。 為了得到後面的5行資料,需要指定從哪兒開始以及檢索的行數,像這樣:
SELECT prod_name FROM Products LIMIT 5 OFFSET 5;
1、排序檢索資料
SELECT prod_name FROM Products ORDER BY prod_name;
對prod_name列以字母順序排序
ORDER BY子子句的位置句的位置 在指定一條ORDER BY子句時,應該保證它是SELECT語句中最後一條子句。如果它不是最後的子句,将會出現錯誤消息。
通通過非選擇列進行排序 過非選擇列進行排序 通常,ORDER BY子句中使用的列将是為顯示而選擇的列。但是,實際上并不一定要這樣,用非檢索的列排序資料是完全合法的。
按按多個列排序
SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price, prod_name;
按列位置排序
SELECT prod_id, prod_price, prod_name FROM Products ORDER BY 2, 3;
按按非選擇列排序 非選擇列排序 顯然,當根據不出現在SELECT清單中的列進行排序時,不能采用這項技術。但是,如果有必要,可以混合比對使用實際列名和相對列位置。
指定排序方向
SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price DESC;
降序排序,必須指定DESC關鍵字。
在多個列上降序排序 如果想在多個列上進行降序排序,必須對每一列指定DESC關鍵字。
2、過濾資料
SELECT prod_name, prod_price FROM Products WHERE prod_price = 3.49;
這條語句從products表中檢索兩個列,但不傳回所有行,隻傳回prod_price值為3.49的行
WHERE子子句操作符
= 等于
< > 不等于
!= 不等于
< 小于
<= 小于等于
! 不小于
大于
= 大于等于
!> 不大于
BETWEEN 在指定的兩個值之間
IS NULL 為NULL值
SELECT prod_name, prod_price FROM Products WHERE prod_price < 10;
範圍值檢查
SELECT prod_name, prod_price FROM Products WHERE prod_price BETWEEN 5 AND 10;
從這個例子可以看到,在使用BETWEEN時,必須指定兩個值——所需範圍的低端值和高端值。這兩個值必須用AND關鍵字分隔。BETWEEN匹 配範圍中所有的值,包括指定的開始值和結束值。
3、進階資料過濾
組合WHERE子句
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美元,則不檢索它。類似地,如果産品價格小于4美元,但不是由指定供應商制造的也不被檢索。
OR操作符
SELECT prod_name, prod_price FROM Products WHERE vend_id = ‘DLL01’ OR vend_id = BRS01’;
此SQL語句檢索由任一個指定供應商制造的所有産品的産品名和價格。OR操作符告訴DBMS比對任一條件而不是同時比對兩個條件。如果這裡 使用的是AND操作符,則沒有資料傳回(因為會建立沒有比對行的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在求值過程中優先級更高,操作符 被錯誤地組合了。 如下解決
SELECT prod_name, prod_price FROM Products WHERE (vend_id = ‘DLL01’ OR vend_id = ‘BRS01’) AND prod_price >= 10;
IN操作符
SELECT prod_name, prod_price FROM Products WHERE vend_id IN ( ‘DLL01’, ‘BRS01’ ) ORDER BY prod_name;
此SELECT語句檢索由供應商DLL01和BRS01制造的所有産品。IN操作符後跟由逗号分隔的合法值,這些值必須括在圓括号中。
功能與OR一樣
為什麼要使用IN操作符?其優點為:
在有很多合法選項時,IN操作符的文法更清楚,更直覺。 在與其他AND和OR操作符組合使用IN時,求值順序更容易管理。 IN操作符一般比一組OR操作符執行得更快(在上面這個合法選項很少的例子中,你看不出性能差異)。 IN的最大優點是可以包含其他SELECT語句,能夠更動态地建立WHERE子句。第11課會對此進行詳細介紹。
NOT操作符
SELECT prod_name FROM Products WHERE NOT vend_id = ‘DLL01’ ORDER BY prod_name;
這裡的NOT否定跟在其後的條件,是以,DBMS不是比對vend_id為DLL01,而是比對非DLL01之外的所有東西。
分析 為什麼使用NOT?對于這裡的這種簡單的WHERE子句,使用NOT确實沒有什麼優勢。但在更複雜的子句中,NOT是非常有用的。例如,在 與IN操作符聯合使用時,NOT可以非常簡單地找出與條件清單不比對的行
5、用通配符進行過濾
LIKE操作符
百分号(%)通配符
SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE ‘Fish%’;
在搜尋串中,%表示任何字元出現任意次數。
此例子使用了搜尋模式’Fish%’。在執行這條子句時,将檢索任意以Fish起頭的詞。%告訴DBMS接受Fish之後的任意字元,不管它有多少字元
不要過度使用通配符。如果其他操作符能達到相同的目的,應該使用其他操作符。 在确實需要使用通配符時,也盡量不要把它們用在搜尋模式的開始處。把通配符置于開始處,搜尋起來是最慢的。 仔細注意通配符的位置。如果放錯地方,可能不會傳回想要的資料。