<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    面試官:說說WHERE,HAVING和ON的區(qū)別?

    共 1553字,需瀏覽 4分鐘

     ·

    2020-08-08 23:09

    點(diǎn)擊關(guān)注上方“SQL數(shù)據(jù)庫開發(fā)”,

    設(shè)為“置頂或星標(biāo)”,第一時(shí)間送達(dá)干貨

    最近有小伙伴私信我:今天面試有道題把我一下子問懵了,讓我說出WHERE,HAVING和ON的區(qū)別。

    覺得這個(gè)問題很有價(jià)值給小伙伴們分享一下。

    注:以下測試和結(jié)論基于SQL Server數(shù)據(jù)庫。

    這三個(gè)關(guān)鍵字我們平時(shí)經(jīng)常使用,他們一個(gè)共同點(diǎn)是:都可以用來過濾數(shù)據(jù)。

    那不同點(diǎn)是什么呢?我們先來看看WHERE和HAVING的區(qū)別


    WHERE和HAVING
    在搞清楚WHERE和HAVING的區(qū)別之前,我們需要知道老生常談的SQL執(zhí)行順序:
    (8)SELECT?(9)DISTINCT??(11)<Top?Num>?<select?list>
    (
    1)FROM?[left_table]
    (
    3)<join_type>?JOIN?<right_table>
    (
    2)????????ON?<join_condition>
    (
    4)WHERE?<where_condition>
    (
    5)GROUP?BY?<group_by_list>
    (
    6)WITH?<CUBE?|?RollUP>
    (
    7)HAVING?<having_condition>
    (
    10)ORDER?BY?<order_by_list>?
    上面的序號(hào)代表SQL在運(yùn)行時(shí),數(shù)據(jù)庫底層的先后順序,我們可以看到:
    WHERE是在GROUP BY之前執(zhí)行的,所以WHERE的后面是不能使用聚合函數(shù)來進(jìn)行數(shù)據(jù)過濾的,只能使用FROM表里的字段來進(jìn)行數(shù)據(jù)過濾;
    HAVING是在GROUP BY之后執(zhí)行的,那么這些數(shù)據(jù)就都已經(jīng)分過組了的,可以使用聚合函數(shù)來進(jìn)行數(shù)據(jù)的分組過濾。

    我們舉例說明一下
    有如下一張示例表Customers:
    查詢?nèi)藬?shù)不小于2的省份和人數(shù)
    我們先用WHERE來試驗(yàn)
    SELECT?省份,COUNT(*) 人數(shù)
    FROM?Customers
    WHERE?COUNT(*)>1
    GROUP?BY?省份


    會(huì)報(bào)如下錯(cuò)誤:
    錯(cuò)誤提示里非常明確的告訴我們:聚合函數(shù)不應(yīng)出現(xiàn)在WHERE子句中!
    我們?cè)偈褂肏AVING來求解


    SELECT?省份,COUNT(*) 人數(shù)
    FROM?Customers
    GROUP?BY?省份
    HAVING?COUNT(*)>1

    結(jié)果如下:

    可以得到我們想要的結(jié)果。
    上面就是WHERE和HAVING的主要區(qū)別了,此外WHERE和HAVING在性能上也有所區(qū)別,但這通常不是主要的,我們就不深入講解了。
    說完WHERE和HAVING,我們?cè)賮砜纯碬HERE和ON的區(qū)別

    WHERE和ON
    功能區(qū)別
    我們知道ON支持左連接和右連接,WHERE是不支持的,WHERE里面只支持內(nèi)連接,這在功能上是一個(gè)較大的區(qū)別。當(dāng)然Oracle的 WHERE可以通過(+)來實(shí)現(xiàn)左右連接,這個(gè)我們就不討論了。

    性能區(qū)別
    我們知道所有的查詢都回產(chǎn)生一個(gè)中間臨時(shí)報(bào)表,查詢結(jié)果就是從返回臨時(shí)報(bào)表中得到。ON和WHERE后面所跟限制條件的區(qū)別,主要與限制條件起作用的時(shí)機(jī)有關(guān),ON根據(jù)限制條件對(duì)數(shù)據(jù)庫記錄進(jìn)行過濾,然后生產(chǎn)臨時(shí)表;而WHERE是在臨時(shí)表生產(chǎn)之后,根據(jù)限制條件從臨時(shí)表中篩選結(jié)果。

    因?yàn)镺N限制條件發(fā)生時(shí)間較早,臨時(shí)表的數(shù)據(jù)集要小,因此ON的性能要優(yōu)于WHERE。但這通常是在數(shù)據(jù)量比較大的時(shí)候才比較明顯,如果數(shù)據(jù)量都比較小,這兩個(gè)在使用上沒有太大區(qū)別。
    ——End——

    后臺(tái)回復(fù)關(guān)鍵字:1024,獲取一份精心整理的技術(shù)干貨
    后臺(tái)回復(fù)關(guān)鍵字:進(jìn)群,帶你進(jìn)入高手如云的交流群。
    推薦閱讀

    這是一個(gè)能學(xué)到技術(shù)的公眾號(hào),歡迎關(guān)注
    點(diǎn)擊「閱讀原文」了解SQL訓(xùn)練營

    瀏覽 44
    點(diǎn)贊
    評(píng)論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)
    評(píng)論
    圖片
    表情
    推薦
    點(diǎn)贊
    評(píng)論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    青娱乐在线视频免费观看视频 | A片视频免费看 | 大香蕉视频伊人在线 | 伊人伊人伊人伊人伊人 | 一级片网址|