sql語句語法順序與執行順序解析

SQL與js的實驗室 2017-01-22 21:17程序員

不少程序員都很抵觸SQL。其實SQL是一整爲數很少的聲明性語言,只是它的運行方式徹底不一樣於咱們所熟知的命令行語言、面向對象的程序語言、甚至是函數語言。

今天你們共同窗習下SQL的語法順序與執行順序。(入門級的。大神們能夠直接點退出了哈。)數據庫

 

SQL 是一種聲明式語言編程

首先要把這個概念記在腦中:「聲明」。 SQL 語言是爲計算機聲明瞭一個你想從原始數據中得到什麼樣的結果的一個範例,而不是告訴計算機如何可以獲得結果。函數

SQL 語言聲明的是結果集的屬性,計算機會根據 SQL 所聲明的內容來從數據庫中挑選出符合聲明的數據,而不是像傳統編程思惟去指示計算機如何操做。這是否是很爽?學習

(小編:簡單粗暴地說:喂,電腦你把上個月存進去的全部銷售記錄給我調出來。電腦:上個月的記錄有:spa

SQL 中的語法順序與執行順序上邊的例子很明確了吧。咱們不關心這些數據怎麼得來的,咱們只想瞅瞅結果而已。命令行

 

爲啥不少程序員都很抵觸SQL呢,主要緣由是:咱們潛意識中的是按照命令式編程的思惟方式思考問題的。就好像這樣:「電腦,先執行這一步,再執行那一步,可是在那以前先檢查一下是否知足條件 A 和條件 B 」。例如,用變量傳參、使用循環語句、迭代、調用函數等等,都是這種命令式編程的思惟慣式。而SQL偏偏沒有按照這種命令式編程的思惟方式來處理問題。對象

另外,最最關鍵的一點:SQL 的語法並不按照語法順序執行blog

 

SQL 語句有一個讓大部分人都感到困惑的特性,就是:SQL 語句的執行順序跟其語句的語法順序並不一致。SQL 語句的語法順序是:排序

  1. SELECT[DISTINCT]

  2. FROM

  3. WHERE

  4. GROUP BY

  5. HAVING

  6. UNION

  7. ORDER BY

爲了方便理解,上面並無把全部的 SQL 語法結構都列出來,可是已經足以說明 SQL 語句的語法順序和其執行順序徹底不同,就以上述語句爲例,其執行順序爲:

  1. FROM

  2. WHERE

  3. GROUP BY

  4. HAVING

  5. SELECT

  6. DISTINCT

  7. UNION

  8. ORDER BY

關於 SQL 語句的執行順序,有三個值得咱們注意的地方:

一、 FROM 纔是 SQL 語句執行的第一步,並不是 SELECT 。數據庫在執行 SQL 語句的第一步是將數據從硬盤加載到數據緩衝區中,以便對這些數據進行操做。

二、 SELECT 是在大部分語句執行了以後才執行的,嚴格的說是在 FROM 和 GROUP BY 以後執行的。理解這一點是很是重要的,這就是你不能在 WHERE 中使用在 SELECT 中設定別名的字段做爲判斷條件的緣由。

SQL 中的語法順序與執行順序若是你想重用別名new_rq,你有兩個選擇。要麼就從新寫一遍 new_rq 所表明的原字段:

SQL 中的語法順序與執行順序…或者求助於衍生表、通用數據表達式或者視圖,以免別名重用。

三、 不管在語法上仍是在執行順序上, UNION 老是排在在 ORDER BY 以前。不少人認爲每一個 UNION 段都能使用 ORDER BY 排序,可是根據 SQL 語言標準和各個數據庫 SQL 的執行差別來看,這並非真的。儘管某些數據庫容許 SQL 語句對子查詢(subqueries)或者派生表(derived tables)進行排序,可是這並不說明這個排序在 UNION 操做事後仍保持排序後的順序。

(舒適提示:並不是全部的數據庫對 SQL 語句使用相同的解析方式。如 MySQL、PostgreSQL和 SQLite 中就不會按照上面第二點中所說的方式執行。)

親們。你們學會了嗎?

既然並非全部的數據庫都按照上述方式執行 SQL 預計,那我噼裏啪啦打字半天爲了啥啥?

爲了使你們要永遠記得: SQL 語句的語法順序和其執行順序並不一致,這樣咱們就能避開一些通常性的錯誤。若是你能記住 SQL 語句語法順序和執行順序的差別,那麼恭喜你,你已經能夠輕鬆解決SQL的一些通常性問題了。

相關文章
相關標籤/搜索