<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 1553字,需瀏覽 4分鐘

           ·

          2020-08-08 23:09

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

          設(shè)為“置頂或星標”,第一時間送達干貨

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

          覺得這個問題很有價值給小伙伴們分享一下。

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

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

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

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


          會報如下錯誤:
          錯誤提示里非常明確的告訴我們:聚合函數(shù)不應(yīng)出現(xiàn)在WHERE子句中!
          我們再使用HAVING來求解


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

          結(jié)果如下:

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

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

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

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

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

          這是一個能學到技術(shù)的公眾號,歡迎關(guān)注
          點擊「閱讀原文」了解SQL訓練營

          瀏覽 44
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产日韩欧美在线影院 | 中日韩欧美在线 | 欧美在线视频99 | 国产乱伦免费视频 | 亚洲操逼123 |