1. 程式人生 > >《10步完全理解SQL》收穫

《10步完全理解SQL》收穫

非常好的一篇文章啊,讀後收穫頗多。雖然在校剛剛學完資料庫系統,但課程重在講述資料庫系統原理,SQL只是講了基本語法。自己雖然平時也用MySQL和Oracle,但也只是會用而已,對於語句背後的執行和意義並沒有過多了了解。可能也是自己學習不精,沒有去把SQL和資料庫原理中的關係運算等知識聯絡在一起。下面是一些收穫點:

1  SQL是一種宣告式語言

SQL是一種宣告式語言,所以在使用SQL時一定要轉變傳統程式設計觀念--定義執行邏輯和順序去指示資料庫操作。我們在使用SQL的時候只是宣告我們想要的結果集即可,資料庫會自己處理好邏輯並返回結果。

2  SQL語法不按語法順序執行

SQL語法執行順序應該是:

FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> UNION -> ORDER BY

FROM是第一個執行的這不難理解,因為要先將資料讀入記憶體再進行WHERE和GROUP BY的篩選。SELECT是在之後執行的,這也是為什麼一些資料庫不支援在FROM中使用SELECT中定義的別名。

UNION是在ORDER BY之前執行的,也就是說我們的ORDER BY是可以將拼接後的結果進行排序的,也就是能保證拼接後有序。

3  SQL語句的核心是對表的引用

SQL的核心是對錶的引用而不是SELECT。一個完整SQL執行過程就是一張張中間表的生成和傳遞的過程。

FROM語句輸出一張“聯合“表,來自所有引用的表在某一維度的集合。然後通過WHERE語句篩選和GROUP BY處理生成新的輸出表。

注意這裡GROUP BY也是對錶的引用進行操作,它將WHERE過後的表的引用轉換為一種新的引用方式。(注意GROUP BY語句的限制:用GROUP BY的時候,SELECT後沒有使用聚合函式的列都要出現在GROUP BY後面)

這裡如果結合資料庫系統原理課上學的關係代數(集合論)來看,一張資料庫的表就是一組資料元的關係,而每個 SQL 語句會改變一種或數種關係,從而產生出新的資料元的關係(即產生新的表)。

4  靈活的引用表可以建立功能強大的SQL語句

引用表主要通過JOIN關鍵字來實現。JOIN並不是SELECT語句的一部分,它是構建連線表的關鍵字。

儘量不要使用逗號來代替JOIN進行表連線。因為JOIN有兩個優勢在這裡:安全和更多的連線方式。

JOIN有很多變體,提供內連線、外連線、半連線、全連線等等功能。

5  使用SQL中的派生表

派生表其實就是括號之間的子查詢。使用派生表可以有效避免由於SQL邏輯產生的問題,同時一些情況下也可以提高SQL查詢效率。

同樣,因為SQL的核心是對錶的引用,而不是對欄位的引用,所以派生表是可以重用的。重用派生表可以通過WITH關鍵字實現。

6  SELECT實質是對關係的對映

這個不用過多解釋,但SELECT語句有很多特殊規則,一些重要的如下:

  1. 你僅能夠使用那些能通過表引用而得來的欄位;
  2. 如果你有 GROUP BY 語句,你只能夠使用 GROUP BY 語句後面的欄位或者聚合函式;
  3. 當你的語句中沒有 GROUP BY 的時候,可以使用開窗函式代替聚合函式;
  4. 當你的語句中沒有 GROUP BY 的時候,你不能同時使用聚合函式和其它函式;
  5. 有一些方法可以將普通函式封裝在聚合函式中;

7  靈活使用SQL語句中的幾個關鍵字

  • DISTINCT:在對映之後對資料進行去重
  • UNION:將兩個子查詢拼接起來並去重
  • UNION ALL:將兩個子查詢拼接起來但不去重
  • EXCEPT:將第二個子查詢中的結果從第一個子查詢中去除
  • INTERSECT:保留兩個子查詢中都有的結果並去重