[點(diǎn)晴永久免費(fèi)OA]SQL語(yǔ)句執(zhí)行順序相關(guān)問(wèn)題
注意本文是SQL執(zhí)行順序,不是MySQL Server內(nèi)部執(zhí)行流程。 書(shū)寫(xiě)順序select...from...join...on...where...group by...having...order by...limit... 執(zhí)行順序from->join->on->where->group by->having->select->order by->limit SQL書(shū)寫(xiě)順序與執(zhí)行順序不一致的原因?SQL語(yǔ)言設(shè)計(jì)受到了數(shù)學(xué)中的關(guān)系代數(shù)和元組演算的影響。這些數(shù)學(xué)理論中并沒(méi)有考慮操作順序,歷史原因造成SQL書(shū)寫(xiě)上的差異。 SQL執(zhí)行順序的邏輯是什么?
為什么SQL執(zhí)行不是先group by再where?先分組再篩選,邏輯上說(shuō)的過(guò)去,相當(dāng)于整理好數(shù)據(jù)再篩選,類似于創(chuàng)建索引和使用索引的過(guò)程,這也是問(wèn)題的由來(lái)。 為什么SQL執(zhí)行要先select再order by?嘗試select field2 from table order by field1,select后面沒(méi)跟order by后面的field1也不報(bào)錯(cuò)。 為什么MySQL的where比having效率更高?mysql執(zhí)行時(shí),先執(zhí)行from用于定位操作對(duì)象,然后就是where,可能百萬(wàn)條的數(shù)據(jù)經(jīng)過(guò)where之后只剩下幾十條,然后在進(jìn)行之后的操作。而group by比where多了一個(gè)環(huán)節(jié)。 聚合函數(shù)參與篩選條件,為什么只能用having?//報(bào)錯(cuò),Invalid use of group function select field from table where avg(field) > 2 //需要修改為select field from table group by field having avg(field) > 2 聚合函數(shù)(常見(jiàn)的avg、sum、count、min、max)需要在分組之后才能計(jì)算,執(zhí)行到where時(shí)還沒(méi)有分組,此時(shí)對(duì)分組進(jìn)行數(shù)據(jù)處理,所以報(bào)錯(cuò)。相當(dāng)于要喝一口還沒(méi)生產(chǎn)的可樂(lè),不符合事物的發(fā)展規(guī)律。 為什么使用聚合函數(shù)有分組的前提?所謂聚合函數(shù),就是對(duì)一組數(shù)據(jù)進(jìn)行匯總計(jì)算,所以有分組的前提。即便沒(méi)有使用group by顯式聲明,SQL也會(huì)對(duì)上游過(guò)來(lái)的數(shù)據(jù)集進(jìn)行默認(rèn)分組(隱式分組)。 為什么字段別名不能在where中使用?where執(zhí)行在select之前,此時(shí)別名未生效。 為什么group by和having執(zhí)行順序優(yōu)先于select,卻可以使用字段別名?可以肯定進(jìn)行了預(yù)加載,不然一定找不到別名,會(huì)報(bào)錯(cuò)的。 該文章在 2024/2/24 16:52:47 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |