写这个系列的初衷非常简单——写一个通俗、易懂、易上手的,如何使用SQL进行商业分析(business analytics)的教程。
我学习SQL的过程中,找遍了google,baidu,coursera,都没找到特别合适的教程。通常情况是,(1)这些教程没有实际例子做支撑,学习过程非常单薄;(2)例子太简单,不具备学以致用的功能。Stanford有一个SQL的免费课程,https://lagunita.stanford.edu/courses/DB/SQL/SelfPaced/courseware/ch-sql/, 是我目前见到的最好的教程。
所以,我决定写一个比他们更好的SQL教程,把重点放在“用实际例子来学习SQL和商业分析”。
Tool:我采用的是Sqlite 和 Sqlite Manager Add on(Firefox)。
Dataset: 美国男子篮球数据库。 (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包含一下这些数据文件。
现在开始。
Day 1 :选择并输出你想要的数据
商业分析当中常见的问题就是找出你想要的数据,比如,苹果公司可能会问这样的问题,过去4年,在北京地区的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的时候也可应该按照这样的逻辑思路来考虑问题——从哪些数据表中,按照什么样的条件,输出我想要的结果。
例子1:截止2012年,那个教练赢得了最多的奖项?
select coachID, count(coachID)
from basketball_awards_coaches
group by coachID
order by count(coachID) DESC
得到的结果是这样的。
coachID并没有告诉我们这些人具体是谁,,在什么联盟赢得的,哪一年。很自然,我们想问
例子2:截止2012年,得奖的教练都是谁,在哪个联盟执教,是哪年得奖的?
select lastName, firstName, lgID, year
from basketball_awards_coaches, basketball_master
where coachID = bioID
order by lastName, year;
我们看到,波波维奇分别在2002,和2011在NBA联盟获得了最佳教练。
类似的,我们想问,
例子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会让输出的结果以浮点形式显示,否则,系统会以integal的形式输出。
我们还想知道,
例子5:乔丹职业生涯的得分效率是什么样子的(按照时间序列输出)
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的用法