作者 | 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:使用IFNULL,OFFSET

  • IFNULL(表达,alt):如果为null,则ifnull()返回指定的值,否则返回期望的值。 如果没有第二高的薪水,我们会使用它返回null。
  • OFFSET:offset与ORDERBY子句一起使用可忽略指定的前n行。这会很有用,因为你希望获得第二行(第二高的薪水)
SELECTIFNULL((SELECT DISTINCT SalaryFROM EmployeeORDER BY Salary DESCLIMIT 1 OFFSET 1), null) as SecondHighestSalaryFROM EmployeeLIMIT 1

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

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

SELECT MAX(salary) AS SecondHighestSalaryFROM EmployeeWHERE salary != (SELECT MAX(salary) FROM Employee)

问题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)
SELECTCASEWHEN((SELECT MAX(id) FROM seat)%2 = 1) AND id = (SELECT MAX(id) FROM seat) THENidWHEN id%2 = 1 THEN id + 1ELSE id - 1END AS id, studentFROM seatORDER BY id

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

sql中ifnull不生效_数据科学家常见的5个SQL面试问题相关推荐

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

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

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

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

  3. 西雅图治安_数据科学家对西雅图住宿业务的分析

    西雅图治安 介绍 (Introduction) Airbnb provides an online platform for hosts to accommodate guests with shor ...

  4. 张同学的 SQL中对材料报价单的数据权限进行操作 (如列转行 行转列的处理) 学习一下....

    SQL中对材料报价单的数据权限进行操作 (如列转行 行转列的处理) --可以直接放到查询分析器执行 --判断测试表TmpTCIQuote是否有存在 不存在则创建 if NOT exists (sele ...

  5. 边际概率条件概率_数据科学家解释的边际联合和条件概率

    边际概率条件概率 Probability plays a very important role in Data Science, as Data Scientist regularly attemp ...

  6. 快速近似最近邻算法_数据科学家指南,以选择最佳近似最近邻算法

    快速近似最近邻算法 by Braden Riggs and George Williams (gwilliams@gsitechnology.com) Braden Riggs和George Will ...

  7. ipynb是什么文件_数据科学家的神器:为什么大家都用Kaggle?

    全文共2451字,预计学习时长7分钟 图源:viaboxx 学习数据科学绝非易事.能找到一个可以分享代码.数据和想法的社区对我们的学习大有裨益,有一个地方汇聚了这些特质,那就是Kaggle. 我在大学 ...

  8. 数据探查_数据科学家,开始使用探查器

    数据探查 Data scientists often need to write a lot of complex, slow, CPU- and I/O-heavy code - whether y ...

  9. 数据科学家 数据工程师_数据科学家实际上赚了多少钱?

    数据科学家 数据工程师 目录 (Table of Contents) Introduction介绍 Junior Data Scientist初级数据科学家 Mid-Level Data Scient ...

最新文章

  1. ioS html的转义
  2. 根据后序和中序求二叉树的先序
  3. 程序员常用网站收藏[定期更新]——csdn博客
  4. 如何在生产中检测和诊断慢速代码
  5. 开氏温度与摄氏度换算_【油品小知识】你不知道的“柴油密度”与“温度”的故事...
  6. Vue同级组件数据传递
  7. SQL Server 之 修改时不允许保存更改
  8. 独家对话阿里巴巴副总裁华先胜: 基础科研的突破,是大浪的源头
  9. AutoCAD2012从入门到精通中文视频教程 第20课 移动与旋转(个人收藏)
  10. 用ps轻松更改嘴唇颜色
  11. [转]file_get_contents(php://input)
  12. awgn信道c语言程序,关于awgn信道的程序求解~!
  13. Python自学笔记系列一——认识python
  14. SpringCloud[04]Ribbon负载均衡服务调用
  15. Mac磁盘工具无法将APFS硬盘转化为txFAT格式的解决办法
  16. 威纶通屏幕(HMI)开发进阶教程四:通过PLC控制,使宏指令跳转到不同的窗口
  17. 三星借力北京奧運東風
  18. 期刊介绍|中科院一区8+期刊,影响因子飞涨,国人友好,明显扩刊趋势!
  19. 【转载】尼康D90购机注意事项
  20. c语言64位long多少字节,64位操作系统下,关于int和long占用字节数同为4问题

热门文章

  1. 为什么华为在发布会不提鸿蒙,华为又要开发布会?这次没有手机,鸿蒙系统要当主角!...
  2. postman全局变量操作
  3. windows下python依赖包_windows下安装python拓展包
  4. jsoncpp空数组
  5. 计算机病毒的八个特征,计算机病毒的五个特征- 1:.单项选择题(8)
  6. linux快速还原oracle,linux下恢复误删除oracle的数据文件
  7. jsonb 查询_如何使用IN运算符查询jsonb数组
  8. mysql gbk支持_让MYSQL支持GBK
  9. mysql设置text字段为not null,并且没有默认值,插入报错:doesn't have a default value
  10. git checkout和git reset的一些区别以及配置git简写命令