SQL数据分析应用示例
数据化分析 网络
 

SQL全名是结构化查询语言(Structured Query Language),主要用于查询、更新和管理关系数据库系统。作为数据分析人员,SQL应用最多的是其查询功能,即用SELECT语句来检索数据表中所需的数据。

在不同的数据库系统中,SQL语法有些差异,但基本思路应该一致。笔者在工作中常用的是甲骨文公司的Oracle数据库系统,因此本文将介绍一些基于Oracle数据库的SQL数据分析应用。

聚集函数可以将一列中所有的值聚集为单个值,常用聚集函数有:
1、记数:count
2、总和:sum
3、平均值:avg
4、最大值:max
5、最小值:min
6、方差:variance
7、标准差:stddev
8、排名:rank、dense_rank、row_number

聚集函数常与 group by 一起使用,示例(仅为了演示函数的应用):

在订单表(orders)中,假设订单号字段为orderid,订单总金额字段为totalprice,金额为空值代表为0,要求查询订购时间(crdt)在过去10个月中每个月每种订单类型的订单数、总金额、平均每单金额(最多保留两位小数)、最大订单金额、最小订单金额、方差、标准差、总金额月度排名,输出订单数大于1000个的订单类型,并按月份升序、总金额降序排列:


select to_char(a.crdt,'yyyy-mm') as 月份, a.ordertype as 订单类型, count(distinct a.orderid) as 订单数, sum(nvl(a.totalprice, 0)) as 总金额, round(avg(nvl(a.totalprice, 0)), 2) as 平均每单金额, max(nvl(a.totalprice, 0)) as 最大订单金额, min(nvl(a.totalprice, 0)) as 最小订单金额, variance(nvl(a.totalprice, 0)) as 方差, stddev(nvl(a.totalprice, 0)) as 标准差, rank() over (partition by to_char(a.crdt,'yyyy-mm') order by sum(nvl(a.totalprice, 0)) desc) as 排名
from orders a
where a.crdt >= add_months(trunc(sysdate,'mm'), -10)
and a.crdt < trunc(sysdate,'mm')
group by to_char(a.crdt,'yyyy-mm'), a.ordertype
having count(distinct a.orderid) > 1000
order by to_char(a.crdt,'yyyy-mm'), sum(nvl(a.totalprice, 0)) desc

根据业务需要,上面的rank函数可以换成dense_rank或row_number,它们之间的差别可以参考下图:

 

字符串函数在处理数据的过程中有时会一些特殊的作用,常用的有:
1、字符串截取:substr 示例:select substr('abcdef',1,3) from dual; 结果:abc
2、查找子串位置:instr 示例:select instr('abcfdgfdhd','fd') from dual; 结果:4
3、字符串连接:concat 示例:select concat('Hello',' world') from dual; 结果:Hello world
4、去掉字符串中的空格:ltrim、rtrim、trim 示例:select ltrim(' abc') s1, rtrim('def ') s2, trim(' ghi ') s3 from dual; 结果:abc,def,ghi
5、去掉前导和后缀:trim 示例:select trim(leading 9 from 998799) s1,trim(trailing 9 from 998799) s2,trim(9 from 998799) s3 from dual; 结果:8799,9987,87
6、返回字符串首字母的ascii值:ascii 示例:select ascii('A') from dual; 结果:65
7、返回ascii值对应的字母:chr 示例:select chr('65') from dual; 结果:A
8、计算字符串长度:length 示例:select length('abcdef') from dual; 结果:6
9、大小写转换:lower, upper, initcap 示例:select lower('AbC') s1, upper('dEf') s2, initcap('gHi') s3 from dual; 结果:abc,DEF,Ghi
10、匹配替换:replace 示例:select replace('abcd','bc','xyz') from dual; 结果:axyzd
11、绝对匹配替换:translate 示例:select translate('What','th','T-') from dual; 结果:W-aT
(注:replace是将字符串中指定的连续字符替换成其它字符,translate则是将各个字符替换成顺序与其相同的字符,像是过滤。)
12、用于控制输出格式的左右填充:lpad,rpad 示例:select lpad('ab',5,'=') s1, rpad('ab',6,'*') s2 from dual; 结果:===ab,ab****
13、实现if ..then逻辑的指令解码:decode 示例:select decode('a','b','1','c','2','3') from dual; 结果:3

运算符主要用于处理数据之间的运算、比较、筛选等,常见的运算符有:
1、算术运算符:+ - * / 示例:select 1+2-3*4/5 from dual; 结果:0.6
2、比较运算符:> >= = 【!=或<>】 < <= like between in 【is null】
3、逻辑运算符:not and or
4、集合运算符: intersect union 【union all】 minus
5、连接运算符:||

SQL还有很多比较高级的应用知识,例如:创建表、插入表、删除表、创建函数、存储过程、包、类型、定时任务、游标、触发、索引、约束、物化视图、DBLink……这些往往是DBA或开发人员所做的工作,但数据分析人员如果能适当地掌握一些SQL高级应用知识,有时能非常明显地提升工作效率,本文限于篇幅和时间,就不展开讨论了,以后再另写文章进行分享。

CIO之家 www.ciozj.com 公众号:imciow
关联的文档
也许您喜欢