1. sql语言基础(2)
通过as给字段起一个别名
select card as 身份证,name as 姓名,sex as 性别;
别名的as可以进行省略
select card 身份证,name 姓名,sex 性别;
通过表名as 别名 给表起一个别名 as也可以省略
student表别名为s
select * from student as s;
student表别名为s (省略as)
student * from student s;
通过select distinct 字段名,字段名 from 表名 来过滤select查询结果中的重复记录
查询学生表性别并进行去重
select distinct sex from student;
where后面跟一个条件,实现有选择的查询
select * from 表名 where 条件
查询students表中学号stundentNo 等于001的记录
select * from studnets where studnetNo = '001';
查询students表中年龄age等于30的姓名和班级
select name,class from student where age = 30;
█ select 后面的*或者是字段名,控制了控制了返回什么样的字段(列);
█ select 中 where子句,控制l了返回什么样的记录(行)
█ where后面职称多种运算符,进行条件的处理
比较运算
逻辑运算
模糊查询
范围查询
空判断
等于 =
大于 >
大于等于 >=
小于 <
小于等于 <=
不等于 !=或<>
查询student表中30岁及30岁以下的学生记录
select * form students age > 30;
查询hometown不在北京的学生记录
select * from students where hometown != '北京';
select * from students where hometown <> '北京';
查询class班级为1班以外的学生记录
select * from students where class != '1班';
查询age年龄大于25的学生姓名和性别
select name,sex from studnets where age >25 and;
and(与)
and有两个条件
格式:条件1 and 条件2
两个条件必须同时满足
查询年龄小于30,并且性别为女的记录
select * from students where age > 30 and sex = '女';
or(或)
or有两个条件
格式:条件1 and 条件2
两个条件满足一个即可
查询性别为女或者班级为1班的学生记录
select * from studnets where sex='女' or class = '1班';
not(非)
not只有一个条件
not 条件
如果条件为满足,not后变为不满足。如果条件满足,not后变为满足
查询hometown老家非'天津'的学生记录
select * from studnet where not hometown = ‘天津’;
select * from students where hometown != '天津';
查询hometown老家是河南或河北的学生记录
select * from studnets hometown = '河南' or '河北';
查询班级为1班,并且家是北京的学生记录
select * from students class = '1班' and hometown = '北京'
查询年龄非30的岁的学生记录
select * from students not age = 30;
select *from students age ! = 30;
like实现模拟查询,%代表任意多个字符,_代表任意一个字符
字段名like'字符%'
指定字符开始,后面任意多个字符
字段名_'字符_'
指定字符开始,后面任意一个字符
查询姓名中已孙开头的学生记录
select * from students where name like '孙%';
查询姓名以孙开头,且名字只有一个字的学生记录
select * from students where name like '孙_';
查询姓白且年龄大于30的学生记录
select * from studnets where name lile '白%' and age > 30;
in(值,值,值)
非连续范围查找
between 值 and 值
连续范围查找
查询假象是北京或上海或广东的学生记录
select * from students where hometown = '北京' or hometown = '上海' or hometown = '广东'
select * from students where hometown in ('北京','上海','广东');
查询年龄为25至30的学生记录
select * from student where age >=25 and age <= 30;
select * from students where age between 25 and 30;
select * from students age in (20,25,30) and sex ='女';
select * from students not age between 25 and 30;
空判断
null 与' '是不同的
null 代表什么都没有,是不占用存储空间的 null不能用比较运算符去判断
is null 判断是否为null
is not null 判断是否不为null
' ' 代表长度为0的字符串,是占用存储空间的
判断空值 is null
查询身份证为null的学生记录
select * from students where card is null;
判断非空值 is not null
查询身份证非null的学生记录
select * from students where card is not null;
查询身份证为空的学生记录
select * from students where card is null or card ='';
查询身份证不为空的学生记录
select * from students where card is not null and card != '';
把年龄为25,并且姓名为孙尚香的学生,修改班级为2班
update students class = '2班' where age = 25 and name = '孙尚香';
删除班级为1班,且年龄大于30的学生记录
delect from students where age > 30 and calss ='1班';
2. 【模拟环境】SQL注入时如何绕过逗号和百分号
UNION 跟 UNION ALL 是交集跟并集的写法
select * from a union select * from b --这种是A表与B表结果的交集写法,合并表,没有重复行;
select * from a union all select * from b --这种是A表与B表结果的并集写法 有重复行;
a表和b表结构一样,合并两个表,没有重复行,如果要重复行用union all
3. SQL sum函数一对多场景,消除笛卡尔积
贷款表
还款表
其中还款表使用load_id作为外键与贷款表关联。
贷款表数据
还款表数据
结果为 110.00
结果为 65.00
结果为 270.00
关联情况下,贷款表查询出的实际数据如下,可以看出这种情况下出现了笛卡尔积。
load_id为5的贷款对应3条还款,load_id为8的贷款对应2条还款。所以sum(lc.load_amt)的结果270 = 50 * 3 + 60*2。
解决方案,使用 DISTINCT 关键字。
结果 110.00
结果为 270.00 , 65.00。
跟场景三一样,贷款金额出现了笛卡尔积
这种情况可以分两步走
这种方式可能不是很好理解,换成子查询方式。
结果
结果
4. SQL在线模拟器网站推荐
01
SQL在线学习网
http://sample.jimstone.com.cn/xsql/
02
SQLFIDDLE
http://sqlfiddle.com/
03
SQLBOLT
https://sqlbolt.com/
04
W3RESOURCE
https://www.w3resource.com/
结束了,快乐,886!
5. mybatis中动态sql语句的实际应用场景是怎么样的,比如说if,具体在什么情况下可以使用,给高分,谢谢!
<where>
<trim prefixOverrides="and">
<if test="id!=null">
and c.id=#{id}
</if>
<if test="oid!=null and oid!=0">
and b.id=#{oid}
</if>
<if test="startDate!=null">
<if test="endDate!=null">
and a.pay_time BETWEEN #{startDate} AND #{endDate}
</if>
</if>
</trim>
</where>
service层如果参数为null,mybatis执行sql语句的时候就不会去拼接你指定的if标签中的sql语句
6. 如何用SQL分析电商用户行为数据(案例)
本文以“淘宝用户行为数据集”的分析全过程为例,展示数据分析的全过程
——使用工具:MySQL,Excel,Navicat,PowerBI
——分析类型:描述分析,诊断分析
——分析方法:漏斗分析,用户路径分析,RFM用户价值分析,活跃/存留分析,帕累托分析,假设验证分析。
(考虑到阅读体验文章中只放了SQL截图,如需PDF版本,再公众号后台回复“用户行为分析”领取)
(目录如下)
1.分析流程和方法
当没有清晰的数据看板时我们需要先清洗杂乱的数据,基于分析模型做可视化,搭建描述性的数据看板。
然后基于描述性的数据挖掘问题,提出假设做优化,或者基于用户特征数据进行预测分析找规律,基于规律设计策略。简单来说:
——描述性分析就是:“画地图”
——诊断性分析就是:“找问题”
——预测性分析就是 :“找规律”
在数据分析中有两个典型的场景:
一种是有数据,没有问题:需要先整体分析数据,然后再根据初步的描述分析,挖掘问题做诊断性分析,提出假设,设计策略解决问题。
另一种是已经发现了问题,或者已经有了假设,这种做数据分析更偏向于验证假设。
2.淘宝用户行为分析
本次是对“淘宝用户行为数据集”进行分析,在分析之前我们并不知道有什么问题,所以需要先进行描述性分析,分析数据挖掘问题。
我们首先来看下这个数据集的元数据:
根据以上数据字段我们可以拿用户行为为主轴从纵深方向提出一些问题,然后再从数据中找答案
纵向:
——这个数据集中用户的日活跃和周活跃时间有什么规律吗?
——在当日活跃的用户次日,三日,四日……还有多少活跃?
深向:
——用户从浏览到购买的整体转化率怎么样?
——用户从浏览到购买的路径是怎么样子的?
——平台主要会给用户推送什么商品?
——用户喜欢什么类目?喜欢什么商品?
——怎么判断哪些是高价值用户 ?
下面是叮当整理的常用分析方法:
我们可以给前面的问题匹配一下分析方法,便于后面的分析:
为了便于后面的数据分析,在分析之前我们需要先对做一下清洗
看元数据(字段解释,数据来源,数据类型,数据量……)初步发现问题为之后的处理做准备。
确定缺失值范围,去除不需要字段,填充缺失内容
根据元数据格式和后续分析需要的格式对数据进行处理
去除重复值,异常值
——去除重复值:并把用户ID,商品ID,时间戳设置为主键
——异常值处理:查询并删除2017年11月25日至2017年12月3日之外的数据
查询并删除小于2017-11-25的
——验证数据:
——分析思路:
——SQL提数:
——Excel可视化:
活跃曲线整体为上升状态,同为周六日,12月2号,3号相比11月25日,26日活跃度更高。
用户在周六周日相比其他时间更活跃(周六周日为休息日,用户有更多时间)
一天内用户活跃的最高峰期为21点(用户在这个时间段空闲较多)
——分析思路:
——SQL提数:
列出每用户每天及当天后面又活跃的日期,并创建“活跃时间间隔表”用于后面求次日存留,三日存留……
对“活跃时间间隔表视图”引用进行分组统计,计算每日存留人数并创建视图
对存留人数表进行计算,统计活跃用户留存率
——Excel可视化:
——分析思路:
——SQL提数:
-把各种用户行为分离出来并创建视图方便后续查询用户行为数据
查询整体数据漏斗
——Excel可视化:
用户从浏览到购买整体转化率2.3%,具体主要在哪个环节流失还需要再细分用户路径分析
——分析思路:
——SQL提数:
——PowerBI可视化:
用户从浏览到购买的路径主要有4条,路径越长转化率越底
路径1:浏览→购买:转化率1.45%
路径2:浏览→加购物车→购买:转化率0.33
路径3:浏览→收藏→购买:转化率0.11%
路径4:浏览→收藏→加购物车→购买:转化率0.03%
——分析思路:
——SQL提数:
——Excel可视化:
——描述性分析:
浏览量top100的商品浏览量呈阶梯分布,越靠前的阶梯之间的落差相对越大在这个阶梯中的商品越少,越靠后商品浏览量阶梯之间的落差相对越小,同阶梯内的商品越多。
浏览量TOP100的商品所属类目中,4756105,3607361,4357323三个类目浏览量远超其他类目。
——分析思路:
——SQL提数:
查询计算商品转化率,升序排列,取前100个
——Excel可视化:
——描述性分析:
从商品看:有17款商品转化率超过了1。
从类目看:这些商品所属类目分布均匀,除965809,4801426,2735466,2640118,5063620,4789432,2945933这7个类目之外,其他类目都只有一个商品在转化率TOP100的商品中。
——分析思路:
用户价值分析常用的分析方式是RFM模型
本次分析中的R,F,M具体定义(仅用于演示分析方法,无实际业务参考价值):
——SQL取数与分析:
1)建立打分标准:先计算R,F的值,并排序,根据R,F值最大值和最小值得区间设计本次得打分标准
-查询并计算R,F值创建视图
-引用RF数值表,分别查询R,F的最大值和最小值
-结合人工浏览的建立打分标准
2)给R,F按价值打分
3)计算价值的平均值
4)用平均值和用户分类规则表比较得出用户分类
——Excel可视化
通过描述性分析得到可视化的数据后我们一般会先看一下是否符合业务常识
如果符合常识接下来我们会通过与行业平均数据和本产品的同比环比对比看是否正常,如果不正常就要找原因,设计解决方案,如果正常那就看是否有可以优化的地方。
我们首先来看一下这些描述性分析是否符合业务常识和指标是否正常:
1.活跃曲线整体为上升状态,同为周六日,12月2号,3号相比11月25日,26日活跃度更高。
2.用户在周六周日相比其他时间更活跃
3.一天内用户活跃的最高峰期为21点
4.从2017年11月15日致2017年12月3日,活跃用户新增38%
5.从2017年11月15日致2017年12月3日,活跃用户次日留存增长18.67%,当日的活跃用户留存也在快速增长,第七日留存比次日留存高18.56%。
6.用户从浏览到购买整体转化率2.3%
7.用户从浏览到购买的路径主要有4条,路径越长转化率越低。
8.浏览量top100的商品浏览量呈阶梯分布,越靠前的阶梯之间的落差相对越大在这个阶梯中的商品越少,越靠后商品浏览量阶梯之间的落差相对越小,同阶梯内的商品越多。
9.浏览量TOP100的商品所属类目中,4756105,3607361,4357323三个类目浏览量远超其他类目。
10.从商品看:有17款商品转化率超过了1。
11.从类目看:这些商品所属类目分布均匀,除965809,4801426,2735466,2640118,5063620,4789432,2945933这7个类目之外,其他类目都只有一个商品在转化率TOP100的商品中。
根据以上诊断分析我们梳理出了以下假设,做假设验证。
假设1:这些商品中有高转化率的爆款商品
对比浏览量TOP5的商品,发现这些商品转化率在同一类目下并不高,假设不成立
假设2:4756105,3607361,4357323三个类目属于高频刚需类目
-创建类目购买频次表
-计算类目购买频次平均值
-查询4756105,3607361,4357323三个类目的购买频次
4756105,3607361,4357323三个类目的用户购买频次明显高于平均值,假设成立
假设3:有部分用户是未点击商详直接从收藏和购物车购买的。
用户不是直接从收藏和购物车购买的,只是后续复购未点击商详,假设不成立
假设4:淘宝推荐的商品主要是“同一类目下的高转化商品”
用Excel对浏览量TOP100的商品ID和转化率TOP100的商品ID进行去重,结果无重复值,假设不成立
3.结论:
1)用户活跃:用户活跃曲线整体呈上升趋势,在一周中周六,周日活跃度比平时更高,在一天中用户活跃曲线从凌晨4点开始往上升,在中午12点和下午5~6点有两个小低谷(吃饭),到晚上9点时活跃度达到顶峰。
2)用户留存:从2017年11月15日致2017年12月3日的用户留存数据来看,淘宝的用户留存数据较好,活跃用户次日留存增长18.67%,当日的活跃用户留存也在快速增长,第七日留存比次日留存高18.56%。
3)用户转化:整体转化2.3%,用户从浏览到购买的路径主要有4条,路径越长转化率越低。
4)平台推荐与用户偏好:从数据集中的数据来看,排除用户兴趣偏好标签,淘宝给用户用户推送的商品主要是高频刚需的类目,促使用户复购,流量回流平台。
以上结论受数据量和数据类型的影响,并不一定准确,仅用来练习数据分析方法。
(考虑到阅读体验文章中只放了SQL截图,如需PDF版本,再公众号后台回复“用户行为分析”领取)
7. sql特定场景查询(轨迹)
SELECT time1 FROM ( SELECT A.*, ROWNUM RN FROM (
select rownum no ,time1 from a
where city ='北京'
order by to_char(time1,'hh24miss')
) A WHERE ROWNUM <= 1 ) WHERE RN >= 1
上面这条语句查出来是a第一次在北京的最早一条记录,已此类推。最晚的时间在order by 后面用
desc 倒序排列,
上海就改条件,
a第二次就改条件 WHERE ROENUM<=2) WHERE RN >1 就可以了,自己去写吧,我懒得打了