一、概述
最近公司招了一批新人,做數據庫開發,這些新人中不少是工作兩年內甚至是應屆生。鑒於這種情況,領導要求組內成員輪流每周都做一個技術分享,一是提升大家的專業知識和表達能力,二是讓彼此互相熟悉,加強組內的凝聚力。輪到我了,我想給大家講講新手如何學習sql,以及工作中的一些小建議。
二、如何學習sql
學習sql可以分為以下三個階段。
1. 初級
a. 掌握sql語法,知道sql語句,如:SELECT col1, col2, count() cnt FROM table1 WHERE col1 = 'XX' AND col2 = 'YY' GROUP BY col1, col2 HAVING count() > 2 ORDER BY col1 desc, cnt; 這些關鍵字執行的先后順序。
b. 掌握數據庫內置函數,知道這些內置函數的官方文檔去哪查。
c. 掌握數據庫常用的數據類型,例如char和varchar的區別,char與varchar進行表關聯的坑在哪里。時間、數字、字符串這些類型如何相互轉換。
d. 掌握表關聯的類型,知道內連接,左外連,右外連,全外連的區別。
在這個階段,主要是能寫,能看。在保證結果正確的基礎上,盡量做到sql語句簡潔,優雅。編寫長段的sql語句,分清楚大小寫和如何換行,讓sql語句清晰。
2. 中級
a. 知道什么是執行計划,怎么看。
b. 了解索引的結構,知道如何建立合適的索引,使用索引的優缺點,以及什么時候索引sql語句用不到。
c. 知道什么是統計信息,統計信息如何收集,統計信息如何影響執行計划。
d. 知道鎖的類型,什么是表鎖和行鎖,知道怎么去查數據庫里面的鎖。
e. 知道什么是綁定變量,如何使用,有哪些優缺點。
f. 知道什么是分區表,有哪些類型,如何使用。
g. 知道什么是臨時表,用在哪個場景。
在這個階段,開始注意到sql的性能,試圖寫出高效的sql。
3. 高級
a. 知道表關聯有哪些方式,這里的表關聯跟初級里面提到的表關聯不一樣,這里的表關聯指的是數據庫后台如何對兩張表匹配選出最優的執行計划。
b. 了解一條sql語句從發出到最后查到結果,數據庫后台做了哪些事情。
c. 了解體系結構,掌握oracle的內存池,sql語句存在哪里,表的數據緩存存在哪里,sql結果存在哪里等。
d. 知道hint的種類,會強制sql按照自己想要的方式執行。
e. 對於性能時好時壞的sql語句知道如何固定最優的執行計划。
f. 處理一些特定的情況,如文本長度超過varchar的最大長度了該如何處理,怎么存儲圖片這些大文件,有哪些優缺點,如何改進。
在這個階段,應該是對數據庫的體系結構十分清晰,一條sql語句寫出來,能在自身腦海中想出它的最優執行計划,如果數據庫實際情況不是這樣,能分析原因,最后實在是找不到原因,還能強迫它按照自己想象的劇本走。
三、工作建議
上面所講的都是些純技術方面的,接下來我想跟大家談談工作的感想。主要是以下幾點。
1. 創造勞動價值
公司給員工提供工作崗位並且給員工發工資,員工在這個崗位上給公司干活拿錢,這屬於一個共贏的局面。作為員工,我們其實要思考我們的價值在哪里,是辛苦勞動產生價值,還是提升自己實力產生價值,其實都不是。
辛苦勞動,要看你每天勞動的這些內容是否是重復的,是否有意義,有沒有更優化的方案。提升自己,一個人考一堆的證書,學一堆的技術,雜而不精,生產上面根本不敢用或者用不到,別人問起來似是而非,價值又在哪里。真正的價值應該是在有限的工作時間里,將自己的工作內容高效完成,同時優化他人的工作內容。
舉個例子,不少企業對服務器和數據庫的監控還是靠人去定時執行腳本來巡檢,如果數量多了,那么這個人可能一整天都要干這個事,有沒有優化方案呢,有,通過自動化平台去實現。不會咋辦,學,東西做出來之后,是不是節省了人力,自己也學到了東西,這就是避免重復勞動和只學有用的知識。再舉個例子,運營每天晚上發送賬單,深圳通和郵件很慢,因為一直都慢,所以她們也習慣了,導致她們在做下一波事情前,只能干等。是不是有優化方案,怎么提速呢?我們在解決其它部門問題的時候,自己是不是也學到了技術,這就是價值。
2. 不挑活,認真對待手上的每一件事
古人學問無遺力,少壯工夫老始成
紙上得來終覺淺,絕知此事要躬行