七周数据分析-数据库

1. 基本的经典查询

#基本的查询语句
SELECT *
FROM data.`dataanalyst` 
WHERE city ='上海'
AND (education = '本科'
OR workYear = '1-3年'
)
AND secondType LIKE '%开发%'  #字段包含开发
OR secondType LIKE '后端%'  #优先级:()> AND > OR

结果:

image-20210308165143576

2. 不同城市招聘公司的数量,需要用distinct去重

#不同城市招聘公司的数量,需要用distinct去重
SELECT city, COUNT(positionId), COUNT(DISTINCT(companyId)) 
FROM data.`dataanalyst`
GROUP BY city

image-20210308212735308

3. 不同城市,学历的招聘岗位数目

#不同城市,学历的数目
SELECT city,education,COUNT(1) FROM data.`dataanalyst`
GROUP BY city,education
image-20210310111010580

4. 不同城市电子商务岗位的数量

#不同城市电子商务岗位的数量
SELECT city,COUNT(1) FROM data.`dataanalyst`
WHERE industryField LIKE '%电子商务%'
GROUP BY city
HAVING COUNT(1)>50 #二次过滤,挑选拥有电子商务岗位数量为50以上的城市

image-20210310165957076

5. 这是第4题的改写

上面也可以写成这样

把where合并入having中

#不同城市电子商务岗位的数量
SELECT city,COUNT(1) FROM data.`dataanalyst`
GROUP BY city
HAVING COUNT(IF(industryField LIKE '%电子商务%',1,NULL))>50 

得出的结果完全相同

6. 不同城市下,电子商务岗位在所有岗位中的占比

注意:AS的别名在where中起名之后,只能在having,order by中使用

select
city,
COUNT(IF(industryField LIKE '%电子商务%',1,NULL)) as emarket,
count(1) as total,
COUNT(IF(industryField LIKE '%电子商务%',1,NULL))/count(1) as proportion
from data.`dataanalyst`
group by city
having  emarket>10
order by proportion

image-20210310170024644

7. 截取薪资上限和下限

SELECT 
LEFT(salary,LOCATE('k',salary)-1) AS 'minSalary',
RIGHT(salary,LOCATE('-',salary)-1) AS '最大薪资数据',
#去掉最后的k
LEFT(RIGHT(salary,LOCATE('-',salary)-1),LOCATE('k',RIGHT(salary,LOCATE('-',salary)-1))-1) AS 'maxSalary',
salary
FROM data.`dataanalyst`

image-20210310170102565

8. 是第7题薪资上下限的改写,使用substr函数

SELECT
LEFT(salary,LOCATE('k',salary)-1) AS 'minSalary',
LOCATE('-',salary),
LENGTH(salary),
#substr(字符串,从哪里开始,截取长度)
SUBSTR(salary,LOCATE('-',salary)+1,LENGTH(salary)-LOCATE('-',salary)-1) AS 'maxSalary',
salary
FROM data.`dataanalyst`

image-20210310170131473

9. 子查询实现对平均薪资分区

使用子查询,对数据进一步过滤,且使用了别名,更加优雅hhh

SELECT 
    CASE
        WHEN (minSalary+maxSalary)/2 <=10 THEN '0-10k'
        WHEN (minSalary+maxSalary)/2 <=20 THEN '10k-20k'
        WHEN (minSalary+maxSalary)/2 <=30 THEN '20k-30k'
        ELSE '30k以上'
    END AS '平均薪资范围',
	(minSalary+maxSalary)/2 AS 'aveSalary',
	salary
FROM(
    SELECT
        LEFT(salary,LOCATE('k',salary)-1) AS 'minSalary',
        LOCATE('-',salary),
        LENGTH(salary),
        #substr(字符串,从哪里开始,截取长度)
        SUBSTR(salary,LOCATE('-',salary)+1,LENGTH(salary)-LOCATE('-',salary)-1) AS 'maxSalary',
        salary
    FROM 
    	data.`dataanalyst`
	) AS t

注意对表子查询的话,最后要加上 as t

image-20210310101645211

10. 查询职位数目在100以上的城市的详细数据

使用子查询,先查询出符合条件的城市名

【注意】外部 where 中的 city 必须与子查询中的 city 字段名相同

SELECT *
FROM data.`dataanalyst`
WHERE city IN (
    SELECT
        city
    FROM data.`dataanalyst`
    GROUP BY city
    HAVING COUNT(positionId)>100
)

子查询结果:

image-20210310103549358

最终结果:

image-20210310103627610

11. 表关联join

image-20210310105906345

查询:规模为150-500的公司的岗位总数

SELECT
    COUNT(t2.companyId) AS '目标职位数量',
    COUNT(1) AS '总职位数量'
FROM data.`dataanalyst` t1 LEFT JOIN(
    SELECT *
    FROM data.`company`
    WHERE companySize = '150-500人') t2 ON t1.`companyId`=t2.companyId

image-20210310145103231

12. 用power shell导入数据

C:\Windows\system32>cd /d D:\Environment\mysql-5.7.19\bin

D:\Environment\mysql-5.7.19\bin>mysql -u root -p
Enter password: ******

mysql> load data local infile 'C:/Users/Jianfei Sun/Desktop/七周成为数据分析师_课件/第五周/orderinfo.csv' into table data.orderinfo character set utf8 fields terminated by ',';
Query OK, 539414 rows affected, 65535 warnings (2.98 sec)
Records: 539414  Deleted: 0  Skipped: 0  Warnings: 539415

解决乱码:在table后面加入character set utf8语句

13. 时间字段

SELECT
    paidTIme,
    DATE(paidTIme),
    MONTH(paidTIme), #返回月份
    DATE_FORMAT(paidTIme,'%Y-%m-%d'), #年-月-日
    DATE(DATE_ADD(paidTIme,INTERVAL 1 DAY)) #加上一天,能嵌套函数
FROM data.`orderinfo`

image-20210310164754573

14. 统计不同月份的下单人数

#统计不同月份的下单人数
SELECT MONTH(paidTIme),COUNT(DISTINCT(userId)) 
FROM data.`orderinfo`
WHERE isPaid ='已支付' #过滤脏数据
GROUP BY MONTH(paidTIme)

image-20210324111904071

原始表数据

image-20210324111942785

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值