sql语法面试题记录
- 窗口函数在sql执行流程中处于哪一步?
- order by的执行顺序是哪一步?DISTINCT的执行顺序是哪一步?
- order by中的排序字段必须是select中选择的字段吗?如果可以的话,那么继续对这个字段做DISTINCT去重操作可以吗?
基础语法题目推荐
大厂真题推荐
推荐理由:三表左连接、多表查询、范围查询、多字段分组、时间函数、排名窗口函数
推荐理由:左连接、分组、聚合函数处理分组字段
推荐理由:时间处理函数
推荐理由:exists的应用
推荐理由:内连接、分组、聚合函数处理分组字段,排名窗口函数
推荐理由,公用表达式拆分物化子查询求解,拆解过程如下
- 使用内连接/in/exists来获取到近期等过的用户-登录时间维度的临时表tmp1
- 对临时表tmp1通过用户+日期来进行分组,并通过窗口函数根据日期降序的方式获取到rank字段,这个rank字段即该用户在当天根据访问时间降序排列的名次,将用户,登录时间,rank三个字段组成临时表tmp2
- 主查询中,直接获取临时表中全部rank大于3的数据,并对userId去重
- 使用in或exists,获取下过订单用户的相关访客数据,将访客id和访问时间组成临时表tmp1
- 根据tmp1按天统计当天下单客户的总量,并组成tmp2
- 取visit_tb表,根据时间分组,获取当天时间全部的访客,注意这里是按天级别的时间分组的,因为同一个访客在同一天可能多次访问,需要去重访客id,按天统计当天下全部访客的总量,组成tmp3
- tmp2和tmp3根据时间连表,计算转换率
- 多个子查询结果集作为查询条件
- 子查询结果集作为临时表tmp来和其它表做内连接查询并根据某字段降序
- select的字段中没有包括排序字段,所以排序字段作为select的隐藏字段,导致select的字段无法直接做distinct去重操作,所以同时对隐藏字段和目标字段做distinct,生成第二个临时表tmp2,最终从tmp2中取出结果