搞定SQL!5个棘手SQL查询的解决方法


全文共3023字 , 预计学习时长8分钟
搞定SQL!5个棘手SQL查询的解决方法
本文插图
图源:unsplash
对于数据科学家来讲 , SQL(结构化查询语言)是其工具箱中最重要的工具之一 。 掌握SQL不仅有助于你在面试中脱颖而出 , 而且通过解决复杂查询达到对SQL的充分理解 , 还能在让你许多竞争中保持领先地位 。
本文就将介绍5个有关SQL的棘手问题和其解决方法 。 注意 , 每个查询都能以不同方式编写 。 在参考本文解决方案之前 , 你可以先试着自己思考一下 。
搞定SQL!5个棘手SQL查询的解决方法
本文插图
查询1
下列表格由名字和职业两列组成 。 需要查询所有姓名 , 且使其后紧跟一个括号 , 括住“职业”列中对应的首字母 。
搞定SQL!5个棘手SQL查询的解决方法
本文插图
· 本文解决方案
SELECT CONCAT(Name, ’(‘, SUBSTR(Profession, 1, 1), ’)’) FROM table;
由于需要把名字和职业结合起来 , 可以使用CONCAT 。 而且因为括号内只需要一个字母 , 可以使用SUBSTR来传递列名、开始索引和结束索引 。 因为只需要首字母 , 所以我们将传递1 , 1(开始索引包括在内 , 结束索引不包括在内) 。
搞定SQL!5个棘手SQL查询的解决方法
本文插图
查询2
蒂娜需要从她创建的EMPLOYEES表中计算所有员工的平均工资 , 但结果显示的平均值很低 , 这可能是键盘上的回零键失效了 。 她希望我们帮助找出错误计算的平均值和实际平均值之间的差异 。 我们须编写一个查找错误的查询(实际平均值-计算平均值) 。
搞定SQL!5个棘手SQL查询的解决方法
本文插图
· 本文解决方案
SELECT AVG(Salary) - AVG(REPLACE(Salary, 0, ’’)) FROM table;
需要注意 , 只有一个表包含了实际工资值 。 为了创建错误场景 , 使用REPLACE替换0 。 接着传递列名、替换值以及用于替换REPLACE方法的值 。 然后 , 使用聚集函数AVG来求平均值的差 。
搞定SQL!5个棘手SQL查询的解决方法
本文插图
查询3
给定一个表 , 它是由节点和父节点两列组成的二元搜索树 。 需要编写一个查询 , 以返回按节点值进行升序排序的节点类型 。 有3种类型:
· 根(Root)——如果节点是根
· 叶(Leaf)——如果节点是叶
· 内部(Inner)——如果节点既不是根也不是叶
搞定SQL!5个棘手SQL查询的解决方法
本文插图
· 本文解决方案
经过初步分析 , 可以得出结论:如果给定节点N的相应P值为NULL(空) , 则它是根 。 而如果给定节点N存在于P列中 , 则它不是内部节点 。 基于此想法编写一个查询 。
SELECT CASE WHEN P IS NULL THENCONCAT(N, ' Root') WHEN N IN (SELECTDISTINCT P from BST) THEN CONCAT(N, ' Inner') ELSE CONCAT(N, ' Leaf') END FROM BST ORDER BY N asc;
可使用CASE作为开关函数 。 正如前文提到的 , 如果对于给定节点N , P为空值 , 则N是根 。 因此 , 我们使用CONCAT来组合节点值和标签 。
类似地 , 如果给定节点N存在于P列中 , 则它是内部节点 。 为了获得P列中的所有节点 , 我们编写了一个返回P列中所有不同节点的子查询 。 由于要求按节点值升序对输出进行排序 , 因此要使用ORDER BY子句 。