1.基本概念
关系型数据库(RDBMS):是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
SQL(Structured Query Language):结构化查询语言,是一种用来操作RDBMS的数据库语言,当前关系型数据库都支持使用SQL语言进行操作,也就是说可以通过 SQL 操作 oracle,sql server,mysql,sqlite 等等所有的关系型的数据库。
数据类型:
整数:int,bit
小数:decimal
字符串:varchar,char
日期时间: date, time, datetime
枚举类型(enum)
约束:主键primary key、非空not null、惟一unique、默认default、外键foreign key
回购率:本月购买用户中有多少用户下个月又再次购买
复购率:当月购买了多次的用户占当月用户的比例
2、不熟悉的操作
(1)查看所有数据库:show databases;
(2)使用数据库:use数据库名;
(3)查看当前使用的数据库:select database();
(4)创建数据库:create database 数据库名 charset=utf8;
(5)删除数据库:drop database 数据库名
(6)清空表:truncate table 表名
(7)if条件判断:IF(expr1,expr2,expr3),如果expr1的值为true,则返回expr2的值,如果expr1的值为false,则返回expr3的值。
(8)限制查询位置:select * from表名limit start,count
(9)逻辑删除(先增加字段,在做更新):
alter table students add is_delete bit default 0;
update students set isdelete=1 where id = 1;
(10)group_concat()
语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
```
SELECT sex,group_concat(userid order by userid desc separator'-')
from userinfo
group by sex
```
(11)group by 和group_concat()连用:
select gender,group_concat(name) from students group by gender;
(12)case...when....
语法:
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
#比较col_name和value1是否相等,如果相等,返回result1,否则返回default
CASE WHEN [expr] THEN [result1]…ELSE [default] END
#判断when后面的表达式expr是否为true,如果为true,则返回result1
可以结合sum()函数联合多表完成行转列
```
select stu.sname,stu.sid,
sum(case when cou.cname='语文' then sc.score else 0 end
) as '语文',
sum(case when cou.cname='数学' then sc.score else 0 end
) as '数学',
sum(case when cou.cname='英语' then sc.score else 0 end
) as '英语'
from student as stu
left join sc on stu.sid=sc.sid
left join course as cou on cou.cid=sc.cid
group by stu.sname,stu.sid
order by sid
```
如果此处case when不与sum()结合使用,会报错,原因可以分析下:
如果不加sum函数,聚合维度角度来考虑,一个name和id对应的是否是一个返回值呢?显然不是
在语文这个新字段,每个name和id对应4个返回值,那么计算机应该返回哪一个呢?
不知道,所以报错了。
而加上sum后,每个新字段在每一条记录下返回的是一个值。
3.数据分析实践练习
困难一:代码框架
在做较为复杂的查询时,很多时候都要进行多表连接、多次子查询、自联结,有时候要交叉使用。
以回购率这个较为复杂的查询为例,要查询3月的回购率,分三步进行代码构建:
第一步:查询每年每月的每个id用户的消费情况
第二步:相邻月用户进行关联,能关联上的说明是回购用户
第三步:统计每个月的消费人数情况并且得到新的计算字段(回购率)
困难二:时间数据处理(探索中)
给出的数据中为datetime标准格式,需要提取年月日进行统计。实际分析中的数据一般是多年的完整月度数据,用year()函数提取并不能精确说明问题。因此考虑使用date_format()函数对时间格式进行转化。
此过程中发现,如果使用date_format(paidTime,'%Y-%m')的形式进行转化,发现实际查询过程中次月的回购用户并没有链接到上一月的数据中。
对数据进行探索:select distinct paidtime from orderinfo
4.报错解决
在workbench中导入SQL文件:https://blog.csdn.net/u010801439/article/details/78762387
workbench中出现You are using safe update mode 解决方法:https://blog.csdn.net/wade3015/article/details/89436489
Every derived table must have its own alias(sql语句错误解决方法) :https://blog.csdn.net/qq_32863631/article/details/83024322
5.其他的操作
查看当前mysql版本:select VERSION() from dual;
或者运行status命令