哪些网站可以做图片链接/什么是网络推广

作者 | Alexei Ledenev
翻译 | 天道酬勤,责编 | Carol
出品 | CSDN云计算(ID:CSDNcloud)
在任何以数据为中心的工作中,对SQL有深刻的理解都是成功的关键,尽管这不是工作中最有趣的部分。事实上,除了SELECT FROM WHERE GROUP BY ORDER BY之外,还有更多的SQL方法。你知道的功能越多,操作和查询所需的内容就越容易。
作者希望在本文中学习和交流以下两件事:
1)学习和教一些基本功能以外的SQL函数
2)探讨一些SQL面试练习问题
* 本文中的问题仅来自Leetcode
编写一个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)

+----+---------+| 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
+---------+------------------+------------------+| 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是计算两个日期之间的差,用于确保我们将今天的温度与昨天的温度进行比较。
SELECT DISTINCT a.IdFROM Weather a, Weather bWHERE a.Temperature > b.TemperatureAND DATEDIFF(a.Recorddate, b.Recorddate) = 1

+----+-------+--------+--------------+| 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)

+---------+---------+| 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
以上就是所有的解决方法,如果有不清楚的地方或其他意见,欢迎评论告诉我们!
推荐阅读:
从Kubernetes安全地访问AWS服务,告诉你多云场景下如何管理云凭据!
解析云原生与云计算本质区别,别再傻傻分不清楚了!Go 大败!Google 宣布 Fuchsia 终端开发只支持 C/C++/Dart
干货!从0到1教你打造一个令人上瘾的聊天机器人?
游戏之道
真实版“删库跑路”?程序员蓄意破坏线上生产环境!
真香,朕在看了!点击“”,参与调查