圖解 SQL 的執(zhí)行順序,優(yōu)雅
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
這是我們實(shí)際上SQL執(zhí)行順序:
數(shù)據(jù)的關(guān)聯(lián)過程數(shù)據(jù)庫中的兩張表 from&join&where用于確定我們要查詢的表的范圍,涉及哪些表。 選擇一張表,然后用join連接
選擇多張表,用where做關(guān)聯(lián)條件
我們會(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&wherehaving中可以是普通條件的篩選,也能是聚合函數(shù)。而where只能是普通函數(shù),一般情況下,有having可以不寫where,把where的篩選放在having里,SQL語句看上去更絲滑。 使用where再group by先把不滿足where條件的數(shù)據(jù)刪除,再去分組 使用group by再having先分組再刪除不滿足having條件的數(shù)據(jù),這兩種方法有區(qū)別嗎,幾乎沒有! 舉個(gè)例子:
不同的是,having語法支持聚合函數(shù),其實(shí)having的意思就是針對(duì)每組的條件進(jìn)行篩選。我們之前看到了普通的篩選條件是不影響的,但是having還支持聚合函數(shù),這是where無法實(shí)現(xiàn)的。 當(dāng)前數(shù)據(jù)分組情況 執(zhí)行having的篩選條件,可以使用聚合函數(shù)。篩選掉工資小于各組平均工資的 select分組結(jié)束之后,我們?cè)賵?zhí)行select語句,因?yàn)榫酆虾瘮?shù)是依賴于分組的,聚合函數(shù)會(huì)單獨(dú)新增一個(gè)查詢出來的字段,這里用紫色表示,這里我們兩個(gè)id重復(fù)了,我們就保留一個(gè)id,重復(fù)字段名需要指向來自哪張表,否則會(huì)出現(xiàn)唯一性問題。最后按照用戶名去重。
將各組having之后的數(shù)據(jù)再合并數(shù)據(jù)。 order by最后我們執(zhí)行order by 將數(shù)據(jù)按照一定順序排序,比如這里按照id排序。如果此時(shí)有l(wèi)imit那么查詢到相應(yīng)的我們需要的記錄數(shù)時(shí),就不繼續(xù)往下查了。 limit記住limit是最后查詢的,為什么呢?假如我們要查詢年級(jí)最小的三個(gè)數(shù)據(jù),如果在排序之前就截取到3個(gè)數(shù)據(jù)。實(shí)際上查詢出來的不是最小的三個(gè)數(shù)據(jù)而是前三個(gè)數(shù)據(jù)了,記住這一點(diǎn)。 我們?nèi)绻鹟imit 0,3竊取前三個(gè)數(shù)據(jù)再排序,實(shí)際上最少工資的是2000,3000,4000。你這里只能是4000,5000,8000了。 該文章在 2023/10/7 9:52:00 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |