亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > 文庫 > 正文

SQL查詢的底層運行原理深入分析

2020-10-29 21:45:30
字體:
來源:轉載
供稿:網友

前言

SQL 語言無處不在。SQL 已經不僅僅是技術人員的專屬技能了,似乎人人都會寫SQL,就如同人人都是產品經理一樣。如果你是做后臺開發的,那么CRUD就是家常便飯。如果你是做數倉開發的,那么寫SQL可能占據了你的大部分工作時間。我們在理解 SELECT 語法的時候,還需要了解 SELECT 執行時的底層原理。只有這樣,才能讓我們對 SQL 有更深刻的認識。本文分享將逐步分解SQL的執行過程,希望對你有所幫助。

數據準備

本文旨在說明SQL查詢的執行過程,不會涉及太復雜的SQL操作,主要涉及兩張表: citizen 和 city ,具體數據如下所示:

CREATE TABLE citizen (  name CHAR ( 20 ),  city_id INT ( 10 ) );CREATE TABLE city ( city_id INT ( 10 ),  city_name CHAR ( 20 ) );INSERT INTO cityVALUES ( 1, "上海" ), ( 2, "北京" ), ( 3, "杭州" );  INSERT INTO citizenVALUES("tom",3),("jack",2),("robin",1),("jasper",3),("kevin",1),("rachel",2),("trump",3),("lilei",1),("hanmeiei",1);

查詢執行順序

本文所涉及的查詢語句如下,主要是citizen表與city表進行join,然后篩掉city_name != "上海"的數據,接著按照city_name進行分組,統計每個城市總人數大于2的城市,具體如下:

查詢語句

SELECT  city.city_name AS "City", COUNT(*) AS "citizen_cnt"FROM citizen JOIN city ON citizen.city_id = city.city_id WHERE city.city_name != '上海'GROUP BY city.city_nameHAVING COUNT(*) >= 2ORDER BY city.city_name ASCLIMIT 2

執行步驟

上面SQL查詢語句的書寫書序是:

SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...

但是執行順序并不是這樣,具體的執行順序如下步驟所示:

  • 1.獲取數據 ( From, Join )
  • 2.過濾數據 ( Where )
  • 3.分組 ( Group by )
  • 4.分組過濾 ( Having )
  • 5.返回查詢字段 ( Select )
  • 6.排序與分頁 ( Order by & Limit / Offset )

尖叫提示:本文旨在說明通用的SQL執行底層原理,對于其優化技術不做考慮,比如謂詞下推、投影下推等等。

執行的底層原理

其實上面所說的SQL執行順序就是所謂的底層原理,當我們在執行SELECT語句時,每個步驟都會產生一張 虛擬表(virtual table) ,在執行下一步驟時,會將該虛擬表作為輸入。指的注意的是,這些過程是對用戶透明的。

你可以注意到,SELECT 是先從FROM 這一步開始執行的。在這個階段,如果是多張表進行JOIN,還會經歷下面的幾個步驟:

獲取數據 ( From, Join )

  • 首先會通過 CROSS JOIN 求笛卡爾積,相當于得到虛擬表 vt1-1;
  • 接著通過ON 條件進行篩選,虛擬表 vt1-1 作為輸入,輸出虛擬表 vt1-2;
  • 添加外部行。我們使用的是左連接、右鏈接或者全連接,就會涉及到外部行,也就是在虛擬表 vt1-2 的基礎上增加外部行,得到虛擬表 vt1-3

過濾數據 ( Where )

經過上面的步驟,我們得到了一張最終的虛擬表vt1,在此表之上作用where過濾,通過篩選條件過濾掉不滿足條件的數據,從而得到虛擬表vt2。

分組 ( Group by )

經過where過濾操作之后,得到vt2。接下來進行GROUP BY操作,得到中間的虛擬表vt3。

分組過濾 ( Having )

在虛擬表vt3的基礎之上,使用having過濾掉不滿足條件的聚合數據,得到vt4。

返回查詢字段 ( Select )

當我們完成了條件篩選部分之后,就可以篩選表中提取的字段,也就是進入到 SELECT 和 DISTINCT 階段。首先在 SELECT 階段會提取目標字段,然后在 DISTINCT 階段過濾掉重復的行,分別得到中間的虛擬表 vt5-1 和 vt5-2。

排序與分頁 ( Order by & Limit / Offset )

當我們提取了想要的字段數據之后,就可以按照指定的字段進行排序,也就是 ORDER BY 階段,得到虛擬表 vt6。最后在 vt6 的基礎上,取出指定行的記錄,也就是 LIMIT 階段,得到最終的結果,對應的是虛擬表 vt7

詳細執行步驟分析

Step 1:獲取數據 ( From, Join )

FROM citizenJOIN city

該過程的第一步是執行From子句中的語句,然后執行Join子句。這些操作的結果是得到兩個表的笛卡爾積。

name city_id city_id city_name
tom 3 1 上海
tom 3 2 北京
tom 3 3 杭州
jack 2 1 上海
jack 2 2 北京
jack 2 3 杭州
robin 1 1 上海
robin 1 2 北京
robin 1 3 杭州
jasper 3 1 上海
jasper 3 2 北京
jasper 3 3 杭州
kevin 1 1 上海
kevin 1 2 北京
kevin 1 3 杭州
rachel 2 1 上海
rachel 2 2 北京
rachel 2 3 杭州
trump 3 1 上海
trump 3 2 北京
trump 3 3 杭州
lilei 1 1 上海
lilei 1 2 北京
lilei 1 3 杭州
hanmeiei 1 1 上海
hanmeiei 1 2 北京
hanmeiei 1 3 杭州

在FROM和JOIN執行結束之后,會按照JOIN的ON條件,篩選所需要的行

ON citizen.city_id = city.city_id

name city_id city_id city_name
tom 3 3 杭州
jack 2 2 北京
robin 1 1 上海
jasper 3 3 杭州
kevin 1 1 上海
rachel 2 2 北京
trump 3 3 杭州
lilei 1 1 上海
hanmeiei 1 1 上海

Step 2:過濾數據 ( Where )

獲得滿足條件的行后,將傳遞給Where子句。這將使用條件表達式評估每一行。如果行的計算結果不為true,則會將其從集合中刪除。

WHERE city.city_name != '上海'

name city_id city_id city_name
tom 3 3 杭州
jack 2 2 北京
jasper 3 3 杭州
rachel 2 2 北京
trump 3 3 杭州

Step 3:分組 ( Group by )

下一步是執行Group by子句,它將具有相同值的行分為一組。此后,將按組對所有Select表達式進行評估,而不是按行進行評估。

GROUP BY city.city_name

GROUP_CONCAT(citizen. name ) city_id city_name
jack,rachel 2 北京
tom,jasper,trump 3 杭州

Step 4:分組過濾 ( Having )

對分組后的數據使用Having子句所包含的謂詞進行過濾

HAVING COUNT(*) >= 2

Step 5:返回查詢字段 ( Select )

在此步驟中,處理器將評估查詢結果將要打印的內容,以及是否有一些函數要對數據運行,例如Distinct,Max,Sqrt,Date,Lower等等。本案例中,SELECT子句只會打印城市名稱和其對應分組的count(*)值,并使用標識符“ City”作為city_name列的別名。

SELECT  city.city_name AS "City", COUNT(*) AS "citizen_cnt"

city citizen_cnt
北京 2
杭州 3

Step 6:排序與分頁 ( Order by & Limit / Offset )

查詢的最后處理步驟涉及結果集的排序與輸出大小。在我們的示例中,按照字母順序升序排列,并輸出兩條數據結果。

ORDER BY city.city_name ASCLIMIT 2

city citizen_cnt
北京 2
杭州 3

總結

本文主要剖析了SQL語句的執行順序和底層原理,基本的SQL查詢會分為六大步驟。本文結合具體事例,給出了每一步驟的詳細結果,這樣會對其執行的底層原理有更加深刻的認識。

到此這篇關于SQL查詢的底層運行原理深入分析的文章就介紹到這了,更多相關SQL查詢底層運行原理內容請搜索武林網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产免费久久久久久| 成人精品一区二区三区电影免费| 国产精品96久久久久久又黄又硬| 97在线精品国自产拍中文| 亚洲一区二区三区毛片| 久久久久久有精品国产| 国产精品视频一区二区三区四| 国产在线视频一区| 欧美日韩国产精品一区二区不卡中文| 一区二区在线视频播放| 伊人久久久久久久久久| 国产精品视频最多的网站| 久久噜噜噜精品国产亚洲综合| 国产精品一区二区三区久久久| 国产情人节一区| 青青草99啪国产免费| 裸体女人亚洲精品一区| 91免费的视频在线播放| 一级做a爰片久久毛片美女图片| 一区二区三区高清国产| 日韩电影中文字幕| 久久久最新网址| 深夜精品寂寞黄网站在线观看| 怡红院精品视频| 亚洲国产欧美自拍| 国产成人精品免费视频| 国产在线播放不卡| 日韩成人中文字幕| 久久精品91久久久久久再现| 久久久久久久久久国产| 色偷偷9999www| 久久精品91久久香蕉加勒比| 日韩视频第一页| 久久久久久久久电影| 亚洲精品720p| 91国内精品久久| 成人欧美一区二区三区在线湿哒哒| 亚洲国产天堂久久国产91| 国产一区二区色| 91免费欧美精品| 日韩精品在线影院| 亚洲18私人小影院| 日韩av网站大全| 91在线网站视频| 亚洲一级一级97网| 亚洲国模精品一区| 亚洲人精选亚洲人成在线| 国产综合在线观看视频| 91精品国产免费久久久久久| 最近2019中文字幕mv免费看| 亚洲最大福利视频网| 在线观看国产精品淫| 国产精品96久久久久久| 日韩在线中文字幕| 久久久久久18| 久久人人看视频| 高清在线视频日韩欧美| 日韩在线视频播放| 国产午夜精品理论片a级探花| 国产香蕉97碰碰久久人人| 国产精品一区二区久久国产| 午夜免费日韩视频| 久久精品这里热有精品| 国产精品夜间视频香蕉| 亚洲第一天堂无码专区| 日韩免费看的电影电视剧大全| 国产成人精品免高潮费视频| 9.1国产丝袜在线观看| 亚洲欧美日韩精品久久亚洲区| 国产成+人+综合+亚洲欧洲| 欧美精品videosex性欧美| 欧美精品在线播放| 国产91色在线| 91av在线免费观看| 欧美高清在线视频观看不卡| 国产精品成熟老女人| 日韩欧美a级成人黄色| 久久综合伊人77777尤物| 久久久亚洲影院| 亚洲欧美资源在线| 欧美性一区二区三区| 97在线视频一区| 国内免费精品永久在线视频| 日韩精品在线免费| 欧美中在线观看| 日韩av中文在线| 久久免费观看视频| 欧美大全免费观看电视剧大泉洋| 亚洲人成啪啪网站| 欧美成人在线影院| 亚洲成年人在线| 久久中文字幕在线| 国产精品免费久久久久影院| 亚洲在线免费看| 久久全国免费视频| 日韩电影在线观看中文字幕| 亚洲国产精品中文| 欧美电影在线观看网站| 91免费看国产| 欧美午夜精品久久久久久浪潮| 国产日韩综合一区二区性色av| 日本午夜在线亚洲.国产| 亚洲mm色国产网站| 久久久人成影片一区二区三区| 96精品久久久久中文字幕| 一区二区三区四区在线观看视频| 精品亚洲精品福利线在观看| 日韩欧美精品网址| 色香阁99久久精品久久久| www亚洲欧美| 国产精品美女在线| 国产亚洲a∨片在线观看| 日韩精品在线私人| xxx一区二区| 国产精品十八以下禁看| 中文字幕欧美日韩| 国产精品99久久久久久白浆小说| 亚洲欧美色图片| 最近2019年手机中文字幕| 91在线视频九色| 最近2019好看的中文字幕免费| 中日韩美女免费视频网址在线观看| 欧美极品少妇xxxxx| 日本不卡免费高清视频| 国产精品7m视频| 欧美专区国产专区| 国产精品极品美女在线观看免费| 欧美乱大交做爰xxxⅹ性3| 欧美大片欧美激情性色a∨久久| 亚洲天堂网站在线观看视频| 国产自产女人91一区在线观看| 国产日韩在线观看av| 最近2019年好看中文字幕视频| 亚洲人精品午夜在线观看| 伊人青青综合网站| 热久久99这里有精品| 91免费高清视频| 国产精品一区二区女厕厕| 亚洲一区美女视频在线观看免费| 精品亚洲夜色av98在线观看| 国产精品91在线观看| 国产一区二区三区久久精品| 欧美人成在线视频| 国产精品久久久久久久久久久久久| 久久伊人91精品综合网站| 98视频在线噜噜噜国产| 高跟丝袜欧美一区| 亚洲新声在线观看| 国产福利精品av综合导导航| 一区二区三区国产在线观看| 国产精品日本精品| 91精品久久久久久久久久另类| 97在线视频国产| 91色p视频在线| 国内精品400部情侣激情| 久久免费视频网站| 97视频免费在线观看| 中文字幕成人在线| 色综合久久悠悠| 亚洲精品v欧美精品v日韩精品| 欧美另类交人妖| 2019中文字幕免费视频| 欧美成人合集magnet| 欧美激情精品久久久久|