首頁 > 資料庫 > mysql教程 > select語句邏輯執行順序 你知道嗎

select語句邏輯執行順序 你知道嗎

伊谢尔伦
發布: 2016-11-24 11:21:21
原創
982 人瀏覽過

 引言

  這不是一個多深的技術問題,多麼牛叉的程式設計能力。這跟一個人的開發能力也沒有非常必然的直接關係,但是知道這些會對你的SQL編寫,排憂及優化上會有很大的幫助。它不是一個複雜的知識點,但卻是一個非常基礎的SQL根基。不了解這些,你一直用普通水泥蓋房子;掌握這些,你就是在用高等水泥蓋房子。

  然而,就是這麼一個小小的知識點,大家可以去調查一下周圍的同事朋友,沒准你會得到一個「驚喜」。

  由於這篇文章是突然有感而寫,下面隨手寫的SQL語句沒有經過測試。

  看下面的幾段SQL語句:

SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
HAVING TOTAL>2
登入後複製
登入後複製
SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
ORDER BY TOTAL
登入後複製
登入後複製
SELECT FIRSTNAME+' '+LASTNAME AS NAME, COUNT(*) AS COUNT
 
FROM STUDENT
 
GROUP BY NAME
登入後複製
登入後複製

 

你覺得哪一個無法成功執行?

 言歸正傳

  下面是SELECT語句的邏輯執行順序:

FROM

ON

JOIN

HAVING

SELECT

DISTINCT

ORDER BY

TOP

  MICROSOFT指出,SELECT語句的實際物理執行順序可能會因為查詢處理器的不同而與這個順序有所出入。

 幾個例子

  範例一

SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
HAVING TOTAL>2
登入後複製
登入後複製

覺得這個SQL語句眼熟嗎?對,非常基礎的分組查詢。但它不能執行成功,因為HAVING的執行順序在SELECT之上。 •

AS TOTAL執行後產生的新別名。因此,在HAVING TOTAL>2執行時是無法辨識TOTAL的。

 範例二

SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
ORDER BY TOTAL
登入後複製
登入後複製

這個的實際執行順序是:

FROM STUDENT

GROUP BY ID

SELECT ID,COUNT(ID) ASOTALOTALOTAL

SELECT 。如果把ORDER BY TOTAL換成ORDER BY COUNT(ID)呢?

SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
ORDER BY COUNT(ID)
登入後複製

實際執行順序:

FROM STUDENT

GROUP BY ID

SELECT ID,COUNT(ID) AS TOTAL

ORDER BY COUNT(ID)🀎計劃,它與上面ORDER BY TOTAL是一樣的。 ORDER BY 在SELECT後執行,因此可以用別名TOTAL。

 

 範例三

SELECT FIRSTNAME+' '+LASTNAME AS NAME, COUNT(*) AS COUNT
 
FROM STUDENT
 
GROUP BY NAME
登入後複製
登入後複製

實際執行順序:   

FROM STUDENT
 
GROUP BY NAME
 
SELECT FIRSTNAME+' '+LASTNAME AS NAME,COUNT(*) AS COUNT
登入後複製

很明顯,執行GROUP BY NAME時別名NAME還沒有創建,因此它是不能執行成功的。

 總結

  回憶起曾經隨意問過一些人這個問題,不管誰說不知道時我們都會故意嘲笑一翻,當然此嘲笑非彼嘲笑。但事實證明還是有一些人不會注意到這個知識點,在此貼出來只是做為一個友好的提醒。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板