由于本人使用的mac,第一次涉及數(shù)據(jù)庫方面知識,軟件與環(huán)境配置都不是那么熟悉,安裝MySQL還有GUI客戶端的安裝使用都是參照這位同學:不會停的蝸牛非常感謝!
分別為
安裝SQL:圖解Mac下如何安裝管理MySQL
使用MySQL Workbench
這里寫下SQL必知必會的前幾章的筆記
目錄:
- 檢索數(shù)據(jù)
- 排序檢索數(shù)據(jù)
- 過濾數(shù)據(jù)
- 高級數(shù)據(jù)過濾
一、檢索數(shù)據(jù)
簡單的
SELECT * FROM XXX 檢索出XXX表中的所有列
SELECT Y, Z, W FROM XXX 檢索出XXX表中的列,如果有多個則用逗號隔開
SELECT DISTINCT Y FROM XXX 檢索出XXX表中不同的值,返回的是不同值
限制結果:
SELECT TOP5 prod_name FROM XXX;只檢索前5行數(shù)據(jù)
SELECT prod_name FROM XXX
FETCH FIRST 5 ROWS ONLY;//使用DB2的語法
SELECT prod_name FROM xxx WHERE ROWNUM <=5;
-- 使用Oracle時的語法
SELECT prod_name FROM xxx LIMIT 5;
-- 使用MySQL、MariaDB或者SQLite需要使用LIMIT字句。
SELECT prod_name FROM xxx LIMIT 5 OFFSET 5;
-- 為了得到后面的5行數(shù)據(jù),即第一個數(shù)字指從哪開始,第二個數(shù)字是檢索的行數(shù)
注意:第0行
第一個被檢索的行是第0行,而不是第一行
MySQL支持簡化版的
LIMIT 4 OFFSET 3
-- 可以簡化為
LIMIT 3,4
-- 之前的值對應 LIMIT,之后的值對應 OFFSET
使用注釋:行內注釋
SELECT prod_name -- 這是一條注釋
FROM Products;
- 注釋使用
--(兩個連字符)嵌在行內。--之后的文本就是注釋 - 在一行的開始處使用
#,這一整行都將作為注釋。
/* SELECT prod_name, vend_id
FROM Products; */
SELECT prod_name
FROM Products;
-
也可以進行多行注釋,注釋可以在腳本的任何位置停止和開始。
注釋從
/*開始,到*/結束,/*和*/之間的任何內容都是注釋。這種方式常用于給代碼加注釋,
二、排序檢索數(shù)據(jù)
SELECT prod_name
FROM Products
ORDER BY prod_name
使用ORDER BY這樣DBMS軟件對prod_name列以字母順序排列數(shù)據(jù)
警告??:在指定一條ORDER BY子句的時候,保證它是SELECT語句中最后一條子句,不然的話會出現(xiàn)錯誤信息
也可以通過非選擇列進行排序
通常,ORDER BY子句中使用的列將是為顯示而選擇的列。但是,實際上并不一定要這樣,用非檢索的列排序數(shù)據(jù)是完全合法的。
按照多個列排序
經(jīng)常我們需要不止一個列進行數(shù)據(jù)排序,如果要顯示雇員的名單,可能希望按姓和名排序,(先按照姓排序,然后在每個姓中再按照名排序),這樣對于重姓來說很有用。
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price, prod_name;
重要是理解在按多個列排序時,排序完全按規(guī)定進行,僅在相同的prod_price時才對prod_name進行排序
按列位置排序
除了能用列名指出排序順序外,ORDER BY還支持按相對列位置進行排序。
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 2, 3;
這里和上面的查詢結果相同,不同之處在于ORDER BY子句.SELECT清單中指定的是選擇列的相對位置而不是列名.ORDER BY 2表示按SELECT 清單中的第二個列prod_name進行排序
這一技術的主要好處在于不用重新輸入列名,也有缺點,
1.不能明確給出列名可能造成錯用列名排序,
2.其次在SELECT清單進行更改是容易錯誤地對數(shù)據(jù)進行排序(可能忘記對ORDER BY子句做改動),
3.如果排序的列不在SELECT清單中,不能使用這項技術[不能按非選擇列進行排序]
指定排序方向
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC;
數(shù)據(jù)排序不限升序排序(從A—>Z)這是默認的排序方式,為了進行降序排序,必須指定DESC關鍵字
多個列排序
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC, prod_name;
/* DESC關鍵字只應用到直接位于其前面的列名,所以上述例子prod_price是降序排列,而prod_name則是升序排列*/
三、過濾數(shù)據(jù)
使用SELECT語句的WHERE子句指定搜索條件
SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49;
這條語句從products表中檢索兩個列,但不返回所有行,只返回prod_price值為3.49的行
數(shù)據(jù)也可以在應用層過濾。為此,SQL的
SELECT語句為客戶端應用檢索出超過實際所需的數(shù)據(jù),然后客戶端代碼對返回數(shù)據(jù)進行循環(huán),提取出需要的行。通常,這種做法極其不妥。優(yōu)化數(shù)據(jù)庫后可以更快速有效地對數(shù)據(jù)進行過濾。而讓客戶端應用(或開發(fā)語言)處理數(shù)據(jù)庫的工作將會極大地影響應用的性能,并且使所創(chuàng)建的應用完全不具備可伸縮性。此外,如果在客戶端過濾數(shù)據(jù),服務器不得不通過網(wǎng)絡發(fā)送多余的數(shù)據(jù),這將導致網(wǎng)絡帶寬的浪費。
警告??:WHERE子句的位置
在同時使用ORDER BY 和 WHERE子句時,應該讓ORDER BY位于WHERE之后
WHERE子句操作符
| 操作符 | 說明 |
|---|---|
| = | 等于 |
| <> | 不等于 |
| != | 不等于 |
| < | 小于 |
| <= | 小于等于 |
| ! | 不小于 |
| > | 大于 |
| >= | 大于等于 |
| !> | 不大于 |
| BETWEEN | 在指定的兩個值之間 |
| IS NULL | 為NULL值 |
不匹配檢查
SELECT vend_id, prod_name
FROM Products
WHERE vend_id <> 'DLL01'
/*何時使用引號?:單引號用來限定字符串.如果將值與字符串的列進行比較,就需要限定引號.用來與數(shù)值列進行比較的值不用引號*/
警告??:是使用!=還是<>?
要根據(jù)你所使用的DBMS,具體請參考相應的DBMS文檔
范圍值檢查
要檢查某個范圍的值,可以使用BETWEEN操作符
范例:
SELECT prod_name, prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;
/*在使用BETWEEN時,必須指定兩個值——所需范圍的低端值和高端值。這兩個值必須用AND關鍵字分隔。BETWEEN匹配范圍中所有的值,包括指定的開始值和結束值。*/
空值檢查
再創(chuàng)建表時,表設計人員可以指定其中的列能否不包含值.在一個列不包含值時,稱其包含空值NULL
無值(no value),它與字段包含0、空字符串或僅僅包含空格不同。
確定值是否為
NULL,不能簡單地檢查是否= NULL。SELECT語句有一個特殊的WHERE子句,可用來檢查具有NULL值的列。這個WHERE子句就是IS NULL子句。其語法如下:
SELECT prod_name
FROM products
WHERE prod_price IS NULL;
注意: NULL和非匹配
通過過濾選擇不包含指定值的所有行時,你可能希望返回含
NULL值的行。但是這做不到。因為未知(unknown)有特殊的含義,數(shù)據(jù)庫不知道它們是否匹配,所以在進行匹配過濾或非匹配過濾時,不會返回這些結果。過濾數(shù)據(jù)時,一定要驗證被過濾列中含
NULL的行確實出現(xiàn)在返回的數(shù)據(jù)中。
小結:本小節(jié)學習了如何使用SELECT語句和WHERE子句過濾返回的數(shù)據(jù)
四、高級數(shù)據(jù)過濾
組合WHERE子句,上一課所以WHERE子句在過濾數(shù)據(jù)的時候都是單一的條件,為了更強的過濾控制,SQL給出了多個WHERE子句,有兩張方式使用,AND子句和OR子句
這一課講授如何用
AND和OR操作符組合成WHERE子句,還講授了如何明確地管理求值順序,如何使用IN和NOT操作符。操作符(operator)
用來聯(lián)結或改變
WHERE子句中的子句的關鍵字,也稱為邏輯操作符(logical operator)。AND
用在
WHERE子句中的關鍵字,用來指示檢索滿足所有給定條件的行。OR
WHERE子句中使用的關鍵字,用來表示檢索匹配任一給定條件的行。IN
WHERE子句中用來指定要匹配值的清單的關鍵字,功能與OR相當。
AND操作符
SELECT prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = 'DLL01' AND prod_price <= 4;
上面的語句應該不難解釋
OR操作符
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
結果和上述類似,這里也不做說明
求值順序
/*目的是為了篩選出vend_id是
DLL01和BRS01,并且價格是大于等于10的*/
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*/
原因是:SQL中在處理OR操作符之前,優(yōu)先處理AND操作符.SQL理解為BRS01制造的價格10美元以上以及DLL01制造的所有產(chǎn)品,No matter價格多少(解決方法就是使用圓括號,進行分組)
SELECT prod_name, prod_price
FROM Products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
AND prod_price <= 10;
-- 使用圓括號沒有什么壞處,可以消除歧義,盡量不要依賴默認求值順序
IN操作符
IN操作符用來指定條件范圍,范圍中的每個條件都可以進行匹配。IN取一組由逗號分隔、括在圓括號中的合法值。
SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN ('DLL01', 'BRS01')
ORDER BY prod_name;
-- 上下兩端代碼功能是相同的
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
ORDER BY prod_name;
為什么要使用
IN操作符?其優(yōu)點為:
- 在有很多合法選項時,
IN操作符的語法更清楚,更直觀。- 在與其他
AND和OR操作符組合使用IN時,求值順序更容易管理。IN操作符一般比一組OR操作符執(zhí)行得更快(在上面這個合法選項很少的例子中,你看不出性能差異)。IN的最大優(yōu)點是可以包含其他SELECT語句,能夠更動態(tài)地建立WHERE子句。
NOT操作符
SELECT prod_name
FROM Products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;
-- 列出除DLL01之外的所有數(shù)據(jù)
SELECT prod_name
FROM Products
WHERE vend_id <> 'DLL01'
ORDER BY prod_name;
這里的NOT否定跟在其后的條件,因此DBMS不是匹配vend_id為DLL01,而是匹配非DLL01之外的所有東西,以上也可以使用<>來完成
既然這樣為什么還要使用NOT呢?
對于這里的這種簡單的
WHERE子句,使用NOT確實沒有什么優(yōu)勢。但在更復雜的子句中,NOT是非常有用的。例如,在與IN操作符聯(lián)合使用時,NOT可以非常簡單地找出與條件列表不匹配的行。
以上就是前五課的總結與筆記(未完待續(xù))