1. SQL(Structure Quest Language)

一种结构化查询语言,它是一种通用的关系型数据库操作语言,用于存取数据,查询,更新和管理数据库。

2. 基本语句

Select, Create, Insert, Drop

3. SQL语句注意事项

1)SQL语句中,英文字母大写或小写均可

2)每个SQL语句的关键字用空白符号分隔

3)字段或参数之间用逗号分隔

4)SQL语句中,如参数为字符型,需要使用单引号,数值型不使用单引号

5)SQL语句结束时,在语句结尾处添加分号,在Access数据库中,无强制要求SQL语句结束时添加用分号。

6)Access数据库SQL语句中,如表名,字段名中出现空格,‘/’, '\'等特殊字符时,需用方括号‘ []’ 将含有特殊字符的表名或字段名括起来,以免得到不正确的结果或SQL语句无法运行。

7)SQL语句中,‘*’代表选定数据表中的所有字段,并且按照其在数据库中的固定顺序来显示

8)Access数据库,在函数参数中或条件查询中,若参数或查询条件为日期和时间类型数据,需要在数据值两端加上井字符号(#),以表示数据类型为日期型

9)SQL语句中使用的逗号,分号,单引号,括号等符号均需要是在输入法为英文状态下输入的符号。

10)应尽量避免在数据库中进行全表扫描:

        a. 首先应考虑用where子句筛选出需要的数据;

        b. 其次,在where子句中,应尽量避免使用 “!=”或 “<>”, "OR"等

        c. 最后应尽量避免在where子句中对字段进行函数操作,否则将进行全表扫描

4. 字段拆分

 1)相关函数

         a. Left(字符串, 提取的位数)

         b. Right (字符串, 提取的位数)

         c. Mid (字符串, 提取的起始位置, 提取的位数)

2)示例:从身份证号码中提取省份编码,区县编码,出生日期     

1 SELECT 身份证号码, Left (身份号码,2) as 省份编码,
2 Mid (身份号码, 7,4) as 年,
3 Mid (身份号码,11,2as 月,
4 Mid (身份号码, 13,2as 日,
5 Mid (身份号码, 17,1) as 性别
6 FROM 用户明细;

5. 随机抽样:按照随机原则,进行抽取样本的一种方法

  例如: 随机抽取20条记录        

1 SELECT TOP 20 *
2 FROM 用户明细
3 ORDER BY Rnd (用户ID);

6. 数据合并

1)字段合并   

           a. 使用连接符: &, +         

1 SELECT 身份证号码,
2 (Mid(身份证号码,7,4) &-& Mid(身份证号码,11,2&-& Mid(身份证号码,13,2)) as 出生日期
3 FROM 用户明细;

           b. 使用相关函数(比如日期函数DateSerial)             

1 SELECT 身份证号码,
2 DateSerial (Mid(身份证号码,7,4), Mid(身份证号码,11,2), Mid(身份证号码,13,2)) as 出生日期
3 FROM 用户明细;

2)字段匹配

          a.连接类型:主要包含内连接(INNER JOIN),左连接(LEFT JOIN),右连接 (RIGHT JOIN)三种数据库关系;

1 SELECT 订购明细.订单编号, 订购明细.订购日期, 订购明细.用户ID, 订购明细.产品, 订购明细.[单价(元)], 用户明细.性别
2 FROM 订购明细 INNER JOIN 订购明细.用户ID=用户明细.用户ID

3)记录合并

a. 记录合并:要求各表具有相同字段,结构,使用UNION ALL 或 UNION 指令进行两表或多表合并;

b. UNION会删除各表存在的重复记录,并进行排序,要慎用。

###合并所有记录,不擅长重复记录
1
SELECT * FROM (SELECT *FROM 订购明细20110901) UNION ALL SELECT * FROM 订购明细20110902)
#### 创建一张空表
1
SELECT *INTO 订购明细201109 2 FROM 订购明细20110901 3 WHERE 1=2; ### 该条件不可能满足

7. 数据去重:保留唯一的数据记录

1)Group By: 对数据按指定的分组字段进行分组。

1 SELECT 用户ID
2 FROM 用户明细重复
3 GROUP BY 用户ID;

2) Distinct: 忽略所选字段中包含重复数据的记录,简单来说,就是数据去重。

1 SELECT DISTINCT 用户ID, 注册日期, 身份证号码,性别,年龄
2 FROM 用户明细重复;

8.数据分组

1)数值分组---IIF函数,与Excel中的IF用法一致

       IIF(条件表达式,表达式成立返回的值,表达式不成立返回的值): 

1 SELECT 用户ID, 年龄
2 IIF(年龄<=20, "20岁及其以下",
3 IIF(年龄 <=30, "21-30岁",
4 IIF(年龄 <= 40, "31-40岁", "40岁以上")))AS 年龄分组
5 FROM 用户明细;

2)日期分组

       a. YEAR, MONTH, DAY函数:

1 SELECT 订单编号,订购日期,
2 YEAR (订购日期) AS 年,
3 MONTH(订购日期)AS 月,
4 DAY(订购日期)AS5 FROM 订购明细;

        前提:订购日期字段必须为日期型数据

       b. FORMAT函数:FORMAT(日期/时间, 日期/时间格式参数)

日期/时间格式参数 说明
:(冒号) 时间分隔符
/ 日期分隔符
d 根据需要以一位或两位数字表示一个月中的第几天(1-31)
dddd 星期的全称(Sunday-Saturday)
w 一周中的第几天(1-7)
ww 一年中的第几周(1-53)
m 根据需要以一位或两位数字表示一年中的月份(1-12)
mmmm 月份的全称(January-December)
q 一年中的第几个季度(1-4)
y 一年中的第几天(1-366)
yyyy 完整的年份(0100-9999)
h 根据需要以一位或两位数字表示小时(0-23)
n 根据需要以一位或两位数字表示分钟(0-59)
s 根据需要以一位或两位数字表示秒(0-59)

 

 

 

 

 

 

 

 

 

 

 

 

 

如下示例:

 1 SELECT 订单编号, 订购日期,
 2 FORMAT(订购日期, "yyyy") AS 年,
 3 FORMAT(订购日期, "q") AS 季,
 4 FORMAT(订购日期, "m") AS 月,     
 5 FORMAT(订购日期, "d") AS 日,
 6 FORMAT(订购日期, "dddd") AS 星期,
 7 FORMAT(订购日期, "h") AS 小时,
 8 FORMAT(订购日期, "n") AS 分,
 9 FORMAT(订购日期, "s") AS 秒,
10 FROM 订购明细;

9.数据计算

1) 简单计算: 加,减,乘,除

1 SELECT 订单编号,产品,【单价(元)】, 数量, 订购金额,【数量】*【单价(元)】AS 订单金额
2 FROM 订购明细;   

 2)函数计算:通过软件内置的函数进行计算,比如:DATEDIFF("参数", 起始日期, 结束日期)

参数 说明
yyyy
q 季度
m
d
w
h
n
s

       

 

 

 

 

 

 

1  SELECT 用户ID, 注册日期, DATEDIFF("D", 注册日期, #2015-2-14#) AS 注册天数             -----------------日期数据要用##标明
2 FROM 用户明细;

10. 数据分析

1)简单统计

统计方式 统计函数 说明
计数 Count() 统计指定列中值的个数
求和 Sum() 计算数值型数据的总和
平均 Avg() 计算数值型数据的平均值
最大值 Max() 筛选出数据的最大值
最小值 Min() 筛选出数据的最小值
标准差 StDev() 计算数值型数据的标准差
方差 Var() 计算数值型数据的方差

 

 

 

 

 

 

 

1 SELECT Count(订单编号) AS 订单总数, Sum(订购金额) AS 订购金额总额, Avg(订购金额) AS 平均订单金额
2 FROM 订单明细;

2)分组分析

a. 定量分组:数值分组,日期分组

1 SELECT IIF (年龄<=20,"20岁及其以下",
2 IIF(年龄<=30, "21-30岁",
3 IIF (年龄 <=40, "31-40岁", "40岁以上"))) AS 年龄分组,
4 Count(用户ID)AS 用户数
5 FROM 用户明细
6 GROUP BY  IIF (年龄<=20,"20岁及其以下",
7 IIF(年龄<=30, "21-30岁",
8 IIF (年龄 <=40, "31-40岁", "40岁以上")));

b. 定性分组:按事物已有的类别进行划分,用Group By语句

1 SELECT 产品,Count(订单编号) AS 订单总数,Sum(订购金额) AS 订购总金额,Avg(订购金额) AS 平均订单金额
2 FROM 订购明细
3 GROUP BY 产品;

   日期分组:

1 SELECT FORMAT(注册日期, "m") AS 月,
2 Count(用户ID) AS 用户数
3 FROM 用户明细
4 GROUP BY FORMAT(注册日期, "m")

 

3) 排序分析   

1 SELECT 产品, Count(订单编号) AS 订单总数
2 FROM 订购明细
3 GROUP BY 产品
4 ORDER BY Count(订单编号) DESC ;

4) 结构分析

1 SELECT 产品,
2 Count(产品编号)/(SELECT Count(d订单编号) FROM 订购明细) AS 占比
3 FROM 订购明细
4 GROUP BY 产品;

5)分布分析:查看数据的分布情况

1 SELECT IIF(B.年龄<=20, “20岁及其以下”,IIF(B.年龄<=30, "21-30岁",IIF(B.年龄<=40, "31-40岁", “40岁以上”))) AS 年龄分组, COUNT(A.用户ID) AS 购买用户数
3 FROM (SELECT 用户ID FROM 订购明细 GROUP BY 用户ID) AS A, 用户明细 AS B
6 WHERE A.用户ID=B.用户ID
7 GROUP BY IIF(B.年龄<=20, "20岁及其以下", IIF(B.年龄<=30, “21-30岁”, IIF(B.年龄<=40, "31-40岁", “40岁以上”)));
8  
9   

6)交叉分析:通常用于分析两个或两个以上分组变量的关系,以交叉表的形式进行变量间关系的对比分析,从数据的不同维度综合进行分组细分,以进一步了解数据的构成和分布特征。

变量的类型:

a. 定量,定量分组交叉

b. 定量,定性分组交叉

c. 定性,定性分组交叉

交叉的维度:不宜过多,一般建议两个维度。

1 TRANSFORM COUNT(用户ID) AS 用户数
2 SELECT 年龄
3 FROM 用户明细
4 GROUP BY 年龄
5 PIVOT 性别;

7)留存分析:以留存率为基准,留存率是用户留下来的比率。

留存用户:(第一日登录,且在第二日登录的用户)

1 SELECT 登录用户明细20110101.用户ID, 登录用户明细20110102.用户ID
2 FROM 登录用户明细20110101 LEFT JOIN 登录用户明细20110102 ON 登录用户明细20110101.用户ID=登录用户明细20110102.用户ID
#### 计算留存率
1
SELECT count(登录用户明细20110101.用户ID) AS 第一日登录用户数,count( 登录用户明细20110102.用户ID)/count(登录用户明细20110101.用户ID) AS 次日留存率 2 FROM 登录用户明细20110101 LEFT JOIN 登录用户明细20110102 ON 登录用户明细20110101.用户ID=登录用户明细20110102.用户ID

8)矩阵分析:例如根据年龄,消费两个维度,分析各省份购买用户质量。

各省份购买用户平均订购金额:

1 SELECT LEFT(B.身份证号码,2) As 省份编码,
2 AVG(A.订购金额) AS 平均订购金额
3 FROM 订购明细 AS A, 用户明细 AS B
4 WHERE A.用户ID=B.用户ID
5 GROUP BY LEFT(B.身份证号码,2)

使用LEFT函数处理过的字段为短文本字段.

各省份购买用户平均订购金额:

1 SELECT C.省份
2 AVG(A.订购金额) AS 平均订购金额
3 FROM 订购明细 AS A, 用户明细 AS B, 省份 AS C
4 WHERE A.用户ID=B.用户ID
5 AND C.省份编码=LEFT(B.身份证号码,26 GROUP BY C.省份

各省份购买用户平均年龄:

1 SELECT C.省份, AVG(B.年龄) AS 平均年龄
2 FROM 
3 (SELECT 用户ID FROM 订购明细 GROUP BY 用户ID) AS A,
4 用户明细 AS B,
5 省份 AS C
6 WHERE A.用户ID=B.用户ID AND C.省份编码=LEFT(B.身份证号码,2)
7 GROUP BY C.省份;

 

posted on 2017-09-05 11:04  寒若雪  阅读(1571)  评论(0编辑  收藏  举报