关于10个中级到高级SQL概念

随着数据量持续增长,对合格数据专业人员的需求也会增长。具体而言,对sql流利的专业人士的需求日益增长,而不仅仅是在初级层面。
因此,stratascratch的创始人nathan rosidi以及我觉得我认为10个最重要和相关的中级到高级sql概念。
1.常见表表达式(ctes)
如果您想要查询子查询,那就是ctes施展身手的时候 - ctes基本上创建了一个临时表。
使用常用表表达式(ctes)是模块化和分解代码的好方法,与您将文章分解为几个段落的方式相同。
请在where子句中使用子查询进行以下查询。
select  name, salary from people where name in ( select distinct name from population where country = canada and city = toronto )  and salary >= ( select  avg( salary )  from  salaries where gender = female) 这似乎似乎难以理解,但如果在查询中有许多子查询,那么怎么样?这就是ctes发挥作用的地方。
with toronto_ppl as (   select distinct name   from population   where country = canada         and city = toronto), avg_female_salary as (   select avg(salary) as avgsalary   from salaries   where gender = female)select name       , salaryfrom peoplewhere name in (select distinct from toronto_ppl)      and salary >= (select avgsalary from avg_female_salary) 现在很清楚,where子句是在多伦多的名称中过滤。如果您注意到,cte很有用,因为您可以将代码分解为较小的块,但它们也很有用,因为它允许您为每个cte分配变量名称(即toronto_ppl和avg_female_salary)
同样,ctes允许您完成更高级的技术,如创建递归表。
2.递归ctes.
递归cte是引用自己的cte,就像python中的递归函数一样。递归cte尤其有用,它涉及查询组织结构图,文件系统,网页之间的链接图等的分层数据,尤其有用。
递归cte有3个部分:
锚构件:返回cte的基本结果的初始查询
递归成员:引用cte的递归查询。这是所有与锚构件的联盟
停止递归构件的终止条件
以下是获取每个员工id的管理器id的递归cte的示例:
with org_structure as (   select id          , manager_id   from staff_members   where manager_id is null   union all   select sm.id          , sm.manager_id   from staff_members sm   inner join org_structure os      on os.id = sm.manager_id 3.临时函数
如果您想了解有关临时函数的更多信息,请检查此项,但知道如何编写临时功能是重要的原因:
它允许您将代码的块分解为较小的代码块
它适用于写入清洁代码
它可以防止重复,并允许您重用类似于使用python中的函数的代码。
考虑以下示例:
select name       , case when tenure  5 then vp              else n/a         end as seniority from employees 相反,您可以利用临时函数来捕获案例子句。
create temporary function get_seniority(tenure int64) as (   case when tenure  5 then vp        else n/a   end);select name       , get_seniority(tenure) as seniorityfrom employees 通过临时函数,查询本身更简单,更可读,您可以重复使用资历函数!
4.使用case when枢转数据
您很可能会看到许多要求在陈述时使用case when的问题,这只是因为它是一种多功能的概念。如果要根据其他变量分配某个值或类,则允许您编写复杂的条件语句。
较少众所周知,它还允许您枢转数据。例如,如果您有一个月列,并且您希望为每个月创建一个单个列,则可以使用语句追溯数据的情况。
示例问题:编写sql查询以重新格式化表,以便每个月有一个收入列。
initial table:  +------+---------+-------+  | id   | revenue | month |  +------+---------+-------+  | 1    | 8000    | jan   |  | 2    | 9000    | jan   |  | 3    | 10000   | feb   |  | 1    | 7000    | feb   |  | 1    | 6000    | mar   |  +------+---------+-------+    result table:  +------+-------------+-------------+-------------+-----+-----------+  | id   | jan_revenue | feb_revenue | mar_revenue | ... | dec_revenue |  +------+-------------+-------------+-------------+-----+-----------+  | 1    | 8000        | 7000        | 6000        | ... | null        |  | 2    | 9000        | null        | null        | ... | null        |  | 3    | null        | 10000       | null        | ... | null        |  +------+-------------+-------------+-------------+-----+-----------+ 5.except vs not in
除了几乎不相同的操作。它们都用来比较两个查询/表之间的行。所说,这两个人之间存在微妙的细微差别。
首先,除了过滤删除重复并返回不同的行与不在中的不同行。
同样,除了在查询/表中相同数量的列,其中不再与每个查询/表比较单个列。
6.自联结
一个sql表自行连接自己。你可能会认为没有用,但你会感到惊讶的是这是多么常见。在许多现实生活中,数据存储在一个大型表中而不是许多较小的表中。在这种情况下,可能需要自我连接来解决独特的问题。
让我们来看看一个例子。
示例问题:给定下面的员工表,写出一个sql查询,了解员工的工资,这些员工比其管理人员工资更多。对于上表来说,joe是唯一一个比他的经理工资更多的员工。
+----+-------+--------+-----------+  | id | name  | salary | managerid |  +----+-------+--------+-----------+  | 1  | joe   | 70000  | 3         |  | 2  | henry | 80000  | 4         |  | 3  | sam   | 60000  | null      |  | 4  | max   | 90000  | null      |  +----+-------+--------+-----------+answer:  select      a.name as employee  from      employee as a      join employee as b on a.managerid = b.id  where a.salary > b.salary 7.rank vs dense rank vs row number
它是一个非常常见的应用,对行和价值进行排名。以下是公司经常使用排名的一些例子:
按购物,利润等数量排名最高值的客户
排名销售数量的顶级产品
以最大的销售排名顶级国家
排名在观看的分钟数,不同观众的数量等观看的顶级视频。
在sql中,您可以使用几种方式将“等级”分配给行,我们将使用示例进行探索。考虑以下query和结果:
select name   , gpa   , row_number() over (order by gpa desc)   , rank() over (order by gpa desc)   , dense_rank() over (order by gpa desc)  from student_grades
row_number()返回每行开始的唯一编号。当存在关系时(例如,bob vs carrie),row_number()如果未定义第二条标准,则任意分配数字。
rank()返回从1开始的每行的唯一编号,除了有关系时,等级()将分配相同的数字。同样,差距将遵循重复的等级。
dense_rank()类似于等级(),除了重复等级后没有间隙。请注意,使用dense_rank(),daniel排名第3,而不是第4位()。
8.计算delta值
另一个常见应用程序是将不同时期的值进行比较。例如,本月和上个月的销售之间的三角洲是什么?或者本月和本月去年这个月是什么?
在将不同时段的值进行比较以计算deltas时,这是lead()和lag()发挥作用时。
这是一些例子:
# comparing each month's sales to last month  select month         , sales         , sales - lag(sales, 1) over (order by month)  from monthly_sales  # comparing each month's sales to the same month last year  select month         , sales         , sales - lag(sales, 12) over (order by month)  from monthly_sales 9.计算运行总数
如果你知道关于row_number()和lag()/ lead(),这可能对您来说可能不会惊喜。但如果你没有,这可能是最有用的窗口功能之一,特别是当您想要可视化增长!
使用具有sum()的窗口函数,我们可以计算运行总数。请参阅下面的示例:
select month         , revenue         , sum(revenue) over (order by month) as cumulative  from monthly_revenue
10.日期时间操纵
您应该肯定会期望某种涉及日期时间数据的sql问题。例如,您可能需要将数据分组组或将可变格式从dd-mm-yyyy转换为简单的月份。
您应该知道的一些功能是:
提炼
日元
date_add,date_sub.
date_trunc.
示例问题:给定天气表,写一个sql查询,以查找与其上一个(昨天)日期相比的温度较高的所有日期的id。
+---------+------------------+------------------+  | id(int) | recorddate(date) | temperature(int) |  +---------+------------------+------------------+  |       1 |       2015-01-01 |               10 |  |       2 |       2015-01-02 |               25 |  |       3 |       2015-01-03 |               20 |  |       4 |       2015-01-04 |               30 |  +---------+------------------+------------------+answer:  select      a.id  from      weather a,      weather b  where      a.temperature > b.temperature      and datediff(a.recorddate, b.recorddate) = 1 就这样!我希望这有助于您在面试准备中 - 我相信,如果您知道这10个内部概念,那么在那里大多数sql问题时,你会做得很好。
一如既往,祝你学习努力最好!
本文由闻数起舞翻译自dimitris poulopoulos的文章  
《ten advanced sql concepts you should know for data science interviews》
原文链接:
https://towardsdatascience.com/ten-advanced-sql-concepts-you-should-know-for-data-science-interviews-4d7015ec74b0


SIM卡座连接器已成为了电子设备中不可缺一的重要配件
带脉冲/频率输出的数字pH计信号调理器电路
2019年第四季度智能手机市场监测报告公布 苹果拿下全球智能手机销量冠军
【节能学院】企业能源管理系统在水泥企业中的设计与应用
植物光谱测量仪的作用和意义是什么
关于10个中级到高级SQL概念
光纤大电流传感器研究
二端口网络参数_二端口网络参数的测定
暖通空调系统与人工智能和物联网交织在一起
金鼎电子5G超薄挠性覆铜板投入试生产
Infineon FS45MR12W1M1-B11 7.5kW马达驱动方案
微信输入法真的来了!百度输入法、搜狗输入法和讯飞会受影响吗?
自耦变压器优缺点
一个高集成度的掉电检测电路应用
dfrobot心电图电极片简介
3D变电站三维建模可视化数字孪生系统建设
在CES2017:量子点、OLED、激光三大阵营角逐激烈
压铸铝双金属复合散热器介绍
一个RMW操作的例子
Mentor Graphics推出新的Mentor EZ-VIP PCI Express验证IP