知识要点:
2.1 数据库的认知
2.2 Navicat 管理工具
2.3 数据类型
2.4 SQL基础查询语言
2.5 SQL 函数
2.6 SQL语句执行顺序
2.7 SQL多表联结查询
2.1 数据库的认知
数据库:
按照数据结构来组织、存储和管理数据的仓库;
保存有组织数据的容器;
说人话:用来存放数据的一个特殊文件。
数据库的由来:
截止至目前,Excel 最多存放104万行的数据;存放的数据有限,数据库由此诞生。
数据库的类型:
类型 代表 商用数据库 Oracle、SQL Server、DB2 开源数据库 MySQL、PostgreSQL 桌面数据库 微软 Access 数据库的构成:
术语 含义 列 表中的一个字段 行 表中的一个记录 表 结构化的信息;行和列组成 数据库 多张表组成一个数据库 总结 行和列构成表,一张张表构成数据库,MySQL里面可以存多个数据库 MySQL 里面可以存放多少数据:
MySQL 每个数据库最多可创建20亿个表;
一个表允许定义1024列;
SQL对每个表中行的数量没有直接限制,但它受数据库存储空间的限制。
SQL 简介
SQL:一种数据查询和程序设计语言,用于存取数据以及查询、更新和管理关系型数据库系统。
数据分析师最常用的是:数据查询语言、数据操作语言、数据定义语言;也就是,增删改查;
最常用的是“查”,取数。
2.2 Navicat 管理工具
熟悉Navicat的基本操作:链接数据库;新建数据库、删除数据库;新建数据表、删除数据表;数据增删改查;数据库的备份与恢复;数据表的导入与导出。
2.3 数据类型
数据类型 说明 常用的数据类型 int 整数 float 小数、浮点数 varchar 文本 date 日期 数值型 int(size) 整数,在括号中规定最大位数 float(size,d) 带有浮动小数点的小数字,在括号中规定最大位数 double(size,d) 带有浮动小数点的大数字,在括号中规定最大位数 日期型 YEAR() 2位或者4位格式的年 DATE() 日期 格式:YYYY-MM-DD TIME() 时间 格式:HH:MM:SS DATETIME() 日期和时间的组合 格式:YYYY-MM-DD HH:MM:SS TIMESTAMP() 时间戳 文本型 char(n) 保存固定长度的字符串(可包含字母、数字以及特殊符号) varchar(n) 保存可变长度的字符串(可包含字母、数字以及特殊符号)
2.4 SQL基础查询语言
SQL 常用命令的书写顺序
SQL基础查询语句:
顺序 命令 1 select *(必须) 2 from 表 3 where 条件 4 group by 字段 5 having 条件 6 order by 字段 7 limit 限制数据条数 SQL 对大小写不敏感;命令一般大写;表名、字段名一般小写。
序号 功能 要点 检索数据(select语句) 语法结构:select * from 表名 1 检索单列 select 列名 from 表名 检索“投资表”中的“投资金额”investment列
select investment from investmenttab;
2 检索多列 用“逗号”隔开 检索“投资表”中的“投资金额”investment列与“投资期限”investdays列
select investment, investdays from investmenttab;
3 检索所有列 检索所有列时,用“*” 检索“投资表”中的所有列
select * from investmenttab;
4 限制检索结果 限制检索用 limit 检索“投资表”前3行的数据
select * from investmenttab limit 3;
5 去重检索 去重用 distinct 检索“投资表”中的“投资期限”
select distinct investdays from investmenttab;
限定条件(where语句) 语法结构:select * from 表名 where 条件 6 数值判断 大于(>)、小于(<)、等于(=)、不等于(<>)、大于等于(>=)、小于等于(<=)、范围(between and) 检索出“投资表”中的“投资金额大于100000的投资信息”。
select * from investmenttab where investment > 100000;
7 逻辑判断 and、or、not、in() 检索出“投资表”中的“投资金额大于100000且投资期限为360天的投资信息”。
select * from investmenttab where investment > 100000 and investdays = 360;
8 模糊判断 like、%、_(下划线)等
like "%财%",表示只要字段中含有“财”字,都输出.
9 案例操作 从“投资表”中筛选出投资期限为270或者360,在2018年1月1日至2019年12月31日期间投资,并且投资金额在100000以上(含100000)的投资信息。
select * from investmenttab where investdays in (270,360) and investment >= 100000 and investmentdate between "2018-01-01" and "2019-12-31";
10 SQL创建计算字段:计算字段(加减乘除) 语法结构:select 字段1+字段2 as "合计", 字段1-字段2 as "相差", 字段1*字段2 as "乘积", 字段1/字段2 as "除以" from 表名 where 条件(非必须)
案例操作
在“投资表”中添加新字段:投资收益列income 投资收益计算公司如下:
投资收益income=投资金额investment*(投资收益率investrate/360)*投资期限investmentdays
select *,investment *(investrate/360)*investmentdays as income from investmenttab;
11 SQL创建计算字段:拼接字段(cancat) 语法结构:select concat(字段1,字段2) as '新字段名' from 表名 案例操作 在“用户表”中加入新拼接字段,把省份province和城市city拼接作为新拼接字段。
select *,concat(province,city) from users;
select *,concat(province,"-",city) from users;
12 数据分组(group by) 语法结构:select 字段,计算字段 from 表名 where 查询条件 group by 字段 案例操作 计算“各类投资期限投资产品”的投资金额。
select investdays,sum(investment) from investmenttab group by investdays;
13 数据过滤(having) 语法结构:select 字段,计算字段 from 表名 where 查询条件 group by 字段 having 过滤条件 案例操作 计算“各类投资期限”投资金额,显示投资金额大于1500000000(15亿)的投资信息。
select investdays,sum(investment) from investmenttab group by investdays having sum(investment)>1500000000;
14 结果排序(order by) [ 升序:asc(默认);降序:desc ] 语法结构:select 字段,计算字段 from 表名 where 查询条件 group by 字段 having 过滤条件 order by 字段 desc 案例分析 计算“各类投资期限理财产品”的投资金额,显示投资金额大于1500000000(15亿)的投资信息,并按投资金额从高到低降序排序。
select investdays,sum(investment) from investmenttab group by investdays having sum(investment)>1500000000 order by sum(investment) desc;
2.5 SQL 函数
序号 函数 描述 数值型函数 sum(列名) 返回某列的总和 avg(列名) 返回某列的平均值 min(列名) 返回某列的最低值 max(列名) 返回某列的最高值 count(列名) 返回某列的行数(不包含null值) count(*) 返回被选行数 count(distinct 列名) 返回相异结果的数目 abs(列名) 返回绝对值 sqrt(列名) 返回平方 案例操作 计算“各类投资期限理财产品”的投资金额,以及投资数量。
select investdays,sum(investment),count(investmentlistid) from investmenttab group by investdays;
时间日期型函数 时间格式:
datetime - 格式:yyyy-mm-dd hh:mm:ss
date - 格式:yyyy-mm-dd
year - 格式:yyyy
now() 返回当前的日期和时间 curdate() 返回当前的日期 curtime() 返回当前的时间 date() 提取日期或日期/时间表达式的日期部分 extract() 返回日期/时间的单独部分 date_add() 给日期添加指定的时间间隔 date_sub() 从日期减去指定的时间间隔 datediff() 返回两个日期之间的天数 date_format() 用不同的格式显示日期/时间 常见的日期命令 select now() 查看现在的日期和时间 select date(now()) 日期格式 select curdate() 查看现在的日期 select month(now()) 返回当前的月份 select year(now()) 返回当前的年份 select date_format(now(),'%Y-%m-%d') 年月日格式 select date_format(now(),'%Y-%m') 年月格式;大写为英文,小写为汉字 select date_add(now(),interval 1 day) 日期相加,加一天,加一周 select date_sub(now(),'%Y-%m') 日期相减,减一天,减一周 select datediff('2019-08-31','2019-01-01') 日期间隔多少天 案例操作 1.查看“投资结束日期”
select *,date_add(investmentdate,interval investdays day) as '投资结束日期' from investmenttab;
2.查看“投资月份”
select *,date_format( investmentdate,'%m' ) as '投资月份' from investmenttab;
文本型函数 left(列名) 返回左边的字符 right(列名) 返回右边的字符 length(列名) 返回某字段的长度 SQL函数:控制语句:IF 函数
语法结构:IF(condition,true,false)
案例操作 查询投资表,增添新列“投资额度类型”,投资金额大于等于100000的为高收入,投资金额小于100000的为低收入。
select *,if(investment>=100000,'高收入','低收入') as invest_res from investmenttab;
SQL函数:控制语句:(case when)条件函数
语法结构:
case
when 条件1 then '结果1'
when 条件2 then '结果2'
...
else '默认值'
end as '新字段名'
案例操作 查询投资表,增添新列“投资额度类型”,投资金额大于等于100000的为高收入,投资金额大于等于50000小于100000的为低收入,投资金额小于50000的为低收入。
select *,
case
when investment >= 100000 then '高收入'
when investment >= 50000 and investment < 100000 then '中收入'
else '低收入'
end as type
from investmenttab;
SQL函数:控制语句:数据透视表
case when 与 group by 搭配使用,完成数据透视表功能
案例操作 select investdays,
count( case when investment >= 100000 then '高收入' end) as '高收入'
count( case when investment >= 50000 and investment < 100000 then '中收入' end) as '中收入'
count( case when investment < 50000 then '低收入' end) as '低收入'
from investmenttab
group by investdays;
2.6 SQL语句执行顺序
*value *value SQL 语句执行顺序:SQL语句结构
语句结构:
select * from 表名 where 条件 group by 字段 having 条件 order by 字段 limit 限制数据条数
(SQL对大小写不敏感;命令一般大写,表名、字段一般小写)
SQL 语句执行顺序:SQL语句执行顺序 1.确定数据源
from
join
on
2.过滤数据 where
group by
having
3.查询数据
select 4.显示数据 distinct
order by
limit
2.7 SQL多表联结查询
为什么要联结?
一张表里有一部分信息,另外一张表有其他的信息,我们想要所有的信息,所以要把两张表做关联。
序号 类型 union 纵向连接:union用于把来自许多select语句的结果组合到一个结果集合中,也叫联合查询。 案例操作 将投资表(investmenttab)、投资2015年表(investmenttab2015)联结成一张大表.
-- 连接所有 --
select * from investmenttab2015 union all select * from investmenttab;
-- 去重连接(当数据与类型一致,认定为重复) --
select * from investmenttab2015 union select * from investmenttab;
-- 添加条件依旧可以连接 --
select * from investmenttab2015 where investment > 100000 union all select * from investmenttab where investdays = 360;
横向连接:union用于把来自许多select语句的结果组合到一个结果集合中,也叫联合查询。 内连接 - join:和 inner join 一样;
表1 join 表2,返回表1和表2 共同的行。
左连接 - left join:
表1 left join 表2,以表1为基础,匹配表2的相关信息;用得最多;即使右表中没有匹配,也从左表返回所有的行。
右连接 - right join:
表1 right join 表2,以表2为基础,匹配表1的相关信息;即使左表中没有匹配,也从右表返回所有的行。
全连接 - MySQL 中无直接实现全连接
案例操作 将投资表、用户表联结成一张大表,显示只有相同userid的数据。
-- 可以简写 --
select * from investmenttab inner join users on investmenttab.userid = users.userid;
可简写为:select * from investmenttab join users using(userid);
-- inner 可加可不加 --
select * from investmenttab join users on investmenttab.userid = users.userid;
-- on 可以连接不同字段 [belongtobusiness 与 departmentid 必须是同一个信息]--
select * from users join dept on users.belongtobusiness = dept.departmentid;