iT邦幫忙

2023 iThome 鐵人賽

DAY 20
1

大學升三年級時,剛放暑假卻接到一通電話,找我去幫忙寫程式,有同學的期末專題刻不出來,找我去救火。那一回,要開發的專案要求是:「把記憶體中的樹狀資料結構,存到硬碟裡,之後,程式要再設法讀取硬碟,把資料讀進記憶體裡並且重建樹狀資料結構。」

記憶之中,我的寫法非常地暴力,就是開啟一個檔案,然後定下一些規則,比方說:

  • byte 0~3,存放整數,整數可能有哪些值,代表何種意義。
  • byte 4~7,也是整數,指定這個欄位之後還有多長,比方說,n 。
  • 之後的 n 個 byte 就是存放 byte 型態的資料。

寫的時候,就是開啟檔案,一列一列地寫進檔案裡。讀的時候,自然也是一列一列地讀進記憶體。如果要查詢的話,一定要先讀進記憶體才有辦法查詢。

在 Joe Celko 的 SQL for Smarties 書裡,有講過一些早期程式設計師的故事。曾經有一個年代的程式設計師是有鐵飯碗的,又稱之為 job security programming,因為他們寫的程式,都有獨特的檔案讀寫規則。如果把他們開除了,這些檔案日後都將無法讀取。

當年那個既難寫又難維護的設計,基本上就跟 Joe Celko 所講的 job security programming 差不多。因為寫程式的人都不知道應該要使用 SQL 。(不過,前輩們是因為出生在 SQL 發明之前,而我是因為書念得太少。)

沒有利用 SQL/RDBMS 來儲存資料,而直接寫入檔案的話,程式碼與資料很容易緊密地耦合 (couple) 在一起,這會讓程式非常難以維護。

SQL 的初學者可能會覺得,資料表與檔案也差不多吧?不,真的差很多。在 SQL for smarties 一書的開頭,Joe Celko 就先強調了幾個重點:

  1. Databases are not file sets.
  2. Tables are not files.
  3. Rows are not records.
  4. Columns are not fields.
  5. Values in RDBMS are scalar, not structured (arrays, lists, meta-data).

對上述五點做解釋,已經超過本系列文的範疇。這邊直接跳到 Joe Celko 的結論:「什麼是 SQL 的運作模型 (working model) 呢?」

資料是存放在抽象的集合 (abstract set) 裡,而非實體的檔案裡。而此處的集合 (set),就是數學課裡談過的集合。換言之,SQL 是一種運作在集合上的語言。

光是要談清楚 SQL/RDMBS 就可以用幾本書的篇幅來談,另一方面,如果只是資料分析所需要學會的 SQL ,也可以不用到那麼高的標準。快速上手 SQL ,可以考慮用以下的順序來學:

  1. 先研究最基礎的四種 SQL 語法。
  2. 再多學一些其它的查詢語法,大約就到 SQL-92 的範圍為止。最好也寫一些練習題。
  3. 搞清楚 SQL 語句的運作順序。

基礎語法

這邊有四種最基礎的 SQL 語法,學會了,就可以擷取資料庫裡任意位置的資料了。

  1. SELECT * FROM $table1
  2. SELECT column1, column2, ... FROM $table1
  3. SELECT * FROM $table1 AS t1 JOIN $table2 AS t2 ON t1.id = t2.id
  4. SELECT * FROM $table1 WHERE condition

SQL-92

這邊推荐一個 UI 設計看起來很舊的 SQL 學習網站 1KeyData 。UI 看起來是舊了一些,但是內容的編排歷久彌新,大約就是涵蓋 SQL-92。

如果喜歡透過寫練習題來學習的讀者,也可以考慮像 SQLZoo 的互動式教學練習網站。

SQL 語句的執行順序

初學者一開始可能覺得「咦,這個有什麼意義嗎?」

有一天當你寫 SQL Query ,總是百思不得其解,為何這樣行、那樣又不行時,就是回來研究清楚 SQL 語句的執行順序的時刻了。

  1. Getting Data (From, Join)
  2. Row Filter (Where)
  3. Grouping (Group by)
  4. Aggregate function
  5. Group Filter (Having)
  6. Window Function
  7. SELECT
  8. Distinct
  9. Union
  10. Order by
  11. Offset
  12. Limit/Fetch/Top

其它資源

  1. 對 dbt 或 data 有興趣 👋?歡迎加入 dbt community 到 #local-taipei 找我們,也有實體 Meetup 請到 dbt Taipei Meetup 報名參加
  2. 歡迎訂閱 PruningSuccess 電子報,主要談論軟體開發、資料處理、資料分析等議題。

上一篇
Transformation layer: dbt 進階操作
下一篇
Transformation layer: SQL 進階語法
系列文
當代資料工程與資料分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言