<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>

          圖解 SQL 的執(zhí)行順序,優(yōu)雅

          共 2774字,需瀏覽 6分鐘

           ·

          2023-08-31 08:17


                     

          轉(zhuǎn)自:blog.csdn.net/weixin_44141495/article/details/108744720

          這是一條標(biāo)準(zhǔn)的查詢(xún)語(yǔ)句:

          這是我們實(shí)際上SQL執(zhí)行順序:

          • 我們先執(zhí)行from,join來(lái)確定表之間的連接關(guān)系,得到初步的數(shù)據(jù)

          • where對(duì)數(shù)據(jù)進(jìn)行普通的初步的篩選

          • group by 分組

          • 各組分別執(zhí)行having中的普通篩選或者聚合函數(shù)篩選。

          • 然后把再根據(jù)我們要的數(shù)據(jù)進(jìn)行select,可以是普通字段查詢(xún)也可以是獲取聚合函數(shù)的查詢(xún)結(jié)果,如果是集合函數(shù),select的查詢(xún)結(jié)果會(huì)新增一條字段

          • 將查詢(xún)結(jié)果去重distinct

          • 最后合并各組的查詢(xún)結(jié)果,按照order by的條件進(jìn)行排序

          數(shù)據(jù)的關(guān)聯(lián)過(guò)程

          數(shù)據(jù)庫(kù)中的兩張表

          from&join&where

          用于確定我們要查詢(xún)的表的范圍,涉及哪些表。

          選擇一張表,然后用join連接

          from table1 join table2 on table1.id=table2.id

          選擇多張表,用where做關(guān)聯(lián)條件

          from table1,table2 where table1.id=table2.id

          我們會(huì)得到滿足關(guān)聯(lián)條件的兩張表的數(shù)據(jù),不加關(guān)聯(lián)條件會(huì)出現(xiàn)笛卡爾積。

          group by

          按照我們的分組條件,將數(shù)據(jù)進(jìn)行分組,但是不會(huì)篩選數(shù)據(jù)。

          比如我們按照即id的奇偶分組

          having&where

          having中可以是普通條件的篩選,也能是聚合函數(shù)。而where只能是普通函數(shù),一般情況下,有having可以不寫(xiě)where,把where的篩選放在having里,SQL語(yǔ)句看上去更絲滑。

          使用where再group by

          先把不滿足where條件的數(shù)據(jù)刪除,再去分組

          使用group by再having

          先分組再刪除不滿足having條件的數(shù)據(jù),這兩種方法有區(qū)別嗎,幾乎沒(méi)有!

          微信搜索公眾號(hào):架構(gòu)師指南,回復(fù):架構(gòu)師 領(lǐng)取資料 。

          舉個(gè)例子:

          100/2=50,此時(shí)我們把100拆分(10+10+10+10+10…)/2=5+5+5+…+5=50,只要篩選條件沒(méi)變,即便是分組了也得滿足篩選條件,所以where后group by 和group by再having是不影響結(jié)果的!

          不同的是,having語(yǔ)法支持聚合函數(shù),其實(shí)having的意思就是針對(duì)每組的條件進(jìn)行篩選。我們之前看到了普通的篩選條件是不影響的,但是having還支持聚合函數(shù),這是where無(wú)法實(shí)現(xiàn)的。

          當(dāng)前數(shù)據(jù)分組情況

          執(zhí)行having的篩選條件,可以使用聚合函數(shù)。篩選掉工資小于各組平均工資的having salary<avg(salary)

          select

          分組結(jié)束之后,我們?cè)賵?zhí)行select語(yǔ)句,因?yàn)榫酆虾瘮?shù)是依賴(lài)于分組的,聚合函數(shù)會(huì)單獨(dú)新增一個(gè)查詢(xún)出來(lái)的字段,這里用紫色表示,這里我們兩個(gè)id重復(fù)了,我們就保留一個(gè)id,重復(fù)字段名需要指向來(lái)自哪張表,否則會(huì)出現(xiàn)唯一性問(wèn)題。最后按照用戶(hù)名去重。

          select employee.id,distinct name,salary, avg(salary)

          將各組having之后的數(shù)據(jù)再合并數(shù)據(jù)。

          order by

          最后我們執(zhí)行order by 將數(shù)據(jù)按照一定順序排序,比如這里按照id排序。如果此時(shí)有l(wèi)imit那么查詢(xún)到相應(yīng)的我們需要的記錄數(shù)時(shí),就不繼續(xù)往下查了。

          limit

          記住limit是最后查詢(xún)的,為什么呢?假如我們要查詢(xún)年級(jí)最小的三個(gè)數(shù)據(jù),如果在排序之前就截取到3個(gè)數(shù)據(jù)。實(shí)際上查詢(xún)出來(lái)的不是最小的三個(gè)數(shù)據(jù)而是前三個(gè)數(shù)據(jù)了,記住這一點(diǎn)。

          我們?nèi)绻鹟imit 0,3竊取前三個(gè)數(shù)據(jù)再排序,實(shí)際上最少工資的是2000,3000,4000。你這里只能是4000,5000,8000了。


          最近很多小伙伴找我要一些程序員必備資料,于是我翻出了壓箱底的寶藏,免費(fèi)分享給大家!


          掃描海報(bào)二維碼免費(fèi)獲取。


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

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  国产美女自拍视频 | 久久久精品少妇视频 | 亚洲AV电影在线 | 久热精品在线视频 | 国产精品色视频 |