作者 | Alexei Ledenev

翻译 | 天道酬勤,责编 | Carol

出品 | CSDN云计算(ID:CSDNcloud)

在任何以数据为中心的工作中,对SQL有深刻的理解都是成功的关键,尽管这不是工作中最有趣的部分。事实上,除了SELECT FROM WHERE GROUP BY ORDER BY之外,还有更多的SQL方法。你知道的功能越多,操作和查询所需的内容就越容易。

作者希望在本文中学习和交流以下两件事:

1)学习和教一些基本功能以外的SQL函数;

2)探讨一些SQL面试练习问题。

* 本文中的问题仅来自Leetcode

问题1:第二高的薪水

编写一个SQL查询用于从Employee表中获取第二高的薪水。例如,给定下面的Employee表,查询应返回200作为第二高的薪水。如果没有第二高的薪水,则查询应返回null。

+----+--------+
| Id | Salary |
+----+--------+
| 1   | 100     |
| 2   | 200     |
| 3   | 300     |
+----+--------+

1)解决方案A使用IFNULLOFFSET

  • IFNULL(表达,alt):如果为null,则ifnull()返回指定的值,否则返回期望的值。 如果没有第二高的薪水,我们会使用它返回null。

  • OFFSET:offset与ORDERBY子句一起使用可忽略指定的前n行。这会很有用,因为你希望获得第二行(第二高的薪水)

| Id | Salary |
+----+--------+
| 1   | 100     |
| 2   | 200     |
| 3   | 300     |
+----+--------+

2)解决方案B使用MAX()

此查询表示选择的MAX薪水不等于最高薪水,这等于选择第二高的薪水。

SELECT
IFNULL(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1
), null) as SecondHighestSalary
FROM Employee
LIMIT 1

问题2:重复的电子邮件

编写SQL查询以在名为Person的表中查找所有重复的电子邮件。

+----+---------+| Id | Email    |+----+---------+| 1  | a@b.com  || 2  | c@d.com  || 3  | a@b.com  |+----+---------+

1)解决方案A子查询中的COUNT()

首先,创建一个子查询来显示每封电子邮件的频率次数。然后子查询在计数大于1的地方被过滤。

SELECT EmailFROM (SELECT Email, count(Email) AS countFROM PersonGROUP BY Email) as email_countWHERE count > 1

2)解决方案B:HAVING子句

  • HAVING是一个子句,从本质上讲,你可以将WHERE语句与聚合(GROUP BY)结合使用。

SELECT EmailFROM PersonGROUP BY EmailHAVING count(Email) > 1

问题3:温度上升

下面给定一个天气表,编写一个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                   |+---------+------------------+------------------+

解决方案:DATEDIFF()

  • DATEDIFF是计算两个日期之间的差,用于确保我们将今天的温度与昨天的温度进行比较。

简单来说,查询是选择给定日期的温度高于昨天的温度的ID。

SELECT DISTINCT a.IdFROM Weather a, Weather bWHERE a.Temperature > b.TemperatureAND DATEDIFF(a.Recorddate, b.Recorddate) = 1

问题4:部门最高薪资

下面的雇员表中包含所有雇员。每个员工都有一个ID、一个薪水,还有一个部门ID列。

+----+-------+--------+--------------+| Id | Name   | Salary | DepartmentId |+----+-------+--------+--------------+| 1   | Joe   | 70000  | 1               || 2   | Jim   | 90000  | 1               || 3   | Henry | 80000  | 2               || 4   | Sam   | 60000  | 2               || 5   | Max   | 90000  | 1               |+----+-------+--------+--------------+

下面的部门表包含公司的所有部门。

+----+----------+| Id | Name      |+----+----------+| 1   | IT        || 2   | Sales    |+----+----------+

编写SQL查询来查找每个部门中薪水最高的员工。对于上述两个表,你的SQL查询应返回以下行(行的顺序无关紧要)。

+------------+----------+--------+| Department | Employee | Salary |+------------+----------+--------+| IT            | Max       | 90000  || IT            | Jim       |90000   || Sales        | Henry     | 80000  |+------------+----------+--------+

解决方案:IN子句

  • IN子句允许你在WHERE语句中使用多个OR子句。例如,WHERE country ='Canada'或country ='USA'与WHERE country IN('Canada','USA')相同。

  • 在这种情况下,我们希望过滤部门表来仅显示每个部门的最高薪水(即DepartmentId)。然后,我们可以将两个表连接在一起,其中DepartmentId和Salary在已过滤的Department表中。

SELECTDepartment.name AS 'Department',Employee.name AS 'Employee',SalaryFROM EmployeeINNER JOIN Department ON Employee.DepartmentId = Department.IdWHERE (DepartmentId , Salary)IN( SELECTDepartmentId, MAX(Salary)FROMEmployeeGROUP BY DepartmentId)

问题5:互换座位

玛丽是一所中学的老师,她有一张座位表,上面存储着学生的姓名和相应的座位ID。列ID是连续的增量,玛丽想为相邻的学生互换座位。

你可以编写SQL查询来输出玛丽的结果吗?

+---------+---------+
|    id     | student |
+---------+---------+
|    1      | Abbot   |
|    2      | Doris   |
|    3      | Emerson |
|    4      | Green   |
|    5      | Jeames  |
+---------+---------+

对于样本输入,输出为:

+---------+---------+
|    id     | student |
+---------+---------+
|    1      | Doris   |
|    2      | Abbot   |
|    3      | Green   |
|    4      | Emerson |
|    5      | Jeames  |
+---------+---------+

注意:如果学生人数为奇数,则无需更改最后一个座位。

解决方案:CASE WHEN

  • 可以将CASE WHEN THEN语句视为编码中的IF语句。

  • 第一条WHEN语句检查行数是否为奇数,如果行数为奇数,请确保ID号不变。

  • 第二个WHEN语句为每个id加1(例如,1,3,5变为2,4,6)

  • 同样,第三个WHEN语句将每个id减1(2,4,6变为1,3,5)

SELECT
CASE
WHEN((SELECT MAX(id) FROM seat)%2 = 1) AND id = (SELECT MAX(id) FROM seat) THENid
WHEN id%2 = 1 THEN id + 1
ELSE id - 1
END AS id, student
FROM seat
ORDER BY id

以上就是所有的解决方法,如果有不清楚的地方或其他意见,欢迎评论告诉我们!

【End】

在中国企业与「远程办公」正面相遇满月之际,2月29日,CSDN 联合广大「远程办公」工具服务企业共同举办【抗击疫情,科技公司在行动】系列之【远程办公】专题线上峰会活动:中国「远程办公」大考
扫下方二维码或点击阅读原文免费报名直播+抽取奖品+与大牛交流

提前了解峰会详情,可加小助手微信csdnai,回复远程办公,进直播群

推荐阅读 

☞疫情病毒全部“抹杀”?用数据模型来解读传播抑制的效果差异!

☞两成开发者月薪超 1.7 万、算法工程师最紧缺!| 中国开发者年度报告

☞华为诺亚、北大提出GhostNet,使用线性变换生成特征图,准确率超MobileNet v3 | CVPR 2020

☞真实版“删库跑路”?程序员蓄意破坏线上生产环境!

☞新知识点!一文告诉你如何调试运行在Docker容器中的远程Node.js应用程序

☞远程办公是一阵“过渡风”还是会“继续燃烧”?

你点的每一个在看,我认真当成了喜欢

猛戳“阅读原文”,参与报名吧!

数据科学家常见的五个 SQL 面试问题相关推荐

  1. sql中ifnull不生效_数据科学家常见的5个SQL面试问题

    作者 | Alexei Ledenev 翻译 | 天道酬勤,责编 | Carol 出品 | CSDN云计算(ID:CSDNcloud) 在任何以数据为中心的工作中,对SQL有深刻的理解都是成功的关键, ...

  2. 数据科学家常见的5个SQL面试问题

    作者 | Alexei Ledenev 翻译 | 天道酬勤,责编 | Carol 出品 | CSDN云计算(ID:CSDNcloud) 在任何以数据为中心的工作中,对SQL有深刻的理解都是成功的关键, ...

  3. 常见的5个SQL面试问题

    在任何以数据为中心的工作中,对SQL有深刻的理解都是成功的关键,尽管这不是工作中最有趣的部分.事实上,除了SELECT FROM WHERE GROUP BY ORDER BY之外,还有更多的SQL方 ...

  4. PayPal Data Scientist 数据科学家面经与工作体验 | 面试笔记

    暑期实习笔试&面试经验 PayPal18年暑期实习笔试主要有三道编程题,难度在leetcode 中等难度左右,我是在线下场做的笔试,通过后可以直接现场终面.在现场面试前一般会提前选岗, 上海这 ...

  5. 33个必须知道的数据分析师SQL面试问题和答案

    33个必须知道的数据分析师SQL面试问题和答案 SQL是一种强大的编程语言,被广泛用于管理和分析数据.如果你想成为一名数据分析师,或者是正在寻找新工作的现有分析师,准备好回答SQL面试问题是很重要的. ...

  6. 独家 | 13大技能助你成为超级数据科学家!(附链接)

    翻译:张睿毅 校对:王威力 本文约4000字,建议阅读8分钟. 本文为你介绍超级数据科学家的13大基本技能. (链接:https://www.linkedin.com/feed/update/ urn ...

  7. 数据科学家是个性感的工作?我信你个鬼!

    数据科学家40%是个吸尘器,40%是个清洁工,剩下20%是个算命的. 作者 | Jingles 译者 | 香槟超新星,责编 | 夕颜 出品 | CSDN(ID:CSDNnews) 根据<哈佛商业 ...

  8. 【数据科学家】什么是数据科学家? 一个关键的数据分析角色和一个利润丰厚的职业...

    数据科学家的角色因行业而异,但有一些共同的技能.经验.教育和培训可以帮助你在数据科学职业生涯中占据一席之地. 什么是数据科学家? 数据科学家是分析数据专家,他们使用数据科学从大量结构化和非结构化数据中 ...

  9. 13大技能助你成为超级数据科学家!(附链接)

    翻译 | 张睿毅 校对 | 王威力 来源 | 数据派THU(ID:DatapiTHU) 好的数据科学家和超级数据科学家有什么区别? 发布在领英上的问题 令人惊讶的是,我得到了许多来自不同行业的顶级数据 ...

最新文章

  1. win10下安装Ubuntu后,启动时没有win10选项解决方法
  2. Windows 驱动开发资源链接
  3. C++类的定义和声明
  4. 时光不老,我们不散!
  5. github/gitee码云文件上传提交记录教程
  6. 单据打印_Excel多功能进销存套表,自动库存单据,查询打印一键操作
  7. An Energy-Efficient Ant-Based Routing Algorithm for Wireless Sensor Networks (无线传感网中基于蚁群算法的能量有效路由)2
  8. 【求知探新】Unity中ShaderLab内存优化
  9. 干货!Kaggle座头鲸识别落下帷幕,冠军方案解读
  10. 全民超神服务器维护,全民超神更新维护公告 更新内容详细一览
  11. c++与unreal 的uc脚本交互
  12. CodeForces - 721E
  13. 关于 LimitedConcurrencyLevelTaskScheduler 的疑惑
  14. ARP协议-路由交换原理5-【HCNA笔记】
  15. 【转】otool 与dylib
  16. 如何开启BBR算法优化ss
  17. CiscoPacketTracer网络模拟
  18. 牛客刷题系列(C++)——详解MGJ8 链表合并(目前内存开销最小)
  19. mathlab saveas figures into a pdf, eps
  20. 买上空气净化器了,真好... ...

热门文章

  1. XML Web services 发现
  2. SAS Viya调研概述
  3. leetcode 506 相对名次
  4. 论文阅读:Deep Image Matting
  5. 为什么可积不一定可导_为什么很多人开车时一定要听歌?老司机:不听歌,要车何用?...
  6. 【深度学习】深度学习门前徘徊——正向传播
  7. python硬件编程_Python学习日记_《Python硬件编程实战》笔记_Mr_Ouyang
  8. 【图像处理】MATLAB:表示与描述
  9. conda命令没找到的处理方案
  10. 中国索马杜林药市场趋势报告、技术动态创新及市场预测