假如你明天就要二面数据分析岗位
哪些是你必须要知道的呢?
当面试官:SQL的where、distinct都会吗?
你可千万不要惊讶
因为你可以不会python
也可以不会R
但你必须要会SQL
还不赶紧get起来!
1
攻克基础:SELECT语句
1
“*”号代表所有列
“*”号能选出表中所有的列。例如代码:SELECT * FROM Table, 此代码会选出Table表中所有的列。
2
DISTINCT 去重
DISTINCT关键词,能对表中一列或多列信息进行去重。以下图为例,DISTINCT 关键字对列名“product_type”去重,列中两个“办公”会变成去重后的一个“办公”,“服装”和“厨房”也有同样去重效果 。
3
ORDER BY 排序
ORDER BY 的作用是排序,可对一列或多列排序。下图展示了对两列同时进行排序的例子。
两列排序
代码:“ORDER BY department,salary”,作用是先对department的各个部门排序,其次,基于已排序部门的基础上再对salary进行排序(默认升序)。
首先,对部门finance ,marketing,technology按照26个英文字母的升序进行排序,部门依次被排为finance第一,marketing第二,technology第三。其次,当同一部门出现多个员工时,再按照salary大小进行升序排序, 比如,部门的Joe、Sam、Jason被分别排为第一,第二,第三。详情见下图。
业务场景
高铁买票时,会用到价格排序,出发时间、耗时长短;淘宝血拼时,会用到价格排序;大众点评找美食时,会用到距离优先、好评优先等。顾客在使用这些功能时,后台数据库用到的就是简单但强大的“ORDER BY”语句。
4
LIMIT限制行数
LIMIT关键词可限制查询行数。LIMIT用法有二。用法一,返回表的前X行;用法二,返回表的特定行。
2
如何选数据?
怎么把数据从表里选出来?
-- 从table_1中选择a这一列select a from table_1
想要的数据在多张表里,想取多个字段,该怎么办?—— 表连接
-- table_1中有id,age; table_2中有id,sex。想取出id,age,sex 三列信息-- 将table_1,table_2 根据主键id连接起来select a.id,a.age,b.sex from (select id,age from table_1) a
--将select之后的内容存为临时表ajoin (select id, sex from table_2) b
--将select之后的内容存为临时表bon a.id =b.id
在这里先介绍一下几种join: (敲重点咯,这里可是很容易考到的)
join : hive的join默认是inner join,找出左右都可匹配的记录;
left join: 左连接,以左表为准,逐条去右表找可匹配字段,如果有多条会逐次列出,如果没有找到则是NULL;
right join:右连接,以右表为准,逐条去左表找可匹配字段,如果有多条会逐次列出,如果没有找到则是NULL;
full outer join: 全连接,包含两个表的连接结果,如果左表缺失或者右表缺失的数据会填充NULL。
每种join 都有on ,>join 之前要确保关联键是否去重,是不是刻意保留非去重结果。
两张表数据的字段一样,想合并起来,怎么办?
-- 不去重,合并两张表的数据select * from (select id from table_1UNION ALLselect id from table_2)t;
union和union all 均基于列合并多张表的数据,所合并的列格式必须完全一致。
union的过程中会去重并降低效率,union all 直接追加数据。union 前后是两段select 语句而非结果句。
3
常见的笔试&面试题有哪些?
例:有3个表S,C,SC:
S(SNO,SNAME)代表(学号,姓名)
C(CNO,CNAME,CTEACHER)代表(课号,课名,教师)
SC(SNO,CNO,SCGRADE)代表(学号,课号,成绩)
问题:
1. 找出没选过“黎明”老师的所有学生姓名。
2. 列出2门以上(含2门)不及格学生姓名及平均成绩。
3. 既学过1号课程又学过2号课所有学生的姓名。
1. -- 考察条件筛选select sname from s where sno not in( select sno from sc where cno in (select distinct cno from c where cteacher='黎明' ));
2. -- 考察聚合函数,条件筛选select s.sname, avg_grade from sjoin(select sno from sc where scgrade < 60 group by sno having count(*) >= 2) t1on s.sno = t1.snojoin(select sno, avg(scgrade) as avg_grade from sc group by sno ) t2on s.sno = t2.sno;
3. -- 考察筛选、连接select sname from ( select sno from sc where cno = 1) ajoin (select sno from sc where cno = 2) bon a.sno = b.sno
掌握了这些,在做SQL题目的时候注意理解每个题目考察的知识点,有利于对形成记忆点,学习过程中一定要把知识点反复看,反复练,就像原来我们的错题本一样,把SQL的错题再做一遍也是可以的。