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,2) as 月,
4 Mid (身份号码, 13,2)as 日,
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(订购日期)AS 日
5 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 订购明细;



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.身份证号码,2)
6 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.省份;