SQL必备

参考链接:
数据分析面试必备——SQL你准备好了吗?
在这里插入图片描述
针对滴滴强调的对于SQL的高要求,结合上述链接进行补充:

1、
join(hive的join默认是inner join)、left joinright joinfull outer join(全连接),join之前要确保关联键是否去重,是不是刻意保留非去重结果

2、
unionunion 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。否则就没有意义。
我:(卒)嗯嗯,对的对的,只知道表之间关系有三种,遇到具体的业务应用就缺乏结合概念的实战要素。

设计并维护业务数据提取逻辑
数据清洗整理
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值