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í)行結(jié)束之后,會(huì)按照J(rèn)OIN的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子句。這將使用條件表達(dá)式評(píng)估每一行。如果行的計(jì)算結(jié)果不為true,則會(huì)將其從集合中刪除。
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子句,它將具有相同值的行分為一組。此后,將按組對(duì)所有Select表達(dá)式進(jìn)行評(píng)估,而不是按行進(jìn)行評(píng)估。
GROUP BY city.city_name
GROUP_CONCAT(citizen. name ) | city_id | city_name |
---|---|---|
jack,rachel | 2 | 北京 |
tom,jasper,trump | 3 | 杭州 |
Step 4:分組過濾 ( Having )
對(duì)分組后的數(shù)據(jù)使用Having子句所包含的謂詞進(jìn)行過濾
HAVING COUNT(*) >= 2
Step 5:返回查詢字段 ( Select )
在此步驟中,處理器將評(píng)估查詢結(jié)果將要打印的內(nèi)容,以及是否有一些函數(shù)要對(duì)數(shù)據(jù)運(yùn)行,例如Distinct,Max,Sqrt,Date,Lower等等。本案例中,SELECT子句只會(huì)打印城市名稱和其對(duì)應(yīng)分組的count(*)值,并使用標(biāo)識(shí)符“ City”作為city_name列的別名。
SELECT city.city_name AS "City", COUNT(*) AS "citizen_cnt"
city | citizen_cnt |
---|---|
北京 | 2 |
杭州 | 3 |
Step 6:排序與分頁(yè) ( Order by Limit / Offset )
查詢的最后處理步驟涉及結(jié)果集的排序與輸出大小。在我們的示例中,按照字母順序升序排列,并輸出兩條數(shù)據(jù)結(jié)果。
ORDER BY city.city_name ASC LIMIT 2
city | citizen_cnt |
---|---|
北京 | 2 |
杭州 | 3 |
總結(jié)
本文主要剖析了SQL語(yǔ)句的執(zhí)行順序和底層原理,基本的SQL查詢會(huì)分為六大步驟。本文結(jié)合具體事例,給出了每一步驟的詳細(xì)結(jié)果,這樣會(huì)對(duì)其執(zhí)行的底層原理有更加深刻的認(rèn)識(shí)。
到此這篇關(guān)于SQL查詢的底層運(yùn)行原理深入分析的文章就介紹到這了,更多相關(guān)SQL查詢底層運(yùn)行原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:葫蘆島 招商 石嘴山 常德 鶴崗 沈陽(yáng) 昆明 保定
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《SQL查詢的底層運(yùn)行原理深入分析》,本文關(guān)鍵詞 SQL,查詢,的,底層,運(yùn)行,原理,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。