一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - Mysql - 數(shù)據(jù)庫中的SELECT語句邏輯執(zhí)行順序分析

數(shù)據(jù)庫中的SELECT語句邏輯執(zhí)行順序分析

2020-04-10 16:56junjie Mysql

這篇文章主要介紹了數(shù)據(jù)庫中的SELECT語句邏輯執(zhí)行順序分析,并列出了一些例子,需要的朋友可以參考下

引言

  這不是一個什么多深的技術(shù)問題,多么牛叉的編程能力。這跟一個人的開發(fā)能力也沒有非常必然的直接關(guān)系,但是知道這些會對你的SQL編寫,排憂及優(yōu)化上會有很大的幫助。它不是一個復(fù)雜的知識點(diǎn),但是一個非常基礎(chǔ)的SQL根基。不了解這些,你一直用普通水泥蓋房子;掌握這些,你是在用高等水泥蓋房子。

  然而,就是這么一個小小的知識點(diǎn),大家可以去調(diào)查一下周圍的同事朋友,沒準(zhǔn)你會得到一個“驚喜”。

  由于這篇文章是突然有感而寫,下面隨手編寫的SQL語句沒有經(jīng)過測試。

  看下面的幾段SQL語句:

復(fù)制代碼 代碼如下:
#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

你覺得哪一個不能夠成功執(zhí)行?

 

下面是SELECT語句的邏輯執(zhí)行順序:

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語句的實際物理執(zhí)行順序可能會由于查詢處理器的不同而與這個順序有所出入。

幾個示例

示例一:

復(fù)制代碼 代碼如下:

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

 

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

實際執(zhí)行順序如下:

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執(zhí)行過后生成的新別名。因此,在HAVING TOTAL>2執(zhí)行時是不能識別TOTAL的。

示例二

復(fù)制代碼 代碼如下:

SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
ORDER BY TOTAL

 

這個的實際執(zhí)行順序是:

1.FROM STUDENT
2.GROUP BY ID
3.SELECT ID,COUNT(ID) AS TOTAL
4.ORDER BY TOTAL
  這一次沒有任何問題,能夠成功執(zhí)行。如果把ORDER BY TOTAL換成ORDER BY COUNT(ID)呢?

復(fù)制代碼 代碼如下:

SELECT ID,COUNT(ID) AS TOTAL
 
FROM STUDENT
 
GROUP BY ID
 
ORDER BY COUNT(ID)

實際執(zhí)行順序:

 

1.FROM STUDENT
2.GROUP BY ID
3.SELECT ID,COUNT(ID) AS TOTAL
4.ORDER BY COUNT(ID)

  沒錯,它是能夠成功執(zhí)行的,看SQL執(zhí)行計劃,它與上面ORDER BY TOTAL是一樣的。ORDER BY 是在SELECT后執(zhí)行,因此可以用別名TOTAL。

示例三

復(fù)制代碼 代碼如下:

SELECT FIRSTNAME+' '+LASTNAME AS NAME, COUNT(*) AS COUNT
 
FROM STUDENT
 
GROUP BY NAME

 

 實際執(zhí)行順序:

 

復(fù)制代碼 代碼如下:

FROM STUDENT
 
GROUP BY NAME
 
SELECT FIRSTNAME+' '+LASTNAME AS NAME,COUNT(*) AS COUNT

 

很明顯,執(zhí)行GROUP BY NAME時別名NAME還沒有創(chuàng)建,因此它是不能執(zhí)行成功的。

總結(jié)

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 四虎最新永久免费网址 | naruto堂同人本子汉化gg | 国产伦精一区二区三区视频 | 精品国产一区二区三区久 | 蜜月aⅴ免费一区二区三区 蜜桃影像传媒推广 | 国产精品嫩草影院一二三区 | 日本动漫啪啪动画片mv | 午夜精品久久久久久久2023 | 精品国产乱码久久久久久免费 | 天海翼三级 | 爱情岛论坛亚洲永久入口口 | 免费观看国产大片资源视频 | 成人看片免费无限观看视频 | 美女被无套进入 | 免费看片aⅴ免费大片 | 人与禽交3d动漫羞羞动漫 | 惊弦45集免费看 | 国内视频一区二区 | 全黄h全肉细节修仙玄幻文 全彩调教侵犯h本子全彩妖气he | 青青青国产精品国产精品美女 | 久热这里在线精品 | 国产免费视| 操人网 | 痴mu动漫成年动漫在线观看 | 好男人资源在线观看免费的 | 嗯啊好大好粗 | 国产日韩欧美在线观看不卡 | 国产66 | 国产成人在线播放 | 日韩一区二区三区不卡视频 | 性柔术18性13处交 | 欧美干b视频 | 日本在线视频免费看 | 成人精品一级毛片 | 美女靠逼的视频 | 门房秦大爷最新章节阅读 | 亚洲AV无码偷拍在线观看 | 免费国产好深啊好涨好硬视频 | 久久99re2在线视频精品 | 国产偷窥女洗浴在线观看亚洲 | 农村脱精光一级 |