久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

SQ中查詢底層運(yùn)行原理是什么

175次閱讀
沒有評論

共計 3255 個字符,預(yù)計需要花費(fèi) 9 分鐘才能閱讀完成。

自動寫代碼機(jī)器人,免費(fèi)開通

丸趣 TV 小編給大家分享一下 SQ 中查詢底層運(yùn)行原理是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

數(shù)據(jù)準(zhǔn)備

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

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

 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 表進(jìn)行 join,然后篩掉 city_name != 上海 的數(shù)據(jù),接著按照 city_name 進(jìn)行分組,統(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)化技術(shù)不做考慮,比如謂詞下推、投影下推等等。

執(zhí)行的底層原理

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

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

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

首先會通過 CROSS JOIN 求笛卡爾積,相當(dāng)于得到虛擬表 vt1-1;

接著通過 ON 條件進(jìn)行篩選,虛擬表 vt1-1 作為輸入,輸出虛擬表 vt1-2;

添加外部行。我們使用的是左連接、右鏈接或者全連接,就會涉及到外部行,也就是在虛擬表 vt1-2 的基礎(chǔ)上增加外部行,得到虛擬表 vt1-3

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

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

分組 (Group by)

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

分組過濾 (Having)

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

返回查詢字段 (Select)

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

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

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

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

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

FROM citizen
JOIN city

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

namecity_idcity_idcity_nametom31 上海 tom32 北京 tom33 杭州 jack21 上海 jack22 北京 jack23 杭州 robin11 上海 robin12 北京 robin13 杭州 jasper31 上海 jasper32 北京 jasper33 杭州 kevin11 上海 kevin12 北京 kevin13 杭州 rachel21 上海 rachel22 北京 rachel23 杭州 trump31 上海 trump32 北京 trump33 杭州 lilei11 上海 lilei12 北京 lilei13 杭州 hanmeiei11 上海 hanmeiei12 北京 hanmeiei13 杭州

在 FROM 和 JOIN 執(zhí)行結(jié)束之后,會按照 JOIN 的 ON 條件,篩選所需要的行

ON citizen.city_id = city.city_id

namecity_idcity_idcity_nametom33 杭州 jack22 北京 robin11 上海 jasper33 杭州 kevin11 上海 rachel22 北京 trump33 杭州 lilei11 上海 hanmeiei11 上海

Step 2: 過濾數(shù)據(jù) (Where)

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

WHERE city.city_name !=  上海 

namecity_idcity_idcity_nametom33 杭州 jack22 北京 jasper33 杭州 rachel22 北京 trump33 杭州

Step 3: 分組 (Group by)

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

GROUP BY city.city_name

GROUP_CONCAT(citizen. name )city_idcity_namejack,rachel2 北京 tom,jasper,trump3 杭州

Step 4: 分組過濾 (Having)

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

HAVING COUNT(*)  = 2

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

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

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

citycitizen_cnt 北京 2 杭州 3

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

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

ORDER BY city.city_name ASC
LIMIT 2

citycitizen_cnt 北京 2 杭州 3

以上是“SQ 中查詢底層運(yùn)行原理是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道!

向 AI 問一下細(xì)節(jié)

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-12-04發(fā)表,共計3255字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 晋中市| 平原县| 环江| 桑植县| 鸡泽县| 射阳县| 滦南县| 方城县| 蛟河市| 北川| 改则县| 偃师市| 库尔勒市| 广德县| 正镶白旗| 济源市| 彩票| 涡阳县| 平原县| 城口县| 天津市| 卢龙县| 隆尧县| 贵德县| 葵青区| 望谟县| 清涧县| 丽江市| 大邑县| 荔浦县| 宝丰县| 肇州县| 望奎县| 苗栗市| 荣昌县| 积石山| 江津市| 邮箱| 信丰县| 夏河县| 湘潭市|