寫這個系列的初衷非常簡單——寫一個通俗、易懂、易上手的,如何使用SQL進行商業(yè)分析(business analytics)的教程。
我學習SQL的過程中,找遍了google,baidu,coursera,都沒找到特別合適的教程。通常情況是,(1)這些教程沒有實際例子做支撐,學習過程非常單薄;(2)例子太簡單,不具備學以致用的功能。Stanford有一個SQL的免費課程,https://lagunita.stanford.edu/courses/DB/SQL/SelfPaced/courseware/ch-sql/, 是我目前見到的最好的教程。
所以,我決定寫一個比他們更好的SQL教程,把重點放在“用實際例子來學習SQL和商業(yè)分析”。
Tool:我采用的是Sqlite 和 Sqlite Manager Add on(Firefox)。
Dataset: 美國男子籃球數(shù)據(jù)庫。 (The Men’s Basketball Database contains individual and team statistics from professional basketball leagues including the National? Basketball Association through the 2011-12 NBA season.)
Download from:?http://opensourcesports.com/files/basketball/BasketballDB-20130121.zip
dataset包含一下這些數(shù)據(jù)文件。
現(xiàn)在開始。
Day 1 :選擇并輸出你想要的數(shù)據(jù)
商業(yè)分析當中常見的問題就是找出你想要的數(shù)據(jù),比如,蘋果公司可能會問這樣的問題,過去4年,在北京地區(qū)的iPhone 5s的銷售量是多少?
常見的SQL語句是這樣的:
select expression 1, expression 2, etc.
select a,b,c
from table_1
(where
a =
b =
c =
)
對SQL語句比較合理的看法是: 從 table_1 里面按照 where 制定的條件,輸出select expression 1, expression 2, etc.?
既然如此,寫SQL的時候也可應該按照這樣的邏輯思路來考慮問題——從哪些數(shù)據(jù)表中,按照什么樣的條件,輸出我想要的結果。
例子1:截止2012年,那個教練贏得了最多的獎項?
select coachID, count(coachID)
from basketball_awards_coaches
group by coachID
order by count(coachID) DESC
得到的結果是這樣的。
coachID并沒有告訴我們這些人具體是誰,,在什么聯(lián)盟贏得的,哪一年。很自然,我們想問
例子2:截止2012年,得獎的教練都是誰,在哪個聯(lián)盟執(zhí)教,是哪年得獎的?
select lastName, firstName, lgID, year
from basketball_awards_coaches, basketball_master
where coachID = bioID
order by lastName, year;
我們看到,波波維奇分別在2002,和2011在NBA聯(lián)盟獲得了最佳教練。
類似的,我們想問,
例子3:獲獎的球員都獲得過什么獎項,在哪一年?
select lastName, firstName, award, year, lgID
from basketball_awards_players, basketball_master
where playerID = bioID
order by lastName, year, award
可以看到,邁克爾喬丹在1987年分別入選了第一防守陣容,當年第一陣容,年度最佳防守球員和最有價值球員。
那么,
例子4:喬丹在1987年一共上場多長時間,得了多少分,平均每分鐘得多少分?
select? minutes,points,? points* 1.0 /minutes as Efficiency, firstName, lastName
from basketball_players, basketball_master
where? playerID = "jordami01" and year = "1987"
and playerID= bioID
其中 points*1.0會讓輸出的結果以浮點形式顯示,否則,系統(tǒng)會以integal的形式輸出。
我們還想知道,
例子5:喬丹職業(yè)生涯的得分效率是什么樣子的(按照時間序列輸出)
select? year,? round (points* 1.0 /minutes, 3)? as Efficiency, firstName, lastName
from basketball_players, basketball_master
where? playerID = "jordami01"
and playerID= bioID
那么,歷史上,誰的平均得分效率最高呢?
例子6:歷史上誰的得分效率最高?
select? firstName, lastName, Avg ( round (points* 1.0 /minutes, 3) ) as Efficiency
from basketball_players, basketball_master
where? playerID= bioID
group by firstName, lastName
order by Efficiency DESC
下一次,我們講一下SQL里面operator的用法