日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

SQL簡單查詢

 L羅樂 2019-03-03

我們使用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)需要注意:

  1. 在select子句中只可以寫常數(shù)、聚合函數(shù)以及group by后指定的聚合列。但我們看到上圖中也有type列,是的,只有MySQL是支持這種寫法的。其他的RDBMS并不支持。

  2. group by子句中不可以寫列的別名,原因跟SQL語句的執(zhí)行順序有關(guān)。我們的書寫順序是select→from→where→group by,但執(zhí)行順序卻是from→where→group by→select,因?yàn)間roup by先于select執(zhí)行,所以你使用別名時(shí),系統(tǒng)并不會識別,自然會報(bào)錯(cuò)。

  3. group by聚合后的結(jié)果是無序的。

  4. where子句中只可以使用條件表達(dá)式,不能使用聚合函數(shù)。事實(shí)上,只有select子句和后面馬上要說的having子句可以使用聚合函數(shù)。

  5. 在使用group by聚合列時(shí),若select子句中沒有使用聚合函數(shù),其效果相當(dāng)于對該列進(jìn)行去重(distinct)。但一般并不建議這么做,會加大理解難度。

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的高級查詢了,敬請期待。

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多