程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 數據庫中的SELECT語句邏輯履行次序剖析

數據庫中的SELECT語句邏輯履行次序剖析

編輯:MySQL綜合教程

數據庫中的SELECT語句邏輯履行次序剖析。本站提示廣大學習愛好者:(數據庫中的SELECT語句邏輯履行次序剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是數據庫中的SELECT語句邏輯履行次序剖析正文


引言

  這不是一個甚麼多深的技巧成績,何等牛叉的編程才能。這跟一小我的開辟才能也沒有異常必定的直接關系,然則曉得這些會對你的SQL編寫,排憂及優化上會有很年夜的贊助。它不是一個龐雜的常識點,然則一個異常基本的SQL基礎。不懂得這些,你一向用通俗水泥蓋房子;控制這些,你是在用高級水泥蓋房子。

  但是,就是這麼一個小小的常識點,年夜家可以去查詢拜訪一下四周的同事同伙,沒准你會獲得一個“欣喜”。

  因為這篇文章是忽然有感而寫,上面順手編寫的SQL語句沒有經由測試。

  看上面的幾段SQL語句:
#1
SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
HAVING TOTAL>2
#2
SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
ORDER BY TOTAL
#3
SELECT FIRSTNAME+' '+LASTNAME AS NAME, COUNT(*) AS COUNT
 
FROM STUDENT
 
GROUP BY NAME

你認為哪個不克不及夠勝利履行?

上面是SELECT語句的邏輯履行次序:

1.FROM
2.ON
3.JOIN
4.WHERE
5.GROUP BY
6.WITH CUBE or WITH ROLLUP
7.HAVING
8.SELECT
9.DISTINCT
10.ORDER BY
11.TOP
  MICROSOFT指出,SELECT語句的現實物理履行次序能夠會因為查詢處置器的分歧而與這個次序有所收支。

幾個示例

示例一:

SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
HAVING TOTAL>2

認為這個SQL語句眼生嗎?對,異常基本的分組查詢。但它不克不及履行勝利,由於HAVING的履行次序在SELECT之上。

現實履行次序以下:

1.FROM STUDENT
2.GROUP BY ID
3.HAVING TOTAL>2
4.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

這個的現實履行次序是:

1.FROM STUDENT
2.GROUP BY ID
3.SELECT ID,COUNT(ID) AS TOTAL
4.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)

現實履行次序:

1.FROM STUDENT
2.GROUP BY ID
3.SELECT ID,COUNT(ID) AS TOTAL
4.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還沒有創立,是以它是不克不及履行勝利的。

總結

  回想起已經隨便問過一些人這個成績,不論誰說不曉得時我們都邑有意譏笑一翻,固然此譏笑非彼譏笑。但現實證實照樣有一些人不會留意到這個常識點,在此貼出來只是做為一個友愛的提示。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved