我們使用SQL的主要目的,還是為了查詢,也就是從表中取出我們想要的數(shù)據(jù)。因此,查詢語句的使用是重中之重,也是學(xué)習(xí)SQL的重點(diǎn)。 1 運(yùn)算符 選取null記錄 什么是null值呢?就是缺失的值,也就是表中缺失的數(shù)據(jù)。比如我們往表格中插入數(shù)據(jù)時(shí),可能會發(fā)生遺漏,可以用下面的語句來查詢?nèi)笔?shù)據(jù): where 列名 is null; 注意這里不能寫為 = null ,如果要查詢非缺失數(shù)據(jù),使用下列語句: where 列名 is not null; 表示否定 可以用<>或者!=來表示不等的條件,除此之外,還有not運(yùn)算符,使用范圍更廣。舉個(gè)例子,登錄數(shù)據(jù)庫shell,現(xiàn)在我們要從cargo表中選出銷售價(jià)格大于10000的商品: 如果我們又想選擇售價(jià)小于10000的商品,可以用not運(yùn)算符: 這個(gè)查詢條件跟我們使用where sale_price < 10000 語句是等價(jià)的。 除此之外,還有 、-、*、/、and、or等運(yùn)算符,由于比較簡單易懂,就不一一介紹了。 2 聚合 聚合函數(shù) 什么是聚合函數(shù)?簡單的說,就是需要把數(shù)據(jù)合起來計(jì)算而產(chǎn)生的一系列函數(shù),常用的有以下幾個(gè): count:計(jì)算表中的行數(shù) sum:計(jì)算數(shù)據(jù)的合計(jì)值(列) avg:計(jì)算數(shù)據(jù)的平均值(列) max:計(jì)算數(shù)據(jù)的最大值(列) min:計(jì)算數(shù)據(jù)的最小值(列) 我們來看幾個(gè)例子,首先是count計(jì)算行數(shù): 當(dāng)count后跟列名時(shí),會返回列中非null值的行;若以count(*)(*號代表所有列)進(jìn)行查找,則會返回所有行,包括null值所在的行。 再來看看合計(jì)值sum: 這里我們選取了售價(jià)和成本兩列,進(jìn)行求和操作。在計(jì)算過程中,自動忽略null值,只進(jìn)行非null值的計(jì)算。 均值avg: 最大值和最小值: 計(jì)算商品的種類: 我們經(jīng)常會計(jì)算品類的數(shù)量,這是可在count函數(shù)中嵌套一個(gè)distinct關(guān)鍵字即可。 如上圖,我們在去除重復(fù)類型和未去重之間進(jìn)行對比。其他的任何聚合函數(shù)都可以使用distinct來達(dá)到去重的效果。 group by子句 group by,顧名思義,就是按表的一列或各列進(jìn)行分組,也可以看成對數(shù)據(jù)進(jìn)行排序后的行切割。舉個(gè)例子,我們想要知道cargo表中商品所有類型的數(shù)量,思路是先將商品按類型分組,再對各個(gè)組進(jìn)行count計(jì)數(shù)。對應(yīng)語句如下: 如果group by后的列有null值,也會參與分組,并且會顯示出null值的數(shù)量。 現(xiàn)在我們又想知道在電腦類別下,不同價(jià)位的機(jī)器有多少個(gè),可以插入where子句進(jìn)行過濾: 如圖,當(dāng)有where子句出現(xiàn)時(shí),會先進(jìn)行過濾,然后對過濾后的數(shù)據(jù)進(jìn)行分組。 在使用group by子句時(shí),有幾點(diǎn)需要注意:
having子句 having子句,只能對分組后的結(jié)果進(jìn)行過濾。其作用類似where子句,但只能用在group by之后。若沒有寫group by,則不可以使用having。 現(xiàn)在我們要從cargo表中找出商品類型個(gè)數(shù)恰好為2的商品: 如果去掉having子句: 通過對比可以看到,having子句的用法和where是類似的,都是在后面跟一個(gè)條件表達(dá)式,是對分組之后的結(jié)果進(jìn)行一些條件限制。 最后,having子句也是只可以寫常數(shù)、聚合函數(shù)以及group by中的列名。 3 排序 我們經(jīng)常會遇到排序的問題,先來看下我們的cargo表: 現(xiàn)在想讓表格按sale_price列,也就是售價(jià),進(jìn)行從小到大的排列??梢允褂胦rder by子句: 如上圖,可以看到order by默認(rèn)升序排列,關(guān)鍵字是asc(意為ascend);如果我們想要降序排列,可以在后面加上desc(意為descend)關(guān)鍵字: 特別要注意的是,order by子句中可以使用列的別名,原因是select子句的執(zhí)行順序在order by之前。 至此為止,基本的SQL語句就是這些了。特別要關(guān)注的是,SQL語句的書寫順序和執(zhí)行順序是不一樣的。我們先來看書寫順序: select→from→where→group by→having→order by 而執(zhí)行順序卻是這樣的: from→where→group by→having→select→order by 排序操作永遠(yuǎn)是在最后才完成的,牢記這兩個(gè)順序可以理解之前各個(gè)子句的書寫規(guī)則。 這一篇到此結(jié)束,下一篇就要開始對SQL的高級查詢了,敬請期待。 |
|