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