SQL 挑戰,一個讓你彎道超車的關鍵

更新於 2023/05/10閱讀時間約 4 分鐘
MySQL Database
沒有什麼是 SQL 寫不出來的 — By 我工作的第一個主管

變強的關鍵「轉置」

我的第一份工作在開發報表系統,當時我的 SQL 能力是 「select * from table」這種初學者等級,我看同事們都很強實在緊張,於是我帶著敬畏的心去請教直屬主管,看有沒有讓自己進步的好辦法。結果直屬主管跟我說了這句話,霸氣外露的一句話讓我印象極為深刻,請教結束後主管還出了一門作業「SQL 轉置」,並特別交代我說:「你只要把這個技術學會就會變強」。先插個話,可能有蠻多人沒聽過轉置(Transpose),有興趣了解細節的人可以先參考維基百科-轉置矩陣 說明。 「SQL 轉置」簡單說,就是用 SQL 語法把一個資料集合,例如,資料表格(table)、檢視表(view)、子查詢(sub query) 等的「直行轉橫列」或「橫列轉直行」的技巧。我問主管說為什麼學會這招就會變強?主管只是笑笑跟我講,你先回去功課做好再來。可惜這道題目我當時也只解開了前半「直行轉橫列」,另一半實在解不出來,還好直屬主管人不錯,他說我沒經驗能做到這樣算不錯了,隨後給我演示了另一半「橫列轉直行」的技巧,如此神操作讓我驚為天人!這個 SQL 轉置技巧也讓我一路沿用下來,特別是後來的 ETL 改善與檢視表(view) / 預儲程式 (stored procedure) 的設計上。

Pivot 也是一招

現在 SQL 轉置已經有專用的語法了,只要去 google 一下「 sql pivot」 關鍵字就能找到不錯資料,例如這一篇「**[SQL] 使用 PIVOT 扭轉資料,由直列轉為橫向資料」**就有不錯的 Pivot 使用說明。那為什麼會說學會這種 SQL 轉置技巧就會變強呢?因為資料轉置可以讓我們結算好資料一次撈出來效率極佳。我舉個例子給你聽你就懂了,當時我負責的系統有很多 24 小時都在跑的 SQL ETL,在我接手維護的一段時間後,注意到很多 99.9% 相似的 SQL ETL,彼此間唯一的差異就是 Where 的條件帶了一個不同的條件參數,例如:機台 AVA010, AVA020…,所以有多少台設備就有多少 SQL ETL 。我問了前輩為什麼,他回我:「大家都是這樣寫,讓每一隻 SQL 只負責一個控制常數這樣比較簡單」。我說:「可是如果來源表格結構有變,例如欄位改名字,這麼多 SQL 要怎麼處理?」前輩回我:「那就全部一起改,很快!」;我:「那如果有新的參數呢?」前輩:「直接 Copy 其中一隻改一下即可」。你看出問題了嗎?就像是寫程式明明可以寫成函數呼叫,卻硬要用 Ctrl+C, Ctrl+V 一樣糟糕。

看見價值

後來我學會了 SQL 轉置技巧後,嘗試把相似的 16 隻 SQL ETL 整成 1 隻,意外發現速度跟原本差不多但維護成本減少 90% 以上。這給了我很大的信心,隨著我把一兩百隻 SQL ETL 全部整理過到剩下 20 隻左右,我才終於明白了當時直屬主管說的「沒有什麼是寫不出來的」的真正意思,是「一次就能把資料結算好撈出來的真.SQL 功夫」。這種方法在開發管理報表的時候特別有用。橫列轉直行可以用來 group by 統計資料、直行轉橫列可以組合要顯示的欄位,也因為需要在層層的 SQL 中不斷地應用,通常會寫得很長,透過內縮排版來增加可讀性、可維護性也是非常重要的。
順帶一提另一種極端的做法就是用最簡單的「 select * 」把所有的資料 raw data 全部拉出來到網頁伺服器程式端再來計算數據的方式,你知道問題在哪嗎?
  1. 資料庫只發揮了儲存資料的能力,運算能力完全沒用到
  2. 網路上傳輸大量 Raw data 會佔用很大的頻寬會影響到其他生產線的資訊系統,傳輸百萬筆 Raw data 資料跟結算後的千筆資料時間相比天差地遠
  3. 伺服器記憶體不足,必須先準備 RecordSet 來承接這些資料才能開始運算,記憶體一路狂飆,伺服器就會無法回應,使用者體驗極差無比

結語

最後我想說的是,我非常感謝帶我入門的直屬主管與同事們,沒有他們的狂言豪語刺激,我不會有深刻的學習體悟。因為不管學習哪一門技術,最看重的還是追求「真理」的心,一定要先知其然而後要知其所以然,才能做到以一通百千變萬化。好了,接下來換我要出作業給你了:「要請你試試在不用專門的 Pivot 的語法,只用 SQL 語法做出轉置的結果,任何資料庫都可以」,我非常期待你的答案。
為什麼會看到廣告
avatar-img
14會員
61內容數
WarrenLo's 軟體設計武功祕笈
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Warren Lo的沙龍 的其他內容
還有三個指標都是利用前一篇的產能指標計算出來的,焦點都在設備上。因為一間工廠要賺錢就要生產產品,要生產產品就要投資設備,當有重大設備投資前工廠管理團隊就會評估 ROI (投資報酬率),並期望未來兩三年回收開始「攤平」賺錢
不查不知道,一查嚇一跳,足足七種之多,分別是超鍵 (Super key)、候選鍵 (Candidate key)、主鍵 (Primary key)、替代鍵 (Alternative key)、複合鍵 (Composite key)、唯一鍵 (Unique key) 和外鍵 (Foreign key)
每隔 3 秒鐘就會有一個產品在你眼前出現。我開始算:一個產品 3 秒,一天有 86400 秒,這條生產線一天可以產出 28800 個產品… 廠長說,你那是理論值,工廠實際產能不是這樣算的,還要考慮工廠利用率、可用率、設備、還有製程良率才能得出產能數字,幫助管理人員做決策。
這幾年客戶對品質要求越來越高了,這份 guideline 就是他們的一個大咖客戶給的,每個新機種都會進行 Golden Line 評估,定期稽核也是用這張評分表打分數,所有相同類型供應商們都要通過考核才有機會拿訂單。
遊戲這種「屍骨無存」方式處理被打倒的怪物們就是記憶體管理機制,是程式設計的時候一定會被拿出來討論的一門技術。
在軟體設計的工作裡除了你熟悉的 coding 技能外,還有一塊非常重要經常被忽略,那就是處理資料存儲的部分。我們現在用的軟體功能都很複雜,為了有更好的使用者體驗,軟體設計師會在後台儲存有很多的設定資料並且紀錄軟體運作過程中的資料流數據,為了更好的記錄應用這些資訊,通常會搭配一個資料庫在程式裡面
還有三個指標都是利用前一篇的產能指標計算出來的,焦點都在設備上。因為一間工廠要賺錢就要生產產品,要生產產品就要投資設備,當有重大設備投資前工廠管理團隊就會評估 ROI (投資報酬率),並期望未來兩三年回收開始「攤平」賺錢
不查不知道,一查嚇一跳,足足七種之多,分別是超鍵 (Super key)、候選鍵 (Candidate key)、主鍵 (Primary key)、替代鍵 (Alternative key)、複合鍵 (Composite key)、唯一鍵 (Unique key) 和外鍵 (Foreign key)
每隔 3 秒鐘就會有一個產品在你眼前出現。我開始算:一個產品 3 秒,一天有 86400 秒,這條生產線一天可以產出 28800 個產品… 廠長說,你那是理論值,工廠實際產能不是這樣算的,還要考慮工廠利用率、可用率、設備、還有製程良率才能得出產能數字,幫助管理人員做決策。
這幾年客戶對品質要求越來越高了,這份 guideline 就是他們的一個大咖客戶給的,每個新機種都會進行 Golden Line 評估,定期稽核也是用這張評分表打分數,所有相同類型供應商們都要通過考核才有機會拿訂單。
遊戲這種「屍骨無存」方式處理被打倒的怪物們就是記憶體管理機制,是程式設計的時候一定會被拿出來討論的一門技術。
在軟體設計的工作裡除了你熟悉的 coding 技能外,還有一塊非常重要經常被忽略,那就是處理資料存儲的部分。我們現在用的軟體功能都很複雜,為了有更好的使用者體驗,軟體設計師會在後台儲存有很多的設定資料並且紀錄軟體運作過程中的資料流數據,為了更好的記錄應用這些資訊,通常會搭配一個資料庫在程式裡面
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
題目敘述 題目會給我們一張Views資料表。裡面分別有article_id、author_id、viewer_id、view_date等欄位。題目說這張資料表沒有主鍵Primary key,而且可能有重複欄位。 題目要求我們列出所有讀過自己寫的文章的作者ID 輸出答案時,請以作者ID做升序排列
Thumbnail
題目敘述 題目會給我們一張World資料表,裡面分別有name、 continent、area、population 、gdp等欄位,其中name 是主鍵Primary Key。 要求我們列出所有大型國家,大型國家的定義是 人口大於等於兩千五百萬人 或者 土地面積大於等於三百萬平方公里。 輸出順
我: '' OR '1'='1' GPT: The string you provided is a SQL injection attack. It is an attempt to exploit a vulnerability in a web application's database b
Thumbnail
我自己是使用微軟的SQLIT軟體 這個軟體的操作上 沒有辦法直接用滑鼠點選或是拖拉的方式來看到你想看到的表格 都是要下指令的像是要看data.sqlite中的user這個table我就必須下 才能把table調閱出來看 那做為一個python三年工作經驗的工程師通常我不會直接在SQLIT軟體 裡面下
Microsoft Windows [版本 10.0.19044.2604] (c) Microsoft Corporation. 著作權所有,並保留一切權利。 C:\Users\ricky\Desktop\sqlmap-dev>python sqlmap.conf File "C:\Users
Thumbnail
sqlmap是一個python的滲透測試工具 SQL 注入 **SQL 注入(SQL injection)**利用了網路程式(Web apps)的錯誤輸入。駭客可以透過執行後端資料庫的網路程式,惡意繞過 SQL 指令。 SQL 注入能在未授權的情況下,直接從資料庫訪問資料庫與檢索信息。許多數據洩露肇
Thumbnail
最近因為工作的關係,遇到了取用Oracle資料庫的問題,這邊有一篇實作後確實可用的文章,在此紀錄與增補一些遇到的問題
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
題目敘述 題目會給我們一張Views資料表。裡面分別有article_id、author_id、viewer_id、view_date等欄位。題目說這張資料表沒有主鍵Primary key,而且可能有重複欄位。 題目要求我們列出所有讀過自己寫的文章的作者ID 輸出答案時,請以作者ID做升序排列
Thumbnail
題目敘述 題目會給我們一張World資料表,裡面分別有name、 continent、area、population 、gdp等欄位,其中name 是主鍵Primary Key。 要求我們列出所有大型國家,大型國家的定義是 人口大於等於兩千五百萬人 或者 土地面積大於等於三百萬平方公里。 輸出順
我: '' OR '1'='1' GPT: The string you provided is a SQL injection attack. It is an attempt to exploit a vulnerability in a web application's database b
Thumbnail
我自己是使用微軟的SQLIT軟體 這個軟體的操作上 沒有辦法直接用滑鼠點選或是拖拉的方式來看到你想看到的表格 都是要下指令的像是要看data.sqlite中的user這個table我就必須下 才能把table調閱出來看 那做為一個python三年工作經驗的工程師通常我不會直接在SQLIT軟體 裡面下
Microsoft Windows [版本 10.0.19044.2604] (c) Microsoft Corporation. 著作權所有,並保留一切權利。 C:\Users\ricky\Desktop\sqlmap-dev>python sqlmap.conf File "C:\Users
Thumbnail
sqlmap是一個python的滲透測試工具 SQL 注入 **SQL 注入(SQL injection)**利用了網路程式(Web apps)的錯誤輸入。駭客可以透過執行後端資料庫的網路程式,惡意繞過 SQL 指令。 SQL 注入能在未授權的情況下,直接從資料庫訪問資料庫與檢索信息。許多數據洩露肇
Thumbnail
最近因為工作的關係,遇到了取用Oracle資料庫的問題,這邊有一篇實作後確實可用的文章,在此紀錄與增補一些遇到的問題