MySQL這隻小海豚終於長大到了8.0 !
來自專欄 數據應用學院
如果你了解大數據,你一定多多少少知道SQL。
不知道也沒關係,如果你終有一日掉進數據的大坑,你會認識這隻可愛的小海豚。
By the way, 這隻小海豚叫Sakila,不叫SQL。
#All about SQL#
SQL 是 Structured Query Language 的簡稱,它是一種用於訪問和處理資料庫的標準計算機語言。這時候你肯定疑惑你曾經聽說過的MySQL, PostgreSQL, NoSQL都是啥?
MySQL 和 PostgreSQL 是兩種最為出名的關係型資料庫 (relational database)管理系統。這兩個系統都是開源的,免費向公眾開放。
NoSQL呢,其實是很廣的定義,它主要是指 無關係型資料庫 (Non-relational database) 管理系統。這些系統通常有他們自己的查詢語句,但同時也支持SQL本身的查詢語句。比較有名的NoSQL資料庫就是MongoDB。你肯定要問我:好用么?怎麼說呢?有好有壞吧,依據情況而定了。
了解MySQL發展史:
把時間軸拉回1996年的1月,
第一代內測版本的MySQL
在天才程序員Monty的努力下誕生了。
同一年的10月,
MySQL 3.11.1發布了,
這個版本的發布其實是MySQL第一次大規模面世。
到2000年,MySQL3.23發布了,
這個版本由於被廣泛的使用,
所以被稱為MySQL真正誕生的時刻。
在這個版本下InnoDB儲存引擎被MySQL使用。
之後就是2003年4.0版本的出現,
開始有了新的語法比如UNION和DELETE。
兩年後進階的4.1版本發布了,
除了進一步更新了的語法,
MySQL開始支持UTF-8字符集。
很快的,在一年後的2006年,
5.0的版本發出了,
一些企業級別的特性被加進了MySQL。
5字開頭的版本在接下來的
2008年,2010年,2012年,2015年里
分別發布了5.1,5.5,5.6和5.7。
其中比較大事件的是在2008年被SUN公司收購,
又在兩年後被Oracle收購了。
到5.7這個版本為止,
MySQL已經發展到了一個很良好的狀態了。
從下面的這張時間線
我們也可以看出來一個簡要的發展史
從2015年到現在,
甲骨文公司決定直接跳過6、7開頭的兩個分支,
直接帶領MySQL進入8.0時代。
很多強大的功能性提升和美化
很直接地影響了SQL語言用戶。
之所以要寫一篇關於MySQL 8.0的文章,
是因為實在受不了辦公司里
某古怪技術男的叨逼叨了。
他幾乎給辦公室的每個人
講了200多遍MySQL 8.0
有多麼的讓人激動使人喜悅。
而我,一個好學的豬豬女孩,
實在是受不了知識的誘惑,
很認真地諮詢了他,
這個8.0到底有什麼特別的呢?
令人喜悅的是
我得到了滿意的答案
Q / A
Q: 卡里: 好學的豬豬女孩
A: Junduo :古怪的技術男孩
卡里: 所以這個SQL8.0到底有什麼特別的呢?
Junduo: 啊,這就不得了了!我給你說啊,*¥@#%#¥%¥@@*&#
卡里: 哦。
Junduo: 你懂了吧!你知道我為啥覺得它厲害了吧!這個*&@¥#@#¥%@#¥%#太牛逼了!
卡里: 嗯。(點了點頭)
Junduo: 哎!你可以寫個文章給我們讀者也說說這事兒,多開心啊,喜大普奔!主要咱們就介紹一下這個CTE和這個Windows Function。哎,不過我們不能光介紹啊,得有點栗子,不然他們不好理解,你說是吧卡里。
於是,我們就有了如下的精彩講解
Aggregates window functions
我們先來創建一個table,
內容包括日期與對應的amount,如下圖:
讓我們現在來算一個sum,
sum的定義是按照table里每一條日期的record
之前一周的所有amount相加,
這在商業分析中其實很實用,
就是來算某一天之前整周總量的一個range。
Code如下圖所示,這裡的over也就是我們所謂的window function的代表
結果如下圖:
我們來拿第 2017-01-10來說,
700得出的結果是
從2017-01-03到2017-01-10(剛好一周)的
200 + 200+200+100得出的結果。
這裡注意!
我們不是按照第一個record
來定義的前一周和後一周,
而是把每一條record的date當成一周的第一天,
去加後面再一周也就是7天以內的amount!
Ranking Window Functions
MySQL 里一直沒有一個合適的ranking的function!是不是很煩!神煩!
在之前的5.7版本里大家如果要寫rank,
只能通過設定『@』也就是independent variable
來給不同的數據進行排名,就像這樣:
但是現在!我們有了新的ranking的function
好比rank, dense_rank, percent_rank, cume_dist, row_number 等等,我們接下來就來看一個例子:
輸出結果:
我們給予每一位員工一個排名,
排名來自於每位員工在各自部門裡的工資
Analytical Window Functions
在最後一種window functions中
我們給我大家推薦的是 first_calue(), last_value(), nth_value() 一類的分析窗口函數
這裡我們將每個員工
用他們所在的department進行分類。
下圖為輸出表格:
如圖所示,
前6個rows的record所返回的』first』是指在』dept_no』是』d001』的條件下,
』max_salary』只返回第一個salary的值。
注意!
這裡你可以去定義整張表格
按照哪一個variable進行排列,
重點是看你最後想要查詢什麼樣的數據。
』last』返回的是對於每個department底下的每一個』emp_no』的最終值進行選取
(因為這裡已經對原始表格進行過一次篩選,篩選出每個employee的最高工資取名為max_salary)。
』second』 和 』fourth』分別返回一個部門底下第2和第4的工資,null的出現是因為原本數據里的salary小於返回值。
推薦閱讀:
※有哪些冷門但好用的Word技巧?
※2017 年,我買的 XX 件科技產品。
※空客轉型中的那些人和事-----佩蘭計劃
※中國科技實力正以多快的加速度逼近美國 | 袁嵐峰
※Golang 中使用 JSON 的一些小技巧