LeetCode-数据库-MySQL题解(1-10)

题目来自于leetcode,数据库模块,可以一起练习:LeetCode-database-OJ

175. 组合两个表

表1: Person

列名 类型
PersonId int
FirstName varchar
LastName varchar

PersonId 是上表主键
表2: Address

列名 类型
AddressId int
PersonId int
City varchar
State varchar

AddressId 是上表主键
编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
FirstName, LastName, City, State

SELECT Person.FirstName,Person.LastName,Address.City,Address.State
FROM Person LEFT JOIN Address ON Person.PersonId = Address.PersonId;

176. 第二高的薪水

编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。

Id Salary
1 100
2 200
3 300

例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。

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

177. 第N高的薪水

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  SET N = N - 1;  
  IF N < 0 THEN  
  RETURN NULL;  
  ELSE
  RETURN (      
      # Write your MySQL query statement below.      
      SELECT IFNULL((SELECT DISTINCT Salary      
      FROM Employee       
      ORDER BY Salary DESC 
      LIMIT N,1),null) SecondHighestSalary  
  );
  END IF;
END;

178. 分数排名

编写一个 SQL 查询来实现分数排名。
如果两个分数相同,则两个分数排名(Rank)相同。请注意,平分后的下一个名次应该是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。

Id Score
1 3.50
2 3.65
3 4.00
4 3.85
5 4.00
6 3.65

例如,根据上述给定的 Scores 表,你的查询应该返回(按分数从高到低排列):

Score Rank
4.00 1
4.00 1
3.85 2
3.65 3
3.65 3
3.50 4
SELECT s1.Score,
   (SELECT COUNT(DISTINCT s2.Score) 
    FROM Scores s2 
    WHERE s2.Score>=s1.Score ) as `Rank`
FROM Scores s1
ORDER BY s1.Score DESC;

180. 连续出现的数字

编写一个 SQL 查询,查找所有至少连续出现三次的数字。

Id Num
1 1
2 1
3 1
4 2
5 1
6 2
7 2

例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。

ConsecutiveNums
1
SELECT DISTINCT num as ConsecutiveNums
FROM ( SELECT DISTINCT num, count(*) `count`
       FROM ( SELECT id, num, (row_number() over (ORDER BY id) 
              - row_number() over (partition by num ORDER BY id)) as orde
              FROM Logs) as Logs2
       GROUP BY num, orde) as Logs3
WHERE Logs3.`count`>=3;

181. 超过经理收入的员工

Employee 表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。

Id Name Salary ManagerId
1 Joe 70000 3
2 Henry 80000 4
3 Sam 60000 NULL
4 Max 90000 NULL

给定 Employee 表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。

Employee
Joe
SELECT e1.Name as Employee 
FROM Employee e1 LEFT JOIN Employee e2 ON e1.ManagerId = e2.Id
WHERE e1.Salary>e2.Salary;

182. 查找重复的电子邮箱

编写一个 SQL 查询,查找 Person 表中所有重复的电子邮箱。

Id Email
1 [email protected]
2 [email protected]
3 [email protected]

根据以上输入,你的查询应返回以下结果:

Email
[email protected]
SELECT Email
FROM Person
GROUP BY Email
HAVING COUNT(Email)>1;

183. 从不订购的客户

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

Id Name
1 Joe
2 Henry
3 Sam
4 Max

Orders 表:

Id CustomerId
1 3
2 1
SELECT c.`Name` as Customers
FROM Customers c LEFT JOIN Orders o ON c.id = o.CustomerId
WHERE o.Id IS NULL;

184. 部门工资最高的员工

Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。

Id Name Salary DepartmentId
1 Joe 70000 1
2 Henry 80000 2
3 Sam 60000 2
4 Max 90000 1

Department 表包含公司所有部门的信息。

Id Name
1 IT
2 Sales

编写一个 SQL 查询,找出每个部门工资最高的员工。例如,根据上述给定的表格,Max 在 IT 部门有最高工资,Henry 在 Sales 部门有最高工资。

Department Employee Salary
IT Max 90000
Sales Henry 80000
SELECT d.`name` as Department, e.`name` as Employee, Salary
FROM Employee e JOIN Department d ON e.DepartmentId = d.Id
WHERE (e.DepartmentId, e.Salary) IN (
    SELECT DepartmentId, MAX(Salary)
    FROM Employee
    GROUP BY DepartmentId);

185. 部门工资前三高的所有员工

Employee 表包含所有员工信息,每个员工有其对应的工号 Id,姓名 Name,工资 Salary 和部门编号 DepartmentId 。

Id Name Salary DepartmentId
1 Joe 85000 1
2 Henry 80000 2
3 Sam 60000 2
4 Max 90000 1
5 Janet 69000 1
6 Randy 85000 1
7 Will 70000 1

Department 表包含公司所有部门的信息。

Id Name
1 IT
2 Sales

编写一个 SQL 查询,找出每个部门获得前三高工资的所有员工。例如,根据上述给定的表,查询结果应返回:

Department Employee Salary
IT Max 90000
IT Randy 85000
IT Joe 85000
IT Will 70000
Sales Henry 80000
Sales Sam 60000

解释:
IT 部门中,Max 获得了最高的工资,Randy 和 Joe 都拿到了第二高的工资,Will 的工资排第三。销售部门(Sales)只有两名员工,Henry 的工资最高,Sam 的工资排第二。

SELECT d.`Name` as Department, e1.`Name` as Employee, e1.Salary
FROM Employee e1 JOIN Department d ON e1.DepartmentId = d.Id
WHERE 3 > ( SELECT COUNT(DISTINCT e2.Salary)        
            FROM Employee e2        
            WHERE e2.Salary > e1.Salary AND e1.DepartmentId = e2.DepartmentId);

11 - 20 题

11 - 20题

猜你喜欢

转载自blog.csdn.net/weixin_43845524/article/details/106480450
今日推荐