MySQL习题集

格式:

题号+题名+简单思路+code



LeetCode T627: 交换工资

  • CASE语句的用法
# Write your MySQL query statement below
UPDATE salary SET
sex=CASE sex
WHEN "m" THEN "f"
WHEN "f" THEN "m"
END;




LeetCode T175: 组合两个表

  • 外连接
# Write your MySQL query statement below
SELECT Person.FirstName, Person.LastName, Address.City, Address.State
FROM Person LEFT OUTER JOIN Address
ON Person.PersonId=Address.PersonId;




LeetCode T176: 第二高的薪水

  • LIMIT&OFFSET用法
SELECT
(SELECT DISTINCT Salary FROM Employee
ORDER BY Salary DESC LIMIT 1 OFFSET 1)
AS SecondHighestSalary;
  • MAX函数,注意MAX(NULL)=NULL
SELECT MAX(Salary) AS SecondHighestSalary 
FROM Employee
WHERE Salary < (SELECT MAX(Salary) FROM Employee);

拓展:第N大的数



LeetCode T177: 第N高的薪水

  • 自定义函数
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  DECLARE M INT;
  SET M = N-1;
  RETURN (
      # Write your MySQL query statement below.
      SELECT DISTINCT Salary FROM Employee
      ORDER BY Salary DESC
      LIMIT 1 OFFSET M 
  );
END




LeetCode T178: 分数排名

  • 使用别名区分不同表
# Write your MySQL query statement below
SELECT a.Score AS Score, 
(SELECT COUNT(DISTINCT b.score) FROM Scores AS b WHERE b.score >= a.score) AS `Rank`
FROM Scores AS a ORDER BY a.Score DESC;




LeetCode T180: 连续出现的数字

  • 使用交叉连接
# Write your MySQL query statement below
SELECT DISTINCT L1.Num AS ConsecutiveNums
FROM Logs L1, Logs L2, Logs L3
WHERE L1.Id+1=L2.Id AND L2.Id+1=L3.Id
AND L1.Num=L2.Num AND L2.Num=L3.Num;




LeetCode T181: 超过经理收入的员工

  • 别名+子查询的使用
# Write your MySQL query statement below
SELECT a.Name AS Employee
FROM Employee AS a
WHERE a.Salary > (SELECT b.Salary FROM Employee AS b WHERE b.Id=a.ManagerId);




LeetCode T182: 查找重复的电子邮箱

  • 使用GROUP BY+HAVING过滤重复值
# Write your MySQL query statement below
SELECT Email FROM Person
GROUP BY Email HAVING COUNT(Email)>1;
  • 使用内连接来过滤重复值
# Write your MySQL query statement below
SELECT DISTINCT p1.Email
FROM Person AS p1 INNER JOIN Person AS p2
ON p1.Email = p2.Email AND p1.Id != p2.Id;




LeetCode T183: 从不订购的客户

# Write your MySQL query statement below
SELECT Name AS Customers 
FROM Customers
WHERE Id NOT IN (SELECT CustomerId FROM Orders);




LeetCode T184: 部门工资最高的员工

  • 多表内连接
  • 输出的信息分布在多个表中
# Write your MySQL query statement below
SELECT
t3.Name AS Department,
t2.Name AS Employee,
t1.M_s AS Salary
FROM (SELECT DepartmentId AS D_id, MAX(Salary) AS M_s 
FROM Employee GROUP BY DepartmentId) AS t1
INNER JOIN Employee AS t2
ON t1.M_s=t2.Salary AND t1.D_id=t2.DepartmentId
INNER JOIN Department AS t3
ON t1.D_id=t3.Id




LeetCode T185: 部门工资前三高的员工

  • 用COUNT解决求出前三高的表
  • 再连接Department表
# Write your MySQL query statement below
SELECT
t2.Name AS Department,
t1.Name AS Employee,
t1.Salary AS Salary
FROM (SELECT Name, DepartmentId, a.Salary FROM Employee AS a
WHERE (SELECT COUNT(DISTINCT b.Salary) FROM Employee AS b 
WHERE b.DepartmentId=a.DepartmentId AND b.Salary>a.Salary)<3) AS t1
INNER JOIN Department AS t2
ON t1.DepartmentId=t2.Id;




LeetCode T196: 删除重复的电子邮箱

  • 使用内连接找到应该删除的Id
  • 注意当同时进行删除和查询同一张表时需要进行拷贝
# Write your MySQL query statement below
DELETE FROM Person
WHERE Id in 
(SELECT a.Id
FROM (SELECT * FROM Person) AS a
INNER JOIN (SELECT * FROM Person) AS b
ON a.Email=b.Email AND a.Id>b.Id);
  • 使用分组查询找到应该删除的Id
# Write your MySQL query statement below
DELETE FROM Person
WHERE Id NOT IN
(SELECT MIN(Id) FROM (SELECT * FROM Person) AS tmp GROUP BY Email HAVING COUNT(Email)>=1)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值