婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > SQL查詢的底層運行原理深入分析

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

熱門標簽:400電話申請怎么看 高德地圖標注商家在哪 400電話從哪里申請濱州 江西南昌百應電話機器人 hbuilder地圖標注 機器人電話機創(chuàng)意繪畫 天音通信電話機器人 杭州400電話如何申請的 隨州營銷電話機器人怎么樣

前言

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

數(shù)據(jù)準備

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

CREATE TABLE citizen ( 
 name CHAR ( 20 ), 
 city_id INT ( 10 ) 
);


CREATE TABLE city (
 city_id INT ( 10 ), 
 city_name CHAR ( 20 ) 
);

INSERT INTO city
VALUES
 ( 1, "上海" ),
 ( 2, "北京" ),
 ( 3, "杭州" );
 
 
INSERT INTO citizen
VALUES
("tom",3),
("jack",2),
("robin",1),
("jasper",3),
("kevin",1),
("rachel",2),
("trump",3),
("lilei",1),
("hanmeiei",1);

查詢執(zhí)行順序

本文所涉及的查詢語句如下,主要是citizen表與city表進行join,然后篩掉city_name != "上海"的數(shù)據(jù),接著按照city_name進行分組,統(tǒng)計每個城市總?cè)藬?shù)大于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_name
HAVING COUNT(*) >= 2
ORDER BY city.city_name ASC
LIMIT 2

執(zhí)行步驟

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

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

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

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

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

執(zhí)行的底層原理

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

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

獲取數(shù)據(jù) ( From, Join )

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

過濾數(shù)據(jù) ( Where )

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

分組 ( Group by )

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

分組過濾 ( Having )

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

返回查詢字段 ( Select )

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

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

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

詳細執(zhí)行步驟分析

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

FROM citizen
JOIN city

該過程的第一步是執(zhí)行From子句中的語句,然后執(zhí)行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執(zhí)行結束之后,會按照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:過濾數(shù)據(jù) ( 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 )

下一步是執(zhí)行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 )

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

HAVING COUNT(*) >= 2

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

在此步驟中,處理器將評估查詢結果將要打印的內(nèi)容,以及是否有一些函數(shù)要對數(shù)據(jù)運行,例如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 )

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

ORDER BY city.city_name ASC
LIMIT 2

city citizen_cnt
北京 2
杭州 3

總結

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

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

您可能感興趣的文章:
  • SQL重復記錄查詢的幾種方法
  • SQL 多表連接查詢實現(xiàn)語句
  • sql表連接查詢使用方法(sql多表連接查詢)
  • SQL 查詢語句積累
  • 三表左連接查詢的sql語句寫法

標簽:葫蘆島 招商 石嘴山 常德 鶴崗 沈陽 昆明 保定

巨人網(wǎng)絡通訊聲明:本文標題《SQL查詢的底層運行原理深入分析》,本文關鍵詞  SQL,查詢,的,底層,運行,原理,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQL查詢的底層運行原理深入分析》相關的同類信息!
  • 本頁收集關于SQL查詢的底層運行原理深入分析的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    精彩视频一区二区三区| 欧美理论电影在线| 欧美午夜精品久久久久久超碰| 久久影院电视剧免费观看| 天天操天天色综合| 欧美日韩中文字幕一区| 亚洲精品一二三| 91黄色小视频| 毛片一区二区三区| 精品在线观看视频| 亚洲永久免费av| 一区二区三区资源| 91色综合久久久久婷婷| 香蕉影视欧美成人| 精品国产成人系列| 欧美日韩成人高清| 成人午夜激情片| 亚洲男人天堂一区| 日韩欧美二区三区| 色8久久精品久久久久久蜜| 国产福利精品导航| 日本特黄久久久高潮| 亚洲麻豆国产自偷在线| 久久亚洲影视婷婷| 91精品国产高清一区二区三区 | 成人黄色电影在线| 亚洲国产va精品久久久不卡综合| 中文字幕av不卡| 久久久www成人免费毛片麻豆| 日韩一区二区精品| 欧美亚洲综合网| 在线免费观看视频一区| 亚洲美女屁股眼交3| 2023国产精华国产精品| 国产成人一区在线| 久久超碰97中文字幕| 一本色道久久综合亚洲91| 国产精品一区二区三区99| 91在线码无精品| 欧美激情一区二区| 国产一区二区不卡| 91精品国产综合久久香蕉麻豆| 成人永久免费视频| 91精品婷婷国产综合久久竹菊| 国产精品美女久久久久久| 亚洲国产精品久久久男人的天堂 | 午夜电影一区二区三区| fc2成人免费人成在线观看播放 | 极品美女销魂一区二区三区| 91丨九色porny丨蝌蚪| 欧美国产日韩a欧美在线观看| 亚洲色图视频免费播放| av影院午夜一区| 亚洲女性喷水在线观看一区| 国产成人综合在线| 中文欧美字幕免费| 99视频在线观看一区三区| 亚洲国产成人午夜在线一区| 国产福利一区在线| 国产精品久久久久久久久免费樱桃 | 欧美激情一区二区| 久久精品国产精品青草| 亚洲成人自拍网| 国产精品家庭影院| 2020日本不卡一区二区视频| 成人深夜视频在线观看| 老司机精品视频线观看86| 亚洲高清一区二区三区| 一区二区三区高清| 日韩精品色哟哟| 精品视频一区二区不卡| 日韩成人一级片| 欧美日韩精品一区二区三区四区| 亚洲一区二区在线播放相泽| av不卡在线观看| 免费在线视频一区| 亚洲欧洲色图综合| 欧美疯狂做受xxxx富婆| 久久精品国产网站| 亚洲国产精品99久久久久久久久| 麻豆精品一区二区综合av| 久久精品一区二区三区av| 丝袜国产日韩另类美女| 欧美电影免费观看高清完整版在线观看| 国产老肥熟一区二区三区| 国产精品人妖ts系列视频| 成人app网站| 久久99国产精品麻豆| 欧美日韩高清一区二区三区| 国产在线视视频有精品| 99精品国产99久久久久久白柏| 91麻豆6部合集magnet| 欧美熟乱第一页| 精品国产凹凸成av人导航| 国产区在线观看成人精品 | 国产盗摄视频一区二区三区| 国产一区免费电影| 国产麻豆精品95视频| 丰满少妇久久久久久久| www.色综合.com| 91久久线看在观草草青青| 在线成人av网站| 亚洲国产高清在线观看视频| 国产精品福利av | 欧美一区二区三区不卡| 欧美r级在线观看| 91免费国产视频网站| 欧美日韩一区二区三区不卡| 国产婷婷色一区二区三区在线| 综合激情成人伊人| 免费看黄色91| 亚洲女人的天堂| 国产精品中文字幕日韩精品| 色婷婷久久99综合精品jk白丝| av在线不卡电影| 日韩精品视频网| 亚洲欧美自拍偷拍| 国产精品一区二区男女羞羞无遮挡| 日韩免费看的电影| 不卡的av在线| 人人超碰91尤物精品国产| 久久无码av三级| 色婷婷一区二区三区四区| 日韩电影在线观看网站| 在线看国产一区| 国产剧情一区二区三区| 国产色产综合色产在线视频| 青青草国产成人99久久| 欧美在线影院一区二区| 一区二区三区在线免费视频| 一本大道久久a久久综合婷婷| 国产精品理伦片| 国产成人亚洲精品青草天美| 欧美日韩aaa| 老司机精品视频导航| 欧美在线|欧美| 亚洲成人免费在线观看| 4438x成人网最大色成网站| 老司机精品视频导航| 久久精品一级爱片| 成人黄色网址在线观看| 国产欧美精品在线观看| 在线欧美日韩国产| 成人黄页在线观看| 亚洲午夜精品在线| 欧美精品一区二| 99re66热这里只有精品3直播| 亚洲一级二级三级| 精品日韩在线一区| 亚洲视频在线一区观看| 日韩欧美三级在线| 91亚洲精品久久久蜜桃网站 | 国产色综合久久| 99亚偷拍自图区亚洲| 国产一区二区成人久久免费影院| 久久蜜臀中文字幕| 欧美性猛交一区二区三区精品| 亚洲国产精品av| 欧美剧情电影在线观看完整版免费励志电影 | 国产不卡免费视频| 日韩和欧美一区二区| 综合色天天鬼久久鬼色| 日韩va亚洲va欧美va久久| 亚洲天堂av一区| 精品久久久久香蕉网| 一区二区三区四区五区视频在线观看 | 97se亚洲国产综合自在线观| 国内精品第一页| 日韩一区二区三区免费看| 欧美日韩国产美| 欧美成人一区二区| 久久综合成人精品亚洲另类欧美| 日韩欧美在线不卡| 久久先锋影音av鲁色资源网| 国产亚洲精品久| 亚洲三级视频在线观看| 麻豆成人91精品二区三区| 久草热8精品视频在线观看| 国产91精品欧美| 91精品国产欧美一区二区| 精品国产乱码久久久久久1区2区| 国产乱国产乱300精品| 激情综合色播激情啊| 国产成人夜色高潮福利影视| 一区2区3区在线看| 一区二区三区四区精品在线视频| 国产精品久久久久永久免费观看 | www.日韩精品| 99免费精品视频| 日本二三区不卡| 国产欧美一区二区精品性色| 国产精品丝袜久久久久久app| 亚洲婷婷综合色高清在线| 国产欧美日韩在线观看| 亚洲国产精品久久人人爱蜜臀| 视频一区视频二区中文| 九九热在线视频观看这里只有精品| 大陆成人av片| 91精品国产手机| 精品第一国产综合精品aⅴ|