超碰人人人人人,亚洲AV午夜福利精品一区二区,亚洲欧美综合区丁香五月1区,日韩欧美亚洲系列

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

[點(diǎn)晴永久免費(fèi)OA]SQL語句執(zhí)行順序相關(guān)問題

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

注意本文是SQL執(zhí)行順序,不是MySQL Server內(nèi)部執(zhí)行流程。
MySQL并非像PostgreSQL(被認(rèn)為是最接近 SQL 標(biāo)準(zhǔn)的數(shù)據(jù)庫之一)一樣嚴(yán)格按照SQL標(biāo)準(zhǔn),MySQL執(zhí)行引擎會根據(jù)查詢的具體情況和優(yōu)化策略來決定具體的執(zhí)行順序,所以SQL執(zhí)行順序是理論順序。

書寫順序

select...from...join...on...where...group by...having...order by...limit...

執(zhí)行順序

from->join->on->where->group by->having->select->order by->limit

SQL書寫順序與執(zhí)行順序不一致的原因?

SQL語言設(shè)計受到了數(shù)學(xué)中的關(guān)系代數(shù)和元組演算的影響。這些數(shù)學(xué)理論中并沒有考慮操作順序,歷史原因造成SQL書寫上的差異。
中國的語法是姓在前名在后,英文的反過來。國內(nèi)是年月日,英文是月日年,文化上的差異,也是造成SQL順序別扭的原因之一。

SQL執(zhí)行順序的邏輯是什么?

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

  2. join和on用于關(guān)聯(lián),后面的各種處理邏輯依附于關(guān)聯(lián)后內(nèi)部創(chuàng)建的臨時表,先生成數(shù)據(jù)集,才能為后續(xù)處理做基礎(chǔ)。

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

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

  5. having用于對分組結(jié)果進(jìn)行過濾,所以要在group by之后。

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

  7. order by用于結(jié)果進(jìn)行排序,肯定是結(jié)果處理后才排序的,理由和group by相似。

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

為什么SQL執(zhí)行不是先group by再where?

先分組再篩選,邏輯上說的過去,相當(dāng)于整理好數(shù)據(jù)再篩選,類似于創(chuàng)建索引和使用索引的過程,這也是問題的由來。
如果group by放在where之前執(zhí)行,則需要對大量數(shù)據(jù)進(jìn)行分組,分組后還要對每個組進(jìn)行篩選,事先分組好的部分?jǐn)?shù)據(jù)又被過濾掉了,造成算力和內(nèi)存浪費(fèi),可能導(dǎo)致內(nèi)存不足或者性能問題,這不是一個優(yōu)秀的選擇,倒不如先篩選過濾大量數(shù)據(jù),然后對少量數(shù)據(jù)分組。

為什么SQL執(zhí)行要先select再order by?

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

為什么MySQL的where比having效率更高?

mysql執(zhí)行時,先執(zhí)行from用于定位操作對象,然后就是where,可能百萬條的數(shù)據(jù)經(jīng)過where之后只剩下幾十條,然后在進(jìn)行之后的操作。而group by比where多了一個環(huán)節(jié)。

聚合函數(shù)參與篩選條件,為什么只能用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

聚合函數(shù)(常見的avg、sum、count、min、max)需要在分組之后才能計算,執(zhí)行到where時還沒有分組,此時對分組進(jìn)行數(shù)據(jù)處理,所以報錯。相當(dāng)于要喝一口還沒生產(chǎn)的可樂,不符合事物的發(fā)展規(guī)律。

為什么使用聚合函數(shù)有分組的前提?

所謂聚合函數(shù),就是對一組數(shù)據(jù)進(jìn)行匯總計算,所以有分組的前提。即便沒有使用group by顯式聲明,SQL也會對上游過來的數(shù)據(jù)集進(jìn)行默認(rèn)分組(隱式分組)。

為什么字段別名不能在where中使用?

where執(zhí)行在select之前,此時別名未生效。

為什么group by和having執(zhí)行順序優(yōu)先于select,卻可以使用字段別名?

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



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