1. 程式人生 > >基層sql語句各部分執行順序

基層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、我在網上看到一個圖解析的挺不錯的分享出來:
弄清了關係,我們就很好的寫語句了。寫的不好,哪寫錯了望指出多多交流。