LeetCode(SQL) 难度-简单

LeetCode(SQL) 难度-简单

题目1:编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary)(两个字段ID,Salary)
思路:将薪资降序排列,利用limit选取第二个
Select distinct Salary SecondHighestSalary 
from Employee
order by Salary desc
limit 1,1##从第2行开始,要1条记录

注:然而如果没有这样的第二最高工资,这个解决方案将被判断为 “错误答案”,因为本表可能只有一项记录。为了克服这个问题,我们可以将其作为临时表,因为临时表会返回null值。

##利用临时表
Select (
  Select distinct Salary SecondHighestSalary 
  from Employee
  order by Salary desc
  limit 1,1##从第2行开始,要1条记录
) SecondHighestSalary 
题目2:组合两个表,编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的FirstName, LastName, City, State 信息

表1: Person
PersonId :主键
列名:PersonId ;FirstName ;LastName

表2: Address
AddressId 是主键
列名:AddressId ;PersonId;City ;State

思路:进行左连接 from 表名1 left join 表名2 on 条件
Select FirstName, LastName, City, State
from Person left  join Address
on Person.PersonId = Address.PersonId
题目3: 超过经理收入的员工,给定 Employee 表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。

注:Employee 表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id
在这里插入图片描述

思路:找出ManagerId所对应的id,然后比较薪资
Select a.name Employee
from Employee as a join Employee as b
 on a.ManagerId = b.Id AND a.Salary > b.Salary
题目4:查找重复的电子邮箱
SELECT distinct Email 
from Person
group by Email 
having count(Email) >1

注: 在SQL语句中,where语句的执行顺序先于group by,group by语句的执行顺序先于having

1. group by: 对select查询出来的结果按照某个字段或者表达式进行分组,获得一组组的集合,然后从每组中取出一个指定字段或者表达式的值,group by 和聚合函数一块用,在group by的SQL语句中,select中返回的字段,必须包含在group by语句的后面,作为分组的依据,而且字段包含在聚合函数中。
2. having: 用于对where和group by查询出来的分组经行过滤,查出满足条件的分组结果。它是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,having只能用于group by,having 子句中的每一个元素也必须出现在select列表中,having语句可以使用聚合函数。

题目5:某网站包含两个表,Customers 表和 Orders 表。编写一个 SQL 查询,找出所有从不订购任何东西的客户。

在这里插入图片描述
在这里插入图片描述

思路:找出编码不在CustomerID中的
Select name Customers
from Customers
where ID not in (select CustomerId from Orders)
题目6:删除重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个
思路:定义两个相同表找出相同的电子邮箱,ID不能一样
delete p1
from Person p1,Person p2
where p1.Email = p2.Email and p1.ID>p2.ID
题目7:给定一个 Weather 表,编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 Id。

在这里插入图片描述

select a1.Id as id
from Weather a1 join Weather a2
on  DATEDIFF(a1.RecordDate, a2.RecordDate) = 1 and a1.Temperature>a2.Temperature 
#注:DATEDIFF()表示温度差
题目8:某城市开了一家新的电影院,吸引了很多人过来看电影。该电影院特别注意用户体验,专门有个 LED显示板做电影推荐,上面公布着影评和相关电影描述。作为该电影院的信息部主管,您需要编写一个 SQL查询,找出所有影片描述为非 boring (不无聊) 的并且 id 为奇数 的影片,结果请按等级 rating 排列。

在这里插入图片描述

select id,movie,description,rating
from cinema
where description!='boring'  and mod(id,2) =1##取余
order by rating desc
题目9: 交换工资.给定一个 salary 表,如下所示,有 m = 男性 和 f = 女性 的值。交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求只使用一个更新(Update)语句,并且没有中间的临时表。

在这里插入图片描述

update salary
set sex = case sex 
when 'm' then 'f' else 'm'
end
update salary set sex=IF(sex='f','m','f')
题目10:大的国家
select name, population , area  
from World
where area>3000000 or population >25000000
题目11:有一个courses 表 ,有: student (学生) 和 class (课程),请列出所有超过或等于5名学生的课.
select class
from courses
group by class
having count(DISTINCT student)>=5
题目12:重新格式化的部门数据

在这里插入图片描述在这里插入图片描述注:结果表有 13 列 (1个部门 id 列 + 12个月份的收入列)

SELECT id,
SUM(CASE `month` WHEN 'Jan' THEN revenue END) Jan_Revenue,
SUM(CASE `month` WHEN 'Feb' THEN revenue END) Feb_Revenue,
SUM(CASE `month` WHEN 'Mar' THEN revenue END) Mar_Revenue,
SUM(CASE `month` WHEN 'Apr' THEN revenue END) Apr_Revenue,
SUM(CASE `month` WHEN 'May' THEN revenue END) May_Revenue,
SUM(CASE `month` WHEN 'Jun' THEN revenue END) Jun_Revenue,
SUM(CASE `month` WHEN 'Jul' THEN revenue END) Jul_Revenue,
SUM(CASE `month` WHEN 'Aug' THEN revenue END) Aug_Revenue,
SUM(CASE `month` WHEN 'Sep' THEN revenue END) Sep_Revenue,
SUM(CASE `month` WHEN 'Oct' THEN revenue END) Oct_Revenue,
SUM(CASE `month` WHEN 'Nov' THEN revenue END) Nov_Revenue,
SUM(CASE `month` WHEN 'Dec' THEN revenue END) Dec_Revenue
FROM Department
GROUP BY id;
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值