摘要:大数据时代,数据库已经成了统计学专业学生不得不掌握的一项基本技术。不论是对于基础理论知识薄弱的本科学生,或者是有一定理论基础的硕士,都要对数据库有所了解。然而,我们没必要全面的掌握数据库的所有知识,即便是常说的增删改查也没必要全部掌握。原因在于,数据分析、数据挖掘、机器学习是我们最日常的工作,我们需要的,仅仅是有能力从数据库中拿出想要的数据,因此,对于数据库,需要深刻理解和掌握的,通常就是一个查字。
本文,将围绕查这一主题,结合大量的实际例子,相对深入浅出的讲述这些基本知识,希望能对需要的读者产生一些帮助。
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:将公司所有人按照部门进行分区,会发现结果集中同一部门的人会连续排列
根据配合使用的函数不同,分层次介绍:
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(xmda016xmda041) 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