基層sql語句各部分執行順序

  今天遇到一個問題,在使用mybatis來操作數據庫的時候。我要想通過一張中間表,來實現主表的查詢,並以前端easyui樣式中樹的形式展現出來,我利用兩個左鏈接left查詢數據庫的。不多說直接上查詢語句:

resoure是我的主表、user_res是我的中間表

第一個查詢語句:select a.id,a.name,a.url,b.url as burl,b.id as bid,b.name as bname from resoure a left join resoure b on b.pid=a.id left join user_res ur on b.id=ur.resid where ur.uid=1 and a.pid=0;

第二個查詢語句:

 select a.id,a.name ,a.url,b.url as burl,b.id as bid,b.name as bname from user_res ur  left join resoure a on a.id=ur.resid left join resoure b on b.pid=a.id where ur.uid=1 and a.pid=0 

  其實一看就能發現,第一個查詢出來的只有它的父節點和子節點,而沒有其他沒有字節點的父節點數據


而第二個則既可以查詢出來其擁有的子節點數據,還能查詢出來其他沒有子節點的數據。而這正是我們想要的結果


這就有了我們今天的問題了sql語句到底是怎麼執行的,是從前向後select先執行第一個left執行完生成一個臨時表,再執行第二個left然後輸出結果的嗎?

顯然不是這樣的,如果是生成了一箇中間表,那麼我們第二條語句就會直接報錯,因爲他根本找不到我們的b表是什麼。你可以把兩個left拆開實驗下,一個個來查詢試試。

所以可以判斷,sql語句是先執行了from之後的內容,得出一個結果,然後根據我們要查的字段即select後的內容。來爲我們輸出。


sql語句中各部分的執行順序:

1、查詢中用到的關鍵詞主要包含六個,並且他們的順序依次爲 
select--from--where--group by--having--order by 
 
其中select和from是必須的,其他關鍵詞是可選的,這六個關鍵詞的執行順序 
與sql語句的書寫順序並不是一樣的,而是按照下面的順序來執行 
from--where--group by--having--select--order by, 
2、
from後面的表關聯,是自右向左解析的 
而where條件的解析順序是自下而上的。 
 
也就是說,在寫SQL文的時候,儘量把數據量大的表放在最右邊來進行關聯, 
而把能篩選出大量數據的條件放在where語句的最下面。
3、我在網上看到一個圖解析的挺不錯的分享出來:

弄清了關係,我們就很好的寫語句了。寫的不好,哪寫錯了望指出多多交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章