1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 1553字,需瀏覽 4分鐘

         ·

        2020-08-08 23:09

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

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

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

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

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

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

        那不同點(diǎn)是什么呢?我們先來(lái)看看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ù)庫(kù)底層的先后順序,我們可以看到:
        WHERE是在GROUP BY之前執(zhí)行的,所以WHERE的后面是不能使用聚合函數(shù)來(lái)進(jìn)行數(shù)據(jù)過(guò)濾的,只能使用FROM表里的字段來(lái)進(jìn)行數(shù)據(jù)過(guò)濾;
        HAVING是在GROUP BY之后執(zhí)行的,那么這些數(shù)據(jù)就都已經(jīng)分過(guò)組了的,可以使用聚合函數(shù)來(lái)進(jìn)行數(shù)據(jù)的分組過(guò)濾。

        我們舉例說(shuō)明一下
        有如下一張示例表Customers:
        查詢?nèi)藬?shù)不小于2的省份和人數(shù)
        我們先用WHERE來(lái)試驗(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來(lái)求解


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

        結(jié)果如下:

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

        WHERE和ON
        功能區(qū)別
        我們知道ON支持左連接和右連接,WHERE是不支持的,WHERE里面只支持內(nèi)連接,這在功能上是一個(gè)較大的區(qū)別。當(dāng)然Oracle的 WHERE可以通過(guò)(+)來(lái)實(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ù)庫(kù)記錄進(jìn)行過(guò)濾,然后生產(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è)在使用上沒(méi)有太大區(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)練營(yíng)

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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            18禁欧美| 综合色播 | 青青草在线视频免费公开视频 | 豆花视频入口在线播放 | 91偷拍一区 | 性爱福利视频 | 国产精品午夜福利视频 | asian壮年妇女裸体pics | 污网站免费在线观看 | 亚洲色图欧美色图在线 |