SQL入门学习

96
凡人求索 22d8d123 271c 4d80 9c59 6990844a9e37
0.1 2017.10.06 09:00* 字数 1747

数据库简单来讲就是一堆互相关联的数据,最基础的数据组成了表(table),也是我们经常看到的一张Excel的sheet。

Mysql的安装

  • Mysql安装注意

首先去MySQL的官网下载,版本5.6以上即可,安装的过程不打算进行细说,谷歌有很多的教程。这里给大家分享下我踩过的坑。

刚开始大家把下载好的程序,直接一路选择默认。但是填写Root用户密码时,一定要牢记密码


剩下的照样可以一路选择默认。

  • 安装GUI

在GUI界面上操作MySQL,Mac用户推荐SequealPro,Win用户推荐WorkBench,同样的是去MySQL的官网下载。

数据的导入

接下来所使用的数据是来秦路老师所提供,点击文末福利即可获得。

在数据的导入过程有几点需要留意下

  1. 尽量使系统的编码格式和文件的编码格式是相同的,比如说文件是utf-8格式,系统也要选择utf-8格式,否则数据中的中文将是乱码。

  2. 设置各字段的数据类型时,系统会帮我们自动选上,改不改都是可以的。int代表整数数值,varchar代表字符串(中文英文标点符号这类),括号里面的数字是允许存储字节,一般不需修改,但是对于某些数据字节较大的,相应的也要增大括号中的数字。

正式开始

对于数据的处理,从数据的筛选、数据分组聚合、时间类数据的处理,数据的清洗

  • 先来看下我们的数据
SELECT * FROM data.analyst;   #"*"代表的是所有的列
#data是数据库相当于一个excel文件,annlyst是数据表相当于sheet

其实这是一份各个城市的数据分析相关职位数据

  • 根据判断条件查询数据
  1. 查询所有上海城市的职位数据
select * from data.analyst  where city="上海"; #where 用于条件判断。
  1. 查询城市为上海,职位为数据分析师的数据
select * from data.analyst  where city="上海" and positionName="数据分析师";
              #使用and进行多条件查询
  1. 查找城市为上海,或者职位名称是数据分析师的数据

     select * from data.analyst  where city="上海" or positionName="数据分析师";
    

4.查找出上海的数据分析师或者是北京的产品经理

select * from data.analyst  where (city="上海"and positionName="数据分析师")or (city="北京"and positionName="分析师助理");
#有括号时,先对括号进行判断

5.查询北京上海广州深圳南京城市的数据

select * from data.analyst where city in ("北京","上海","广州","深圳","南京");
  1. 筛选字段类型为数值时

其实,当我们遇到字段数据类型是数值时,也可以使用符号> 、>=、< 、<=、!= 进行逻辑判断,!= 指的是不等于,等价于 <> 。

select * from data.analyst where companyId>10000;
    # 筛选出companyId大于10000所有职位数据

当要想筛选谋区间的数值时

select * from data.analyst where companyId between 10000 and 12000;
      #between and 包括数值两端的边界

7.查找positionName列包含数据分析字样的数据

select * from data.analyst where positionName like "%数据分析%";
    #   %代表的是通配符,"%数据分析%"表示的是无所谓[数据分析]前面后面是什么内容;
#"%数据分析"表示的是无所谓数据分析前面的内容是什么;
 #"数据分析%"表示的是无所谓数据分析后面的内容是什么;

其中还有一个比较重要的语法是not,在逻辑上代表逆转,常见的有not in、not like、not null等,用这样的语法可以实现删除某些数据的效果。

  • 分组

常用的是group by语法,它是将数据按组或是维度来划分,并且分类后常常会利用某些函数再形成聚合

  1. 查看有多少个城市

    select * from data.analyst  group by city;  #按照城市来进行分组
    

现在有多少个城市轻而易举的获得了。

  1. 查看分别有多少个城市分为一组
select  city,count('count') from data.analyst  group by city;

3.查看每个城市拥有的职位数

select  city,count(distinct(positionId)) as pos from data.analyst  group by city;
#distinct(),去重函数,去除重复的数据。
 #count(distinct(positionId)) as pos意思是把count(distinct(positionId))这个新形成的列进行重命名为pos

4.多维的形式的数据聚合

  select  city,workYear,count(distinct(positionId)) as poi from data.analyst  group by city,workYear;

group by后添加多个字段,并通过聚合函数就会形成多维形式的数据聚合
其中聚合函数count,max,min,sum,avg等函数

5.if函数和group by 的结合使用

如果要是计算数据的占比,使用if函数比较方便;筛选出电子商务领域的分析师数据

select if (positionName like "%d电子商务%",1,0) from data.analyst;

筛选出不同城市的职位数量和不同城市的电子商务行业的职位数量

select city,count(distinct(positionAdvantage)),(if (positionName like "%d电子商务%",positionId,0))from data.analyst group by city

这里再添加一个条件,数据分析师岗位数量在500以上的城市有哪些

select city,count(distinct(positionId)),(if (positionName like "%d电子商务%",positionId,0))
from data.analyst group by city having count(distinct(positionId))>20

使用having语句,是对聚合后的数据结果进行过滤。

用order by语句,使结果能够呈现一定的顺序

select city,count(distinct(positionId)) as count,(if (positionName like "%d电子商务%",positionId,0))
from data.analyst group by city having count(distinct(positionId))>20 order by count desc;
  • 时间的处理

1.now()返回当前的日期和时间

  select now()#返回当前日期和时间

2.date() 返回日期

select date(now());

3 .week函数获得当前第几周

select week(now());

其实表示时间的函数还有month,quarter,year,day,hour,minute大都是类似的。

  • 数据的清洗

将会使用到的函数有left,right,mid,locate(),substr(字符串,从哪里开始截,截取的长度),这些函数大都与Excel中的函数相似就不再多说了,下面说下清洗的思路以及代码

因为此表中的薪资大多为7k-9k之类的,如果这样我们没有对工资进行比较,所以我们把这类的薪资换算成平均薪资。

1.先获取工资的下线

select  salary ,left(salary,locate('k',salary)-1) as bottomsalary from data.analyst; 

2.获取工资的上线

select salary ,substr(salary,locate('-',salary)+1,length(salary)-locate('-',salary)-1) as topsalary from data.analyst where salary not like "%以上%";

3.计算不同城市不同工作年限的平均薪资

select city,workyear,round(avg((topsalary+bottomsalary)/2))as avgsalary from (select substr(salary,locate('-',salary)+1,length(salary)-locate('-',salary)-1) as topsalary ,left(salary,locate('k',salary)-1) as bottomsalary,workyear ,city from data.analyst where salary not like "%以上%" )as t1 group by city,workyear order by city, avgsalary;
  • 使用join关联表

数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的,在表中,每个主键的值都是唯一的,(其实主键没有太多的实际意义)。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。这也很像excel中的vlookup函数起到得而作用一样,但是join的使用会更加的高级,有下面几种形式的使用:

JOIN和Inner Join: 如果表中有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行

关于这一部分大家应该多多操作,我想这部分在以后的工作中肯定会是经常用到的,因为时间原因这部分内容就不细说了,可以参考W3School上的案例。现在随着自己计划的一步步进行,竟然有些恐慌了,真的学的越多感觉欠缺的越多,为了找工作先最少得而必要知识。想想站在未来的角度来看,肯定是能够找到工作的,或许工作还不错,这样一想结果非常明确了,只是过程需要自己来经历,这样一想焦灼是完全没有必要的。

福利,文中使用的数据

数据分析
Web note ad 1