天天看點

SQL讀書筆記(二)

參考資料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之後的任意字元,不管它有多少字元

不要過度使用通配符。如果其他操作符能達到相同的目的,應該使用其他操作符。 在确實需要使用通配符時,也盡量不要把它們用在搜尋模式的開始處。把通配符置于開始處,搜尋起來是最慢的。 仔細注意通配符的位置。如果放錯地方,可能不會傳回想要的資料。

sql