数据分析之 SQL

数据分析之 SQL_第1张图片
SQL

一般来说SQL主要是指SQL查询语言,mysql主要是数据库。

检索数据简单应用

SELECT * FROM 数据库.表名
  • 表示通配符,匹配表中所有字段。
# 搜索某一个字段
SELECT city FROM 数据库.表名; 
# 搜索某两个个字段
SELECT city,name FROM 数据库.表名;
# 限制搜索一百条数据
SELECT city,name FROM 数据库.表名
limit 100;

这里的分号在图形操作界面可以删掉,在命令行操作一定要带上。

排序用 order by 一般用数字字段来

# 升序排列
SELECT city,name FROM 数据库.表名
order by id;
# 降序排列
SELECT city,name FROM 数据库.表名
order by id desc
limit 100;

过滤用 where

SELECT city,name FROM 数据库.表名
where name = '杭州;

SELECT * FROM 数据库.表名
where id > 100;

SELECT * FROM 数据库.表名
where id between 100 and 200;
SELECT * FROM 数据库.表名
where city in ('上海','长沙');

SELECT * FROM 数据库.表名
where city not in ('上海','长沙');

SELECT * FROM 数据库.表名
where city != '上海';

SELECT * FROM 数据库.表名
where city <> '上海';

and or
通常的场景是筛选条件很多。
筛选出城市是上海,学历为本科或者工作经验为1-3年的。

SELECT * FROM 数据库.表名
where city = '上海';
and education = '本科'
or workyear = '1-3年'

这样执行得不到我们想要的结果的,因为在SQL中and优先执行。
那么上面的代码解释起来就是:满足城市是上海和学历是本科或者工作年限为1-3年。也就是下面的代码:

SELECT * FROM 数据库.表名
where (city = '上海';
and education = '本科')
or workyear = '1-3年'

我们的需求应该这样写:

SELECT * FROM 数据库.表名
where city = '上海';
and (education = '本科'
or workyear = '1-3年')

一旦遇到复杂的逻辑一定要加上括号,最里面的括号优先级最高。

模糊查找

# 包含后端
SELECT * FROM 数据库.表名
where secondtype like '%后端%'
# 以后端开头
SELECT * FROM 数据库.表名
where secondtype like '后端%'
# 以后端结尾
SELECT * FROM 数据库.表名
where secondtype like '%后端'

分组

按照城市分组
SELECT * FROM 数据库.表名
group by city

严格一点的写法,选择城市,不能用 * 号。

SELECT city FROM 数据库.表名
group by city

有一个需求这样:想知道不同城市下招聘的数量,就可以对城市进行分组,对职位进行计数:

SELECT city count(positionID) FROM 数据库.表名
group by city

又有需求啦:想知道城市中招聘数量在一百以上的数据,招聘岗位少的我希望把它过滤掉。这时候就是对分组 group by 提出了一个过滤 where 的挑战。
在 SQL 中这种语法叫做 having 可以把它等价于 where 只是这个 having 只是单纯针对分组之后的结果进行过滤。
实现起来就是这样的:

SELECT city,count(1) FROM 数据库.表名
group by city
having count(positionID) >= 100

还可以在过滤的基础上分组:

SELECT city,count(1) FROM 数据库.表名
where industryField like %电子商务%
group by city
having count(positionID) >= 50

等价于:

SELECT city,count(1) FROM 数据库.表名

group by city
having count(if(where industryField like %电子商务%,1,null)) >= 50

如果满足条件就为 1 计数,否则为 null 不计数。


把薪资过滤出来,提取最小薪资最大薪资。

select
left(salary,location('k',salary)-1),
salary
from 表
substr(salary,locate('-',salary)+1,length(salary)-locate('-',salary)-1)
#从中间截取字段,从哪里开始,到哪里结束
from 表

利用子查询:

select
    case
        when(bottom + top)/2 <= 10 then '0-10'
        when(bottom + top)/2 <= 20 then '10-20'
        when(bottom + top)/2 <= 30 then '20-30'
        else '30+'
    end,
    salary from(
        select
        left(salary,location('k',salary)-1) as bottem,
        substr(salary,locate('-',salary)+1,length(salary)-locate('-',salary)-1) as top,
        salary
        from 表 ) as t

你可能感兴趣的:(数据分析之 SQL)