在sql語句中,先執(zhí)行哪一個(gè)子句,having還是select,一直以來是一個(gè)備受爭(zhēng)議的話題。
針對(duì)這個(gè)問題,傳統(tǒng)的觀點(diǎn)認(rèn)為SQL會(huì)先執(zhí)行having子句,再執(zhí)行select子句。然而,有人提出疑問,這違背了SQL的邏輯。因?yàn)閔aving子句依賴于select子句的結(jié)果,即分組后的匯總數(shù)據(jù)來進(jìn)行篩選。那么,如果沒有select子句先查詢出數(shù)據(jù)來,having子句又如何進(jìn)行篩選呢?
為了澄清這個(gè)疑問,我們重新審視select子句的作用。select子句并不是對(duì)數(shù)據(jù)進(jìn)行操作,而是將選取的數(shù)據(jù)展示出來。它不參與數(shù)據(jù)處理和篩選的過程,因此不會(huì)影響having子句的執(zhí)行。
因此,SQL執(zhí)行的正確順序應(yīng)該是:
- Group by先進(jìn)行分組。
- Sum()聚合函數(shù)計(jì)算每個(gè)組的總和。
- Having子句對(duì)子組總和結(jié)果進(jìn)行篩選。
- Select將符合篩選條件的結(jié)果選擇性地展示出來。
所以,網(wǎng)上的答案是正確的,SQL中先執(zhí)行having子句,再執(zhí)行select子句。這并不矛盾,因?yàn)閔aving子句并不依賴于select子句的執(zhí)行結(jié)果來進(jìn)行篩選。