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