SELECT語句邏輯執行順序 你知道嗎?
引言
這不是一個什麼多深的技術問題,多麼牛叉的程式設計能力。這跟一個人的開發能力也沒有非常必然的直接關係,但是知道這些會對你的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
- WHERE
- GROUP BY
- WITH CUBE or WITH ROLLUP
- 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之上。
實際執行順序如下:
- FROM STUDENT
- GROUP BY ID
- HAVING TOTAL>2
- SELECT ID,COUNT(ID) AS TOTAL
很明顯,TOTAL是在最後一句SELECT ID,COUNT(ID) 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) AS TOTAL
- ORDER BY TOTAL
這一次沒有任何問題,能夠成功執行。如果把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)
沒錯,它是能夠成功執行的,看SQL執行計劃,它與上面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還沒有建立,因此它是不能執行成功的。
總結
回憶起曾經隨意問過一些人這個問題,不管誰說不知道時我們都會故意嘲笑一翻,當然此嘲笑非彼嘲笑。但事實證明還是有一些人不會注意到這個知識點,在此貼出來只是做為一個友好的提醒。
相關文章
- SQL Select語句邏輯執行順序SQL
- Select語句執行順序
- 微軟官方:SELECT語句邏輯處理順序微軟
- Mybatis如何執行Select語句,你真的知道嗎?MyBatis
- SQL語句中SELECT語句的執行順序SQL
- SQL Server中SELECT語句執行順序解析SQLServer
- for語句執行順序
- # 關於select關鍵字語句定義順序# 關於select關鍵字語句執行順序
- mySQL 執行語句執行順序MySql
- SQL語句執行順序SQL
- sql select語法執行順序SQL
- SQL 語句的執行順序SQL
- mysql 語句的執行順序MySql
- SQL Server SQL語句執行順序SQLServer
- SQL語句各子句的執行順序SQL
- SQL 查詢語句的執行順序解析SQL
- Hive SQL語句的正確執行順序HiveSQL
- Java for迴圈中語句執行的順序Java
- T-sql語句查詢執行順序SQL
- sql語句執行順序與效能優化(1)SQL優化
- mysql 中sql語句關鍵字的書寫順序與執行順序MySql
- python if語句有先後順序嗎Python
- 1v1影片原始碼,你知道如何實現多執行緒的順序執行嗎?原始碼執行緒
- 你瞭解一條sql的執行順序嗎SQL
- for語句括號中程式碼執行順序介紹
- JavaScript for迴圈語句的執行順序和優化JavaScript優化
- Oracle SQL語句執行流程與順序原理解析OracleSQL
- SQL語句執行順序及建議--歸納整理SQL
- SQL 查詢總是先執行SELECT語句嗎?你們都錯了!SQL
- 一個 MySQL sql 語句執行順序帶來的 bugMySql
- SQL 執行順序 你懂的SQL
- MySQL 查詢常用操作(0) —— 查詢語句的執行順序MySql
- 一個針對 Python 語句執行順序的練習Python
- MySQL之SQL邏輯查詢順序MySql
- 查詢處理的邏輯順序
- Sql執行順序SQL
- java中異常處理finally和return語句的執行順序Java
- mysql自定義排序順序語句MySql排序