MySQL這隻小海豚終於長大到了8.0 !

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 的一些小技巧

TAG:MySQL | 科技 | 大數據 |