為什麼用SQL而不是Excel+VBA?

剛選了一門SQL的入門課程,之前也沒有接觸過資料庫這種東西,自學過一定程度的VBA和Excel。問一個在專業人士看來可能很白痴的問題:感覺很多SQL里的任務都可以用Excel和VBA來搞定,那為什麼還這麼多人研究SQL呢?SQL相對於Excel和VBA的優勢又在哪裡?


Excel與SQL相比,就是計算器與計算機的區別。我們公司有幾個很傻很天真的分析師,自己用EXCEL搭建過一個小資料庫。一開始很爽,覺得自己很重要,後來發現每天在維護上花的時間越來越多,表格越做越大(&>200mb),連放假都要遠程登錄回來更新,眼看自己要淪落為IT人員。。。後來受不了,把表格交給了公司數據部門,放入SQL伺服器,從此人生又變得輕鬆了。剛交上去幾天好像自己剛剛癌症康復一樣。。。

樓主是金融博士生,我就舉一個相關的例子好了。假如你要研究這個問題:過去20年內的每天中,一個價格為spx spot的5%的3個月看跌期權,其strike為同時期的forward的價格的百分之幾? 這問題對你來說當然屬於弱智問題,但是你會發現每回答一次都需要整個option chain, 大約是3000個數據點。20年下來就是1.5億個數據點,你用什麼來儲存? Excel嗎?每一個option chain可是2維的哦,你是不是打算準備用5000個表格來儲存呢? 就算你存下來了,你會發現全部讀取一遍需要開關5000次excel,需要幾個小時。。。就算你最後奇蹟般的真的用5000個表格存下來了,你會發現消耗空間在10G以上。 。。。你自己還要發明命名格式,以方便你的VBA代碼讀取數據。此時任務稍微發生了變化,讓你再把50個個股期權也分析一遍,你是不是有點想殺人的衝動了。。。

而上述問題用SQL不超過10行代碼可以解決,最後的數據查詢時間應該比excel快10^4倍左右,消耗的空間應該是excel的1/100.


看到問題分類有金融

那請題主試試用Excel +VBA實現一下最簡單的銀行業務功能:

1. 存儲、讀取、查詢一千萬儲蓄客戶10年的存款數據

2. 允許全省50個儲蓄所100個櫃員同時登錄進行上述操作

3. 上述操作只能由授權用戶執行

4. 每天按市、儲蓄所、櫃員生成儲蓄匯總報告

5. 自動記錄櫃員的每次操作以備審核

6. 如果系統發生意外如伺服器死機、網路中斷、硬碟故障等仍然保證數據完整性、一致性

————————————我是理論的分割符——————————

Excel+VBA對於少量的數據和簡單的需求來說的確已經夠了

比如DIY一個自家收支帳本就沒必要動用資料庫和SQL

但當數據量增大、需求變得複雜、運行環境多樣時

比如你向全世界人民提供一個網路在線帳本

就只能啟用資料庫了

資料庫不是簡單的把數據存放起來能增刪改查就行了

資料庫更要解決

1)數據完整性、一致性

2)並發操作

3)數據訪問安全

4)海量數據讀取性能

5)分散式數據

6)數據備份、恢復、容災

7)數據分析

8)跨平台兼容及硬體、操作系統升級兼容

等方面的問題

這些才是資料庫的核心功能

SQL是一種關係型資料庫語言

語法非常簡單

學起來比VBA容易多了

使用起來也比VBA簡單

另外標準SQL是行業標準

所有的資料庫廠家都要遵守

資料庫廠家只能在此標準上提供擴展功能

也就是說不管你用的是誰家的資料庫

也不管你的資料庫是裝在誰家的操作系統上

標準的SQL是通用的

而VBA是基本上只能在微軟的office上用


這個疑問當初學習資料庫這門課程的時候我也有過。課程中我們是用微軟access來練習SQL語句。當時感覺access跟excel相比,簡直土的掉渣!界面難看、功能少,微軟作為一家全球化的巨頭公司怎麼還會出這麼一款產品?

後來跟著老師做給一家國企做項目,需要每個月出一份當月的統計報表。

他們有一個不知道哪個大牛寫的專門用來生成統計表的VBA腳本。

出報表的小姑娘每次都把從系統導出的當月所有數據複製到包含這個腳本的excel中,然後就忽閃著水靈靈的大眼睛滿懷期待地等待報表的生成。

後來有一次,領導要統計全年的數據,她依舊用這個腳本來統計,結果連續幾次電腦直接卡死。看到她焦急無助的神情,我不禁心生憐惜之情。寫了一條SQL語句,兩秒鐘執行出結果。從此,她那水汪汪的大眼睛就常常對我眨巴眨巴。

------------------------------------------------

乃們不要鬧了,我要來認真答題了,作為一個程序猿,可不能跟抖機靈騙贊的同流合污不是

畫風轉變的分割線

------------------------------------------------

糾正這個問題題干中的不嚴謹的地方。

拿SQL與Excel+VBA相比,是不準確的。

SQL是什麼?是一種對於關係型資料庫的查詢語言。其操作對象是Relational Database,即關係型資料庫。而關係型資料庫才是存儲數據的地方。

所以,SQL與VBA基本上可以認為屬於同一層:都是對特定對象進行操作的一種語言。而SQL作為統一標準,適用範圍更廣,MySQL/Oracle/MSSQL/DB2都可以作為其操作對象;VBA與SQL相比,適用範圍窄,僅限於Excel等微軟系的產品,但是功能相對SQL語言會強大一些,可以進行改變Excel頁面樣式等操作。

再來看excel。我理解的excel分為兩部分:

底層是數據的存儲系統,上層是數據的展示系統。

數據的存儲系統大致可以跟資料庫(database)屬於同一層:都是將數據按照一定規則存儲在物理機器上。在底層的性能上,一般的資料庫系統相對於excel的存儲系統具有碾壓性優勢。這也是我讓那個無助的小姑娘對我眨巴眨巴眼睛的原因。

而對於excel的上層展示系統,一般的純資料庫是不存在的。這時你可以引入第三方或者自帶的可視化工具,例如navicat/phpMyAdmin。但是這種可視化工具的展示效果相對於excel強大的功能來說,簡直弱爆了。這也是那個小姑娘為什麼用excel上報統計的原因:可以將excel的統計表美化一下呈現給領導獲得表揚嘛~

總結一下:同樣都可以存儲數據,database+SQL的組合與excel+VBA的組合具有不同的應用場景。高性能、高安全性、大數據量的情況下,選擇database+SQL確定無疑。具有易編輯、裝飾表格、合併單元格等靈活操作需求的情況下,excel的應用也非常廣泛。

當然,能結合兩者的優點是最好不過了。每次我過去,那個小姑娘總要粘著我對我眨巴眼睛求我幫她導數據。於是,我最後給她做了一個功能:選擇時間段查詢一鍵導出到excel,於是她可以把excel裝飾得漂漂亮亮愉快地上交給領導了。

可是,從此以後,她的眼睛又只對著電腦眨巴,不再對著我眨巴了。這是一個悲傷的故事


sql是火車,excel是卡車。卡車靈活,貨不多時想去哪去哪,方便,貨太多時卡車就拉不動了,而且容易出交通事故。而sql運載量大,也規範,大宗貨物的首選,但是鋪鐵軌比較費時間,鋪好了,天天跑就快了。


提問前應該先搜索。知乎上已有問題

資料庫是什麼?它與 Microsoft Excel 有什麼區別? - MySQL

有excel了要資料庫幹啥? - MySQL

存儲個人信息用Excel還是MySQL? - 資料庫

其他網站上的資料更多。


作過資料庫管理(DBA),資料庫開發人員,數據分析員. 所以從我的角度簡單回答這個問題;因為這個問題要是一點點詳細回答那得更新幾天幾夜;

更新一下更形象的比喻,如果excel是超市的店面,而SQL Server就是超市的倉庫!!

1. Excel處理的數據量有限,直觀說當你的數據超過10萬行的時候,或者說大小開始超過100MB的時候處理速度就會下降,而當數據再大的時候直接就會提醒你 內存不夠!!!!或者讓你升級到64位版本!!

而SQL sever 那就是個資料庫!數據量依據公司購買sever版本數量和大小不同,但是放個幾百G數據,建立上千個關聯表那都是輕鬆的事情;

2. 數據安全與維護!

任何重要資料庫都需要自動備份!SQL 資料庫可以設置自動備份;每天什麼時候備份,備份模式是什麼,存在哪裡;

可以設置誰有權利進入資料庫,有什麼級別的許可權,是否可以修改數據;是否需要壓縮,清理;

3 數據更新

excel雖然也可以和BI data tools中的SSIS(一種數據導入工具)設置導入數據,但是只有sql 資料庫才可以設置每天定時定點的更新倒入數據;

例子:你每天收集的大量數據,不論存放在任何地方,任何格式,excel,xml,txt,資料庫都可以和BI data tools鏈接,在你設定的時間點每天自動把那些數據導入到對應的表裡;而你就是等著第二天睡起來查看新數據就好了;

4 特定數據分析

這裡可能大家覺得這不就是excel 比資料庫強的地方嗎?

事實有時候不是這樣的!!!

我們展示分析數據當然可以依賴於excel了,但是當你要選取特定數據的時候,excel就顯得棘手了;

例子:假如是汽車行業;我想知道2015年9下午3點到2016年1月上午10點,某一型號的紅顏色的自動擋汽車在北京地區被20-30歲女性買走並且在這幾個月內都沒有到4s店進行過維修的,並且賣出的店面在朝陽區的車子的數量;

雖然這個問題看著很怪;好了,如果你要用excel去找這些數據,那估計要花很久很久了,就算我們利用excel建立了表的關係,仍然需要幾個小時來找數據;但如果是用SQL 資料庫那可能只需要1分鐘!!!最多就兩分鐘!!!

我回答的這些僅僅是其區別的冰山一角;


Excel的內置函數連使用界面語言更換都會變,對於ASCII之外的字元支持也有問題,更何況有些代碼在32/64系統,不同版本的Excel之間都需要修改。


當數據量大到一定程度的時候你就知道SQL好在哪了


理論上,excel提供足夠多的介面,也是可以當資料庫用的,雖然性能,穩定性,可靠性,可維護性,未必比得上資料庫,但這個理論應該是可行的。

然而一個現實是:絕大多數伺服器不是Windows系統。

另外一個現實是:excel只能在Windows系統裡面用。

所以當你明白Windows除了在個人電腦領域很流行,在其它領域都並不是最流行的操作系統之後,就可以很容易的明白為什麼沒有哪個伺服器用excel做資料庫了。


Excel和VBA的設計理念完全不同,沒有可比性。一個是專門用於數據管理的 結構化英語查詢語言(Structured English Query Language,SEQUEL)。一個是嵌入式的腳本語言,用於擴展應用程序的功能。

SQL是為關係型資料庫而生,VBA 是為 擴展應用程序功能而生。

VBA 可以直接對Excel進行操作,SQL可不行。Excel VBA開發,可不完全只有數據分析,還有Excel 自動列印,自動格式設置等等。

SQL 在處理數據方面,語法結構更為友好和易於使用,這一點是 VBA 比不了的,但使用SQL需要 資料庫系統的支持,這對很多 Excel 用戶來說,處理一點點東西,還要重新學習一套系統,學習成本太高了,完全沒有必要。這就好比,求幾個單元格的和使用簡單的 sum 公式就可以實現,你還要用VBA,這就真沒必要了。


想像一下,我們用的知乎,現在的這個問題,這些答案,這些評論,全部存在一個Excel文件里。每次訪問知乎,伺服器都哼哧哼哧地執行VBA讀取數據,把現在的這個頁面顯示出來。簡直不可想像。


1,看應用場景吧,如果你有一個10GB的數據文件要處理。Excel打開一次的時間,也許夠SQL遍歷一次然後提取數據完成計算了。SQL檢索速度是excel不能比擬的。

2,另外,SQL一般都有一個伺服器,可以接受多用戶的訪問,在網路應用中十分重要,這一點也是excel不能替代的。

3,最後就是介面問題,Vba不能算一個很大眾的語言。一般的SQL應用,比如mysql等等都有很好的編程介面,如java或者Python都對sql有非常好的支持。


1、VBA和SQL是兩種不同的東西,就好比拿C或者是C#、JAVA和SQL比,你們能比出什麼結果來?SQL和VBA並不衝突,VBA用ADO連接資料庫或是EXCEL表時,都是可以用SQL進行查詢的,並且查到的數據可以用EXCEL表或圖展示出來,並且展示的表再用EXCEL函數或VBA進行再次統計計算,這個時候,你覺得光用資料庫還會方便嗎?

2、EXCEL的強大之處在於數據的靈活展示,就好像一個C/S系統的前台,但相較於C/S的軟體來說,EXCEL的優點在於靈活性,C/S系統在於業務一成不變的情況是好的,但如何業務情況一直在變化,C/S是跟不上節奏的,不可以開發人員跟著使用人員一直轉,一有業務變動,就讓開發人員重新設計前台界面!

3、強大的數據分析能力,這裡涉及統計學知識。如果資料庫能做數據分析,那要R、PYTHON、SRSS、SPS這些專業分析軟體幹什麼,當然EXCEL不是專業的數據分析軟體,但EXCEL做完成大部分這些軟體的功能,剩下的並不是不能做,而是需要你對EXCEL及統計知識的足夠精通。

4、EXCEL發展到今天的2016版,已經被微軟體發展成一個功能強到讓人感到發紫的軟體,如2010版本開始加入的power query(數據清洗),power pivot(數據建模,輕鬆管理億級數據),power view(圖表展示)。。。。插件的加入,進一步在加強EXCEL的功能,而ACCESS卻被微軟進一步步的邊緣化。我的看法是微軟打算將EXCEL發展成為一個集成現有EXCEL和ACCESS的軟體,好比是數據管理處理分析的一把瑞士軍刀,並最終代替ACCESS。

4、最後不要當拿資料庫軟體的強項和EXCEL存存儲弱點這一個單一方面去比較,這樣沒有可比性,也沒有什麼意義,如果一定要用EXCEL來存大數據,我可以用VBA將EXCEL自動分表來存儲,並用POWER QUERY連接各個分表,並把分把合併為一個表,並存power pivot這個數據建模插件中,當然幾億數據一個表,是沒有什麼問題的,以上全部用程序完成,這個時候,決定數據量的,不是EXCEL的能力,而是你的硬碟有多大???EXCEL能做的很多事,資料庫軟體卻做不了。


sql和excel vba並不衝突,也不存在互相代替,本來就是兩個不同方向的東西

sql資料庫是用來存放數據的,excel不適合存放大量數據

兩者可以整合的,

最好的方法是excel+vba+sql 組合出擊

例如我經常用vba連接mysql資料庫的數據 ,以excel作前端展示處理

看我在Excel 的 VBA 現在還算是辦公利器嗎?中的回答,裡面有大量應用例子(多圖)


我來嘗試答一下吧。

數據就像流水一樣,從源頭開始講吧。

首先你的數據從哪裡來?大部分數據都是採集來的,通過機器採集的數據一般量 比較大,excel自身限制,存不了太多數據的,並且資料庫可以實時存儲,一直在線,excel就很困難了,除非你的數據量不大,別人一個郵件就能發過來,也不用實時更新。

數據的更新:如果你用excel發給他人數據,一旦數據發生改變一次,那麼你就要重新發一次,而且更新很頻繁的話,說不定你都不知道哪個表裡才是最新的數據了...

而如果使用資料庫做數據源,只要修正資料庫的數據,保證後面的數據可以及時同步就可以解決數據的更新問題。

數據的質量:有些資料庫自帶etl工具,便於數據的清洗,甚至在數據採集來的時候就已經做了處理。而且較大的數據量時候vba的處理效率也遠不如etl工具和sql高。

數據量級的問題:不用說excel數據量稍微大一點就完蛋。

其他的許可權管理問題等等,excel+vba也不是解決不了,不過還是不如資料庫更方便。

總之就是資料庫能更有效的保證數據的完整性,一致性,準確性,這幾點對於excel都不好解決。

excel自身其實也有優勢的,操作方便,最早做數據分析的時候曾經用過sqlserver+excel的辦法,做分析做報表都很不錯,sqlserver解決數據管理的問題,excel用寫好的sql語句去sqlserver裡面拿處理好的數據,用vba+函數就能方便的搞出很好的報表,很方便,我曾經覺得這是成本最低的報表生成方式.....


比如說吧,某司做網站流量分析,一天的數據量壓縮之後大概100個G,excel的話就算你硬塞進去了,你也打不開…更別說處理了,效率什麼的連探討的基礎都不存在。


題主大概沒見過用Excel VBA做前端, 用ADO連SQL資料庫後台吧. 這兩者也不是對立的, 看使用場景了. 現在有了PowerPivot, 數據量不是問題


現在我就是寫sql的,SQL是一種標準化語言,在之上有很多種版本的,比如oracle,mysql,hive等等。

公司每天業務線都有幾千萬的數據量更新,某些表都是億級別的,然後我們這些搞分析的需要從這些表中取出自己需要的信息,這樣的數據量不是excel能處理的,學好excel也很重要,以後用sql用溜了,涉及到大量數據就很少用excel了……excel極限行是104萬行


用時一時爽,重構火葬場。


自從前上司用SQL select*然後保存到excel自己搭建粗製版資料庫開始 我就覺得我該辭職了。


推薦閱讀:

sql中為什麼select要放在from之前?
如何優雅地寫SQL?
為什麼公司不準使用SQL語句查詢的「*」?
sql語句面試問題?
如何自學SQL?

TAG:微軟Microsoft | 資料庫 | SQL | MicrosoftExcel | 金融 |