美文网首页
数据分析之 SQL

数据分析之 SQL

作者: sixkery | 来源:发表于2018-11-11 20:23 被阅读77次
    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

          本文链接:https://www.haomeiwen.com/subject/sprraftx.html