统计学专业同学需要掌握的数据库基本用法

统计学专业同学需要掌握的数据库基本用法

摘要:大数据时代,数据库已经成了统计学专业学生不得不掌握的一项基本技术。不论是对于基础理论知识薄弱的本科学生,或者是有一定理论基础的硕士,都要对数据库有所了解。然而,我们没必要全面的掌握数据库的所有知识,即便是常说的增删改查也没必要全部掌握。原因在于,数据分析、数据挖掘、机器学习是我们最日常的工作,我们需要的,仅仅是有能力从数据库中拿出想要的数据,因此,对于数据库,需要深刻理解和掌握的,通常就是一个字。
本文,将围绕这一主题,结合大量的实际例子,相对深入浅出的讲述这些基本知识,希望能对需要的读者产生一些帮助。

1.SQL查询语句总结

1.01 查询所有行列

SELECT * FROM Table

1.02 查询特定的行和列

SELECT col1,col2,col3 FROM Table --查询指定的列

1.03 在查询中使用AS更改列名

SELECT Name AS 姓名 FROM Table

1.04 查询空行(关键字:is null, is not null)

SELECT Name FROM Table WHERE email is null
SELECT Name FROM Table WHERE email is not null

1.05 查询返回限制行数(关键字:top, percent)

select top 4 name from Table --返回name列的前4行
select top 60 percent subject from Table --返回subject列的前60%

–除此之外,可以结合where等条件语句,实现任意部分的数据提取 //当每一条数据都有一个特定的ID的时候,使用between and 是一种非常好的方法

1.06 查询排序(关键字:order by, asc[升序], desc[降序])

select * from Table order by grade1 desc

1.07 使用like(not like)进行模糊查询

注:like命令只作用于字符串

select * from Table_1 where name like ‘[张]%’

补充:一些常用的正则表达式:

‘[张]%’–表示筛选出第一个字是张的名字—>’[张李]%‘表示筛选出第一个字是张或者李的名字,以此类推
‘_[张]%’–表示筛选出第二个字是张的名字–>’__[张]%'表示筛选出第三个字是张的名字
‘[^张]%’–表示筛选出除了第一个字是张的名字,和上面规则结合使用

1.08 使用between and(not between and)在某个范围内进行查询 --当每一行均有属于自己特定的ID时,可以使用该命令选择出第m到n行的数据

select * from Table_1 where grade1 between 70 and 90

注:sql server中不能使用limit

1.09 使用in在列举值内进行查询

select * from Table_1 where teacher in (‘王华’,‘李明’)


1.10 使用group by进行分组查询

select teacher as 任课老师, AVG(grade3) as 平均分 from Table_1 group by teacher

补充:group by和order by搭配使用

select teacher as 任课老师, AVG(grade3) as 平均分 from Table_1 group by teacher order by AVG(grade3) desc

1.11 使用having进行分组筛选

select teacher as 任课老师, AVG(grade3) as 平均分 from Table_1 group by teacher having AVG(grade3) >= 70

【一个小说明】
关于top, limit, rownum,在sql server 中使用top;在mysql中使用limit;在oracle中使用rownum。

2.处理日期的语句大全

2.1-- playing interval
select sysdate + interval ‘3’ day as “3天后”
from dual
SELECT SUBSTR(to_char(sysdate - interval ‘3’ year ,‘yyyyMMdd’),1,6) FROM dual
2.2–加法
SELECT SYSDATE,ADD_MONTHS(SYSDATE,12) FROM DUAL; --加1年
SELECT SYSDATE,ADD_MONTHS(SYSDATE,1) FROM DUAL; --加1月
SELECT SYSDATE,TO_CHAR(SYSDATE+7,‘yyyy-mm-dd HH24:MI:SS’) FROM DUAL; --加1星期
SELECT SYSDATE,TO_CHAR(SYSDATE+1,‘yyyy-mm-dd HH24:MI:SS’) FROM DUAL; --加1天
SELECT SYSDATE,TO_CHAR(SYSDATE+1/24,‘yyyy-mm-dd HH24:MI:SS’) FROM DUAL; --加1小时
SELECT SYSDATE,TO_CHAR(SYSDATE+1/24/60,‘yyyy-mm-dd HH24:MI:SS’) FROM DUAL; --加1分钟
SELECT SYSDATE,TO_CHAR(SYSDATE+1/24/60/60,‘yyyy-mm-dd HH24:MI:SS’) FROM DUAL; --加1秒
2.3–减法
SELECT SYSDATE,ADD_MONTHS(SYSDATE,-12) FROM DUAL; --减1年
SELECT SYSDATE,ADD_MONTHS(SYSDATE,-1) FROM DUAL; --减1月
SELECT SYSDATE,TO_CHAR(SYSDATE-7,‘yyyy-mm-dd HH24:MI:SS’) FROM DUAL; --减1星期
SELECT SYSDATE,TO_CHAR(SYSDATE-1,‘yyyy-mm-dd HH24:MI:SS’) FROM DUAL; --减1天
SELECT SYSDATE,TO_CHAR(SYSDATE-1/24,‘yyyy-mm-dd HH24:MI:SS’) FROM DUAL; --减1小时
SELECT SYSDATE,TO_CHAR(SYSDATE-1/24/60,‘yyyy-mm-dd HH24:MI:SS’) FROM DUAL; --减1分钟
SELECT SYSDATE,TO_CHAR(SYSDATE-1/24/60/60,‘yyyy-mm-dd HH24:MI:SS’) FROM DUAL; --减1秒

SELECT TO_CHAR(SYSDATE,‘YYYYMMDD W HH24:MI:SS’) FROM DUAL --获得当前日期是本月第几周
SELECT TO_CHAR(SYSDATE,‘W’) FROM DUAL --获得当前日期是本月第几周

SELECT SYSDATE,TO_CHAR(SYSDATE,‘D’) FROM DUAL --取得当前日期是一个星期中的第几天,【注意星期日是第一天】

SELECT TO_CHAR(SYSDATE,‘yyyy’) FROM DUAL; --年
SELECT TO_CHAR(SYSDATE,‘Q’ )FROM DUAL; --季
SELECT TO_CHAR(SYSDATE,‘mm’) FROM DUAL; --月
SELECT TO_CHAR(SYSDATE,‘dd’) FROM DUAL; --日
SELECT TO_CHAR(SYSDATE,‘day’) FROM DUAL --取当前日期是星期几

2.4–得到当前日期
SELECT TO_CHAR(SYSDATE,‘DDD’) FROM DUAL --今天是今年的第N天
SELECT ADD_MONTHS(SYSDATE,24) FROM DUAL --给现在的日期加上2年
SELECT DECODE(TO_CHAR(LAST_DAY(TRUNC(SYSDATE,‘y’)+31),‘dd’),‘29’,‘闰年’,‘平年’) FROM DUAL --判断某一日子所在年分是否为润年
SELECT DECODE(TO_CHAR(LAST_DAY(TRUNC(ADD_MONTHS(SYSDATE,48),‘y’)+31),‘dd’),‘29’,‘闰年’,‘平年’) FROM DUAL --判断4年后是否是闰年

SELECT CEIL(TO_NUMBER(TO_CHAR(SYSDATE,‘mm’))/3) FROM DUAL; --得到日期的季度
SELECT TO_CHAR(SYSDATE, ‘Q’) FROM DUAL; --得到日期的季度

(参考链接:https://www.cnblogs.com/forever-love-zjl/p/9717413.html)

3.一些经常用到的函数

3.1. coalesce()函数

语法: coalesce(exp1,exp2) 如果exp1是NULL,则coalesce(exp1,exp2) = exp2 ,否则,coalesce(exp1,exp2) = exp1

3.2. over()函数

 题记:over, over, over ... ...

语法: over(partition by exp2, order by exp3) 根据exp2对结果进行分区,在各分区内对exp3进行排序

over()函数不能单独使用,需要与row_number, rank(), dense_rank(), lag(), 和 lead(), sum()等配合使用

举一反三的小插曲: group by 和 partition by 的区别

group by 是聚合函数,group by会将数据进行压缩,在计算一些数字特征,如:sigma, mu 等特征值的时候回非常有用
partition by 是分区函数,ta会对结果集按照指定字段分层排列,不会对结果集产生压缩效果
eg:将公司所有人按照部门进行分区,会发现结果集中同一部门的人会连续排列

根据配合使用的函数不同,分层次介绍:

  • row_number(),rank(),dense_rank()
  • lag()与lead()
  • sum()

1、与row_number(),rank(),dense_rank()的使用

这三个函数与over连用时,order by不能丢失,不写partition by时,默认结果集为一整个分区。

–具体看参考链接

(参考链接:https://blog.csdn.net/a1065423444/article/details/75635611)


– row_number()与over()搭配使用

– 先按照部门进行分区,再对金额进行排序 – rn不允许并列!!!

select xmda002 as 业务员id, xmda003 as 部门id,
row_number() over(partition by xmda003 order by xmda016xmda041) as rn,xmda016xmda041 as 金额
from xmda_t where xmda002 is not null and rownum <= 20


–rank()与over()搭配使用

–先按部门进行分区,再对金额进行排序 – rk允许并列,但是…唉,描述不来,懒得描述!!!

select xmda002 as 业务员id, xmda003 as 部门id,
rank() over(partition by xmda003 order by xmda016xmda041) as rk, xmda016xmda041 as 金额
from xmda_t where xmda002 is not null and rownum <= 20


–dense_rank()与over()搭配使用

–先按部门进行分区,再对金额进行排序 – drk允许并列,而且…唉,描述不来,懒得描述!!!

select xmda002 as 业务员id, xmda003 as 部门id,
dense_rank() over(partition by xmda003 order by xmda016xmda041) as drk, xmda016xmda041 as 金额
from xmda_t where xmda002 is not null and rownum <= 20

–以上三个搭配,各有各的应用场景,因地制宜即可!


– lag()与over()的搭配使用
– lag字段第一个值为空

select xmda002 as 业务员id, xmda003 as 部门id,
lag(xmda003) over(partition by xmda003 order by xmda016xmda041) as lag, xmda016xmda041 as 金额
from xmda_t where xmda002 is not null and rownum <= 20

– lead()与over()搭配使用
– lead字段最后一个值为空

select xmda002 as 业务员id, xmda003 as 部门id,
lead(xmda003) over(partition by xmda003 order by xmda016xmda041) as lead, xmda016xmda041 as 金额
from xmda_t where xmda002 is not null and rownum <= 20

– sum()与over() 搭配使用
– 啥玩意儿?跑一下就知道了!!!

select xmda002, xmda003, xmda016xmda041 as je,
sum(xmda016
xmda041) over(partition by xmda003) as yyqkn,
sum(xmda016xmda041) over(partition by xmda003 order by xmda016xmda041) as zn
from xmda_t
where xmda002 is not null and rownum <= 20

【一个小说明】
nvl()和coalesce()的区别:nvl()函数只适用用有限各参数,即nvl(a,b)
coalesce()函数可以适用于无限各参数,coalesce(a,b,c,d,e,f)
二者功能相同

结束语
熟练掌握了上述内容,再众里寻他千百度,应该可以满足统计学专业同学们的基本需求啦。希望对大家有所帮助。整理总结不容易,看完请给个赞,谢谢侬。
兴趣小贴士,关于PLS方法很不错的一篇文章:https://wenku.baidu.com/view/54fc75543b3567ec102d8aba.html

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值