日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL语句中各个部分的执行顺序(转)

發(fā)布時(shí)間:2025/7/14 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL语句中各个部分的执行顺序(转) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文鏈接:http://www.tuicool.com/articles/fERNv2

寫在前面的話:有時(shí)不理解SQL語句各個(gè)部分執(zhí)行順序,導(dǎo)致理解上出現(xiàn)偏差,或者是書寫SQL語句時(shí)隨心所欲,所以有必要了解一下sql語句的執(zhí)行順序。可以有時(shí)間自己寫一個(gè)簡單的數(shù)據(jù)庫,理解會更加深入。下面就寫寫我的一些理解,以SQL SERVER2008為例,進(jìn)行說明。

先看下面這條簡單SQL語句:

1 select 2 top 10 * 3 from Student 4 where age>20

這條SQL語句是否可以有下面兩種理解呢

(1)先從Student表中選出age>20的數(shù)據(jù),然后從這些數(shù)據(jù)中選擇前面的10條數(shù)據(jù)。

(2)先從Student表中選出前10條數(shù)據(jù),然后從這些數(shù)據(jù)中選擇age>20的數(shù)據(jù)。

那么到底哪個(gè)是正確的呢?你可能會說,這還不容易,肯定是(1)是正確的。沒錯(cuò),對于這樣的簡單的語句,一眼就能看出來,可是對于稍微復(fù)雜一些的SQL語句或者更加復(fù)雜的SQL語句,有時(shí)我們一眼就看不出來了,為了能夠正確分析SQL語句以及寫出正確的SQL語句,有必要了解一下SQL語句各部分的執(zhí)行順序。

好了,我們再看下面的一條SQL語句:

select distinct top 1 Table1.id,COUNT(Table1.name) as nameCount from Table1 inner join Table2 on Table1.id=Table2.id where Table1.id<4 group by Table1.id having Table1.id<3 order by Table1.id desc

其中Table1和Table2就是我隨便建立的兩個(gè)非常簡單的表,為了講解方便,我也沒有弄一些跟實(shí)際相結(jié)合的表,要不還要理解業(yè)務(wù)邏輯,干脆越簡單越好,畢竟目的是為了說明SQL語句的執(zhí)行順序,Table1和Table2如下:

Table1 Table2

下面先給出上面的SQL語句的執(zhí)行順序,然后進(jìn)行講解:

(8)  select 9)  distinct 11)  top 16)  Table1.id,COUNT(Table1.name) as nameCount 1)  from Table1 3)  inner join Table2 2)  on Table1.id=Table2.id 4)  where Table1.id<4 5)  group by Table1.id 7)  having Table1.id<3 10)  order by Table1.id desc

紅色序號給出了執(zhí)行的順序:

(1)from:對Table1和Table2執(zhí)行笛卡爾積,也就是兩個(gè)表的行的各種組合,共5*5=25行,生成虛擬表VT1

(2)on:選擇VT1中的那些Table1.id=Table2.id的所有行,生成虛擬表VT2。

(3)inner join:這里是內(nèi)部連接,直接就是VT2,如果是outer join,如left join、right join、full join,那么還需要按照外部連接的規(guī)則,把VT1中沒有匹配的行添加到VT2,生成VT3.

(4)where:選出VT3中Table1.id<4的表格,給虛擬表VT4.

(5)group by:按照Table1.id進(jìn)行分組。

(6)COUNT:執(zhí)行聚合函數(shù),選出對應(yīng)Table1.id的行數(shù),生成的結(jié)果給虛擬表VT5

(7)having:選擇VT5中Table1.id<3的所有結(jié)果,給虛擬表VT6

(8)select:選擇VT6中相應(yīng)的列,給虛擬表VT7

(9)distinct:將VT7中重復(fù)的行去除,生成VT8

(10)order by:將VT8的結(jié)果按照Table1.id進(jìn)行排序,?這里沒有生成一個(gè)新的表VT9?,而是生成游標(biāo)VC9。

(11)top:從游標(biāo)VC9的開始處選擇指定的行數(shù),這里是1行,生成虛擬表VT10.

經(jīng)過上面的過程,最終的SQL語句將VT10返回給用戶使用。

所以以后再寫SQL語句的時(shí)候,可以按照上面的順序?qū)慡QL語句了,讀SQL語句也可以按照上面的順序去讀,做到心里明白。

好了,啰啰嗦嗦說了這么多,上個(gè)圖吧(真是奇丑無比),一圖勝千言,自己做個(gè)總結(jié),也希望對大家有所幫助。

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的SQL语句中各个部分的执行顺序(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。