SQL 查询并不是从 SELECT 开始的
日常使用中寫 SQL 查詢命令都是以 SELECT 開始的(注意:本文僅探討 SELECT 查詢,不涵蓋 insert 或其他 SQL 命令)。
昨天我想到一個問題:可以用 WHERE、HAVING 或者其他方式來過濾窗口函數(shù)執(zhí)行結(jié)果嗎?
經(jīng)過一番探索,我得出的最終結(jié)論是否定的,因為窗口函數(shù)必須在 WHERE 和 GROUP BY 之后才能運行。但是,這也延伸到了一個更大的問題——SQL 查詢的執(zhí)行順序是怎么樣的呢?
你所不知道的 SQL 查詢執(zhí)行順序
我專門查了一下文檔 SQL 查詢執(zhí)行順序如下:
如果不喜歡以上五彩斑斕的圖片形式,也可以看下面的文字:
FROM/JOIN/ON
WHERE
GROUP BY
HAVING
SELECT(窗口函數(shù)即在此步驟執(zhí)行)
ORDER BY
LIMIT
上圖可以解答你的如下疑惑:
上圖是 SQL 查詢的語義說明。看懂這張圖,便能迅速判斷一個給定的 SQL 查詢將會返回什么結(jié)果,也可以輕松解答如下疑問:
可以對 GROUP BY 的結(jié)果進行 WHERE 篩選嗎?(不可以!因為 WHERE 在 GROUP BY 之前執(zhí)行)
可以對窗口函數(shù)的執(zhí)行結(jié)果進行過濾嗎?(不可以!因為窗口函數(shù)在 SELECT 步驟執(zhí)行,而這步是在 WHERE 和 GROUP BY 之后)
可以對 GROUP BY 的結(jié)果再執(zhí)行 ORDER BY 操作嗎? (可以!ORDER BY 基本上是最后一個步驟了,所以可以對任何操作的執(zhí)行結(jié)果執(zhí)行 ORDER BY)
LIMIT 執(zhí)行在哪個步驟? (最后一步!)
雖然如此,但實際上數(shù)據(jù)庫引擎并非嚴(yán)格按照這個順序運行查詢,因為它們還會執(zhí)行一系列的優(yōu)化,以便提升查詢速度。
所以:
當(dāng)你想了解查詢語句的有效性,或是想搞明白為什么會返回這樣一個查詢結(jié)果時,可以嘗試用該圖來解釋;
但是,使用該圖是無法解釋查詢性能或索引相關(guān)問題的,它們會涉及到更多變量,因而也更為復(fù)雜。
一、最容易搞混的:列別名
比如:關(guān)聯(lián)姓和名,并對其進行分組。SQL 語法是允許這樣寫:
SELECT CONCAT(first_name, ' ', last_name) AS full_name, count(*)
FROM table
GROUP BY full_name
上面的查詢看起來像是在 SELECT 之后執(zhí)行 GROUP BY,但其實 GROUP BY是先執(zhí)行的,因為 GROUP BY 引用了 SELECT 中的 alias。
數(shù)據(jù)庫引擎是可以將查詢重寫為:
SELECT CONCAT(first_name, ' ', last_name) AS full_name, count(*)
FROM table
GROUP BY CONCAT(first_name, ' ', last_name)
接著,先執(zhí)行 GROUP BY 中的語句,再進行 SELECT 操作,所以上面那么寫是可行的。
groups.tianya.cn/post-15258-8cd8a4b1b1c6440984d569aa6a4d8e85-1.shtml
groups.tianya.cn/post-15258-7de57c9ad2bd4131b2eb3837ce46c5d7-1.shtml
groups.tianya.cn/post-15258-e4729c5bf6c846b3930cda38389d50e8-1.shtml
groups.tianya.cn/post-15258-f638c01cecb745168f918be9a4728e32-1.shtml
groups.tianya.cn/post-15258-ac48b834a16e46bda8a971ce6cf9e30a-1.shtml
groups.tianya.cn/post-15258-1e552880e9144b79a23020a34bbc4f8a-1.shtml
groups.tianya.cn/post-15258-0db9612ed82f4c94ac0051e10a732db2-1.shtml
groups.tianya.cn/post-15258-fe287a7b358e40168b82d4413c9e4ff4-1.shtml
groups.tianya.cn/post-15258-d4d0c9546f0d4ee08a063180b43e3e86-1.shtml
groups.tianya.cn/post-15258-40c402b45bb7433093b5b044dd280c02-1.shtml
groups.tianya.cn/post-15258-699f62a5ef1a419088fa96b027aa908d-1.shtml
groups.tianya.cn/post-15258-2668f5813ee644e4b0f15a70953a0b76-1.shtml
groups.tianya.cn/post-15258-92cc35bbd1c94b83898246605e839b3c-1.shtml
groups.tianya.cn/post-15258-cc0eddd4fc394e56948fbf46081b1025-1.shtml
groups.tianya.cn/post-15258-26b0950a1a9c44de8aa6b85207f5a53e-1.shtml
groups.tianya.cn/post-15258-a8bdbb09e15e45fd947e36b8c2525895-1.shtml
groups.tianya.cn/post-15258-da1ae6ac4f354e048bf2f9f055f1152a-1.shtml
groups.tianya.cn/post-15258-88f88729919343ee8f4704576ffeccdb-1.shtml
groups.tianya.cn/post-15258-c70acf9e465c42bbb00b97700c374f3a-1.shtml
groups.tianya.cn/post-15258-ffe3ab0c07414cb7aeda8edcd0cabf40-1.shtml
groups.tianya.cn/post-15258-5b1ad0c128534607b3365b076e7598bd-1.shtml
groups.tianya.cn/post-15258-a163b01aabe9437f888bad141c865b10-1.shtml
groups.tianya.cn/post-15258-bf648f2e867f4a15ad6d6f7826a6e683-1.shtml
groups.tianya.cn/post-15258-7b6b05c7c0584f448cc9718e58aaadfb-1.shtml
groups.tianya.cn/post-15258-c1cf6cfcf8ac4f85bd319165f527f35c-1.shtml
groups.tianya.cn/post-15258-7ad9e054fe294dc59bac8ef52455c0d1-1.shtml
groups.tianya.cn/post-15258-ea5a984335ea4b1e8402f52eeb780cdc-1.shtml
groups.tianya.cn/post-15258-1e09de1f919648d497f3fac492edec0e-1.shtml
groups.tianya.cn/post-15258-35d44b9dd1904430af5f909545b09a17-1.shtml
groups.tianya.cn/post-15258-b0dc79f218c943f9bac71fe5f19aa415-1.shtml
groups.tianya.cn/post-15258-16bee541841a45888613a38707ae9f29-1.shtml
groups.tianya.cn/post-15258-7d44f22ffb1a49c9a1a52a2b9422dfba-1.shtml
groups.tianya.cn/post-15258-64fdba5fb66649f7b1b18f437f8fc04a-1.shtml
groups.tianya.cn/post-15258-bde0afe080eb4b9d81ea4899652a617f-1.shtml
groups.tianya.cn/post-10498-e9f228610e5b43c58accd9c1ae3026d7-1.shtml
groups.tianya.cn/post-10498-e8b495f9d7b944adabac2e147a183363-1.shtml
groups.tianya.cn/post-10498-5d11dbe54f9f45838db4b38a3896a47a-1.shtml
groups.tianya.cn/post-10498-e6590d2200c64054accaf74e1e55f977-1.shtml
groups.tianya.cn/post-10498-c074899ee17c41998c394a39aa3f8eb3-1.shtml
groups.tianya.cn/post-10498-d1fd4efacffa4cb98e57f0e2e2931187-1.shtml
groups.tianya.cn/post-10498-0ea6b82458b6442f835cb646982d1f83-1.shtml
groups.tianya.cn/post-10498-f5aa521233a44f2cbb71f017b271aa18-1.shtml
groups.tianya.cn/post-10498-f3a13a30734b40e4986f108a7317d2b0-1.shtml
groups.tianya.cn/post-10498-88a096e03ae044a0b30aa4d4f213ef41-1.shtml
groups.tianya.cn/post-10498-5625c6c3648e418ab92b26749f863f8a-1.shtml
groups.tianya.cn/post-10498-5f00166972534a2f83722ef5db71de98-1.shtml
groups.tianya.cn/post-10498-40f6a590e7c248629e682f66efe6f8de-1.shtml
groups.tianya.cn/post-10498-6b61fe137c7a4fbc91bb7305f07d5028-1.shtml
groups.tianya.cn/post-10498-4fd4cbe9485e4eebb3cba1e02cc7233c-1.shtml
groups.tianya.cn/post-10498-94e229ffbfad44aba0a7187bba181fde-1.shtml
groups.tianya.cn/post-10498-3825feb11a314403b541a90f08cc89a1-1.shtml
groups.tianya.cn/post-10498-04b1752c9a634c04b1a8825e09cdbde2-1.shtml
groups.tianya.cn/post-10498-6c450bbf059a443a8f4d99fbcb1341fd-1.shtml
groups.tianya.cn/post-10498-6c450bbf059a443a8f4d99fbcb1341fd-1.shtml
groups.tianya.cn/post-10498-6c6fd5d71c0f488f978a706e565718b8-1.shtml
groups.tianya.cn/post-10498-4d76694d8dff4e248fa0af18e5cdff00-1.shtml
groups.tianya.cn/post-10498-0195b0e70dd944578c29f863eec0ef17-1.shtml
groups.tianya.cn/post-10498-7622405509174ac5aacbba75a0bfabb1-1.shtml
groups.tianya.cn/post-10498-ee3162619dde4169b0da58e8c04e21b6-1.shtml
groups.tianya.cn/post-10498-26b01fcc79874638a72421c3b16f529f-1.shtml
?
總結(jié)
以上是生活随笔為你收集整理的SQL 查询并不是从 SELECT 开始的的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pn532复制教程 linux,Linu
- 下一篇: Admiral UVA - 1658