標籤:mysql 緩衝區 不能 怎麼 它的 令行 相同 個數 就是
很多程式員都很抵觸SQL。其實SQL是一整為數不多的聲明性語言,只是它的運行方式完全不同於我們所熟知的命令列語言、物件導向的程式語言、甚至是函數語言。
今天大家共同學習下SQL的文法順序與執行順序。(入門級的。大神們可以直接點退出了哈。)
SQL 是一種聲明式語言
首先要把這個概念記在腦中:“聲明”。 SQL 語言是為電腦聲明了一個你想從未經處理資料中獲得什麼樣的結果的一個範例,而不是告訴電腦如何能夠得到結果。
SQL 語言聲明的是結果集的屬性,電腦會根據 SQL 所聲明的內容來從資料庫中挑選出符合聲明的資料,而不是像傳統編程思維去指示電腦如何操作。這是不是很爽?
(小編:簡單粗暴地說:喂,電腦你把上個月存進去的所有銷售記錄給我調出來。電腦:上個月的記錄有:
上邊的例子很明確了吧。我們不關心這些資料怎麼得來的,我們只想瞅瞅結果而已。
為啥很多程式員都很抵觸SQL呢,主要原因是:我們潛意識中的是按照命令式編程的思維方式思考問題的。就好像這樣:“電腦,先執行這一步,再執行那一步,但是在那之前先檢查一下是否滿足條件 A 和條件 B ”。例如,用變數傳參、使用迴圈語句、迭代、調用函數等等,都是這種命令式編程的思維慣式。而SQL恰恰沒有按照這種命令式編程的思維方式來處理問題。
另外,最最關鍵的一點:SQL 的文法並不按照文法順序執行
SQL 陳述式有一個讓大部分人都感到困惑的特性,就是:SQL 陳述式的執行順序跟其語句的文法順序並不一致。SQL 陳述式的文法順序是:
SELECT[DISTINCT]
FROM
WHERE
GROUP BY
HAVING
UNION
ORDER BY
為了方便理解,上面並沒有把所有的 SQL 文法結構都列出來,但是已經足以說明 SQL 陳述式的文法順序和其執行順序完全不一樣,就以上述語句為例,其執行順序為:
FROM
WHERE
GROUP BY
HAVING
SELECT
DISTINCT
UNION
ORDER BY
關於 SQL 陳述式的執行順序,有三個值得我們注意的地方:
1、 FROM 才是 SQL 陳述式執行的第一步,並非 SELECT 。資料庫在執行 SQL 陳述式的第一步是將資料從硬碟載入到資料緩衝區中,以便對這些資料進行操作。
2、 SELECT 是在大部分語句執行了之後才執行的,嚴格的說是在 FROM 和 GROUP BY 之後執行的。理解這一點是非常重要的,這就是你不能在 WHERE 中使用在 SELECT 中設定別名的欄位作為判斷條件的原因。
如果你想重用別名new_rq,你有兩個選擇。要麼就重新寫一遍 new_rq 所代表的原欄位:
…或者求助於衍生表、通用日期運算式或者視圖,以避免別名重用。
3、 無論在文法上還是在執行順序上, UNION 總是排在在 ORDER BY 之前。很多人認為每個 UNION 段都能使用 ORDER BY 排序,但是根據 SQL 語言標準和各個資料庫 SQL 的執行差異來看,這並不是真的。儘管某些資料庫允許 SQL 陳述式對子查詢(subqueries)或者派生表(derived tables)進行排序,但是這並不說明這個排序在 UNION 操作過後仍保持排序後的順序。
(溫馨提示:並非所有的資料庫對 SQL 陳述式使用相同的解析方式。如 MySQL、PostgreSQL和 SQLite 中就不會按照上面第二點中所說的方式執行。)
親們。大家學會了嗎?
既然並不是所有的資料庫都按照上述方式執行 SQL 預計,那我劈裡啪啦打字半天為了啥啥?
為了使大家要永遠記得: SQL 陳述式的文法順序和其執行順序並不一致,這樣我們就能避開一些一般性的錯誤。如果你能記住 SQL 陳述式文法順序和執行順序的差異,那麼恭喜你,你已經可以輕鬆解決SQL的一些一般性問題了。
SQL 中的文法順序與執行順序(轉)