欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

[點晴永久免費OA]SQL語句執行順序相關問題

freeflydom
2024年2月24日 16:52 本文熱度 842

注意本文是SQL執行順序,不是MySQL Server內部執行流程。
MySQL并非像PostgreSQL(被認為是最接近 SQL 標準的數據庫之一)一樣嚴格按照SQL標準,MySQL執行引擎會根據查詢的具體情況和優化策略來決定具體的執行順序,所以SQL執行順序是理論順序。

書寫順序

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執行順序的邏輯是什么?

  1. from用于確定操作對象,放第一位毋庸置疑。

  2. join和on用于關聯,后面的各種處理邏輯依附于關聯后內部創建的臨時表,先生成數據集,才能為后續處理做基礎。

  3. where用于篩選,可以減少后續操作的數據量,提高查詢性能。

  4. group by用于對數據進行分類匯總,不放where前面,是為了避免分組后的數據被where過濾掉(分組分了個寂寞),造成算力浪費和內存資源(數據量大還是很消耗算力和內存的)的問題。

  5. having用于對分組結果進行過濾,所以要在group by之后。

  6. select用于決定迭代顯示那些列,而不是限制只有這些列才可以參與處理,上游的各種操作(如復雜的where條件)不能受select字段的影響,這也是where后面跟的字段,不必在select出現的原因。select的本意是處理數據后僅僅返回這些字段,而不是決定只有這些字段進行數據處理,所以必定要放偏后的位置。

  7. order by用于結果進行排序,肯定是結果處理后才排序的,理由和group by相似。

  8. limit用于限制返回結果的行數和偏移量,必須是等篩選完分組完拍完序之后再限制,否則可能導致結果有誤。

為什么SQL執行不是先group by再where?

先分組再篩選,邏輯上說的過去,相當于整理好數據再篩選,類似于創建索引和使用索引的過程,這也是問題的由來。
如果group by放在where之前執行,則需要對大量數據進行分組,分組后還要對每個組進行篩選,事先分組好的部分數據又被過濾掉了,造成算力和內存浪費,可能導致內存不足或者性能問題,這不是一個優秀的選擇,倒不如先篩選過濾大量數據,然后對少量數據分組。

為什么SQL執行要先select再order by?

嘗試select field2 from table order by field1,select后面沒跟order by后面的field1也不報錯。
根據結果反推:select影響不到order by,所以先order by在select也說的過去。
但是:select字段的別名可以在order by中使用,如果反過來就達不到這樣的效果了。

為什么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,卻可以使用字段別名?

可以肯定進行了預加載,不然一定找不到別名,會報錯的。
參考官網:https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html



該文章在 2024/2/24 16:52:47 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved