MYSQL是数据分析师、建模工程师、算法工程师和数据科学家最最基本的能力,但是也是应该最广的基本技能之一,可以说是可以伴随我们整个技术人的整个职场生涯,鉴于非常多的大咖已经做了很多优秀的总结,我仅进行一些汇总工作,站在前人的肩膀之上才能看得远,后面我会分享很多原创信息。
一.入门学习建议
文章链接:SQL入门学习建议
二.教学教程
教程1:MYSQL教程-菜鸟教程
教程2:MySQL教程 w3school
三.数据库的原理
如果想知道数据库的原理建议看:《数据库原理(第5版)》--清华大学出版社
也有知识总结的链接:数据库原理 知识点总结
四.《SQL入门经典(第五版)》思维导图总结
五.MYSQL 常用语法总结
1.查看表相关信息: select column from table limit 10;
table是我们的表名,column是我们想要查询的字段/列,column可以用 * 代替,指代全部字段,意为从table表查询所有数据, limit 10 表示查询表的前10行,限制的目的是因为有些表较大,可以快速看到表的结构信息。
2.条件判断 where 使用:select * from table where city='北京'
将所有城市为北京的数据信息过滤出来
3.条件判断where and 和 or的联合使用:
select * from table where city='北京' and city='上海'
将北京和上海两个地区相关的数据信息过滤出来;
select * from table where city='北京' or position=‘程序员’
将北京或者程序员相关的数据信息过滤出来;
备注:and 是并且的关系,or 是或的关系
4.当有括号时,会优先进行括号内的判断,当有多个括号时,对最内层括号先进行判断,然后依次往外
select * from table where (city='北京' or position=‘程序员’) or (where city='上海' or position=‘分析师’)
这条语句的含义是查找出北京的程序员或者是上海的分析师的相关信息
5.条件判断 in 的使用
select * from table where city in ( '北京', ‘上海’, ‘深圳’, ‘重庆’)
这条语句的含义是查找出北京、上海、深圳、重庆相关的所有信息,类似并列集合
6. 数字类型的符号运用 > 、>=、< 、<=、!= 进行逻辑判断,!= 指的是不等于,等价于 <>
select * from table where mean_income >=10000
这条语句表示查询平均收入大于等于10000的相关信息
备注:between and也具有这个类似功能
select * from table where mean_income between 10000 and 20000
等价于:select * from table where mean_income >=10000 and mean_income <=20000
这条语句表示查询平均收入大于等于10000 同时小于等于20000 的相关信息
7.模糊匹配 like 的使用
select * from table where position like '%数据分析%'
语句的含义是在position 列查找包含「数据分析」字段的数据,%代表的是通配符,含义是无所谓「数据分析」前面后面是什么内容。如果是 '数据分析%' ,则代表字段必须以数据分析开头的全部信息,'%数据分析' 则代表字段必须以数据分析结尾的全部信息
8.not 的否定使用 :not like, not in, is not null等
select * from table where position not like '%数据分析%'
语句的含义是在position 列查找不包含「数据分析」字段的数据信息
9.group by的使用 通常用于数据分组/维度划分来进行聚合,具体结合:count(),sum(), max(),min(),mean(),avg()
select city, count(*) from table group by city
表示按照city 分类的信息数量计数统计
备注:count(*)和count(1) 意义是一样的,出现重复数据可以用distinct加以限制,distinct 主要用于去重
列1:select city, count( distinct city_id ) from table group by city
9.1 select city,position, count(*) from table group by city,position
表示按照city 、position以多维的形式进行数据聚合计数统计
10 case when 和 if的使用
select case when position like '%数据分析%' then 1 else 0 end as new_position from table
表示:如果position信息 为‘数据分析’计数为1 否则为0 并并命名一个新的字段名称new_position
等价于:select if(position like '%数据分析%' , 1 , 0 ) as new_position from table
备注:case when 可以多并列使用
select case when position like '%数据分析%' then 1
when position like '%产品经理%' then 2 else 0 end as new_position from table
表示:如果position信息 为‘数据分析’计数为1 ,为‘产品经理’ 为2 否则为0 并并命名一个新的字段名称new_position
10. having 的使用:select city, count(*) from table group by city having count(*) >20
表示:筛选city统计数量大于20的信息
11.order by 和desc的使用
select city, count(*) from table group by city order by count(*) desc
表示:按照统计数量升序排列呈现, desc表示倒序排列
12 时间处理
select sysdate(), now()
表示,查看当前时间,sysdate()和now()表示的意义是一样的
select date(now())
它代表的是获得当前日期,精确到天
备注:week函数获得当前第几周,month函数获得当前第几个月。其余还包括,quarter(计算季度),year,day,hour,minute
12.1 日期的增减
select date_add(date(now()), interval 1 day)
表示:当前时间减去一天的日期时间;备注:interval 1 month, interval 1 year 分别表示当前时间减去一个月和一年的日期时间
12.2 日期的时间差:datediff(date1,date2)或者timediff(time1,time2)
12.3 日期格式转换:select date_format(SYSDATE(),'%Y-%m-%d')
表示转换为:‘2019-06-04’格式
13 字符串截取:left、right、mid等函数,类似Excel一样的功能,
备注:substr(字符串,从哪里开始截,截取的长度)是常用的字符串截取函数
select substr('posittion', 0,3 ) from table
表示:从字符串的第一个字母开始截取,截取3个字母, 结果为:pos
14 表关联:join(内关联)等价于inner join, left join(做关联), right join(右关联),union(会删除重复数据),union all(表拼接不删除重复数据),cross join(交叉关联)
select a.* , b.* from table a
join table b on a.id= b.id
表示 表a 和表b的通过id关联之后的交集信息
select a.* , b.* from table a
left join table b on a.id= b.id
表示:以表a作为主表,通过id关联表b里面的信息,表a的全部信息和表a中的id在表b中信息,如下图
备注:同时可以结合where 条件语句筛选目标数据
select a.* , b.* from table a
right join table b on a.id= b.id
表示:表b作为主表关联表a中的信息,表b的全部信息和表b 的id存在于表a中信息
select a.* , b.* from table a
left join table b on a.id= b.id
union
select a.* , b.* from table a
right join table b on a.id= b.id
表示:查询结果全表拼接,前提是查询结果字段一致
15.竖表变横表
for example1:
select name as '姓名',
max(case subject when '语文' then score else 0 end) 语文,
max(case subject when '英语' then score else 0 end) 英语,
max(case subject when '物理' then score else 0 end)物理,
sum(score) as 总分,
avg(score) as 平均分
from tb2
group by name
for example2:
SELECT Name ,
SUM(CASE WHEN Course = N'语文' THEN Grade
ELSE 0 END) AS Chinese ,
SUM(CASE WHEN Course = N'数学' THEN Grade ELSE 0
END) AS Mathematics ,
SUM(CASE WHEN Course = N'英语' THEN Grade ELSE 0 END) AS English
FROM dbo.Table_A
GROUP BY Name
for example3:
SELECT Name ,
'Chinese' AS Course ,
Chinese AS Score
FROM dbo.Table_B
UNION ALL
SELECT Name ,
'Mathematics' AS Course ,
Mathematics AS Score
FROM dbo.Table_B
UNION ALL
SELECT Name ,
'English' AS Course ,
English AS Score
FROM dbo.Table_B
ORDER BY Name ,
Course DESC
参考文章:MYSQL中竖表和横表之间的相互转换
六.oracle语法汇总
oracle主要使用语法和mysql类似,只是在一些函数和细节稍有不同,总之大同小异。
oracle参考文章1:oracle数据库基础知识学习笔记
oracle参考文章2:Oracle数据库基础知识
参考文章1:MySQL, 从入门到熟练
参考文章2:mysql多表关联查询