SQL必知必會(筆記)

由于本人使用的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;
  1. 注釋使用-- (兩個連字符)嵌在行內(nèi)。-- 之后的文本就是注釋
  2. 在一行的開始處使用#,這一整行都將作為注釋。
/* SELECT prod_name, vend_id 

FROM Products; */ 

SELECT prod_name 

FROM Products;
  1. 也可以進(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,不能簡單地檢查是否= NULLSELECT語句有一個特殊的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子句

這一課講授如何用ANDOR操作符組合成WHERE子句,還講授了如何明確地管理求值順序,如何使用INNOT操作符。

操作符(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操作符的語法更清楚,更直觀。
  • 在與其他ANDOR操作符組合使用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ù))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內(nèi)容