参考链接:
数据分析面试必备——SQL你准备好了吗?
针对滴滴强调的对于SQL的高要求,结合上述链接进行补充:
1、
join(hive的join默认是inner join)、left join、right join、full outer join(全连接),join之前要确保关联键是否去重,是不是刻意保留非去重结果
2、
union与union all
来自《SQL必知必会(第四版)》
如何利用UNION操作符将多条SELECT语句组合成一个结果集。
主要有两种情况需要使用组合查询:
在一个查询中从不同的表返回结构数据;
对一个表执行多个查询,按一个查询返回数据。
任何具有多个WHERE子句的SELECT语句都可以作为一个组合查询。
创建组合查询
UNION指示DBMS执行这两条SELECT语句,并把输出组合成一个查询结果集(相当于where语句中的or)。
对于较复杂的过滤条件,或者从多个表(而不是一个表)中检索数据的情
形,使用UNION可能会使处理更简单。
参考一下具体的DBMS文档,以了解一下使用UNION组合SELECT语句的数目限制。
多数好的DBMS使用内部查询优化程序,在处理各条SELECT语句前组合它们,实践中多数查询优化程序并不能达到理想状态,所以最好测试一下这两种方法,看哪种工作得更好。
UNION规则
UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔。
UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过,各个列不需要以相同的次序列出)。
列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以隐含转换的类型(例如,不同的数值类型或不同的日期类型)。
包含或取消重复的行
如果想返回所有的匹配行,可使用UNION ALL而不是UNION,此时能让每个条件的匹配行全部出现。
对组合查询结果排序
在用UNION组合查询时,只能使用一条ORDER BY子句,它必须位于最后一条SELECT语句之后。
虽然ORDER BY子句似乎只是最后一条SELECT语句的组成部分,但实际上DBMS将用它来排序所有SELECT语句返回的所有结果。
UNION在需要组合多个表的数据时也很有用,即使是有不匹配列名的表,在这种情况下,可以将UNION与别名组合,检索一个结果集。
3、
case when 条件1 then value1
(when 条件2 then value 2…)
(else null)
end
4、
单个列排序
多个列排序
简单指定列名,列名之间用逗号分开
排序时严格按照order by后面列名字的顺序r1、r2进行排序:先排r1,再排r2
仅在多个行具有相同的r1值时才对行按r2进行排序
如果r1列中所有的值都是唯一的,则不会按r2排序
按列位置排序
除了能用列名指出排序顺序外,ORDER BY还支持按相对列位置进行排序
如果有必要,可以混合匹配使用实际列名和相对列位置
指定排序方向
如果想在多个列上进行降序排序,必须对每一列指定DESC关键字
分组排序
参考链接1
参考链接2
row_number() over(partition by 分组列 order by 排序列 desc)
一般多用于分页查询
rank()
排名函数,可以对某一个字段进行排名,排名先后会从序号上体现出来(即名次相同的序号一致)
dense_rank()
dense_rank()排名是连续的
rank()是跳跃的排名
所以一般情况下用的排名函数就是rank()
5、常见笔试面试题
(1)有3个表S,C,SC:
S(SNO,SNAME)代表(学号,姓名)
C(CNO,CNAME,CTEACHER)代表(课号,课名,教师)
SC(SNO,CNO,SCGRADE)代表(学号,课号,成绩)
问题:
1、找出没选过“黎明”老师的所有学生姓名。
2、列出2门以上(含2门)不及格学生姓名及平均成绩。
3、既学过1号课程又学过2号课所有学生的姓名。
在这里插入代码片
结合具体业务的SQL语句使用
滴滴数据运营实习生SQL技术问题(我没回答上来的一个)
两张表A和B,A、B均只有一个属性ID,A五行数据字段值均为1,B三行数据,字段值均为1.
左连接将返回多少条数据?
右连接将返回多少条数据?
内连接将返回多少年数据?
我:(傻愣了一会儿)这有意义吗?
面试官:这个需要结合具体的业务意义,要看两张表之间的关系是1对1,1对n,还是m对n。否则就没有意义。
我:(卒)嗯嗯,对的对的,只知道表之间关系有三种,遇到具体的业务应用就缺乏结合概念的实战要素。