💾 LeetCode 数据库部分题目
175. 组合两个表
编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
FirstName, LastName, City, State
需要保留Person表中未连接的数据
1 | select FirstName,LastName,City,State |
176. 第二高的薪水
方法一:使用聚集函数
1 | select max(Salary) SecondHighestSalary |
方法二:使用 limit
1 | select ( |
limit x offset y
:跳过 y 条数据查询 x 条数据
177. 第N高的薪水
1 | CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT |
178. 分数排名
我们可以先提取出大于等于X的所有分数集合H,将H去重后的元素个数就是X的排名。比如你考了99分,但最高的就只有99分,那么去重之后集合 H 里就只有99一个元素,个数为1,因此你的Rank为1。
1 | select s1.Score, count(distinct(s2.Score)) Rank |
180. 连续出现的数字
至少连续出现三次的数字则必定id连续三次或三次以上
1 | select distinct a.Num as ConsecutiveNums |
181. 超过经理收入的员工
自连接,第一张表的 Managerid = 第二张表的 id
1 | select Name as Employee |
182. 查找重复的电子邮箱
利用 group by - having
1 | select Email from Person |
183. 从不订购的客户
1 | select c.Name as Customers from Customers c |
184. 部门工资最高的员工
1 | select |
185. 部门工资前三高的所有员工
先定义找出前三高薪水的查询语句,即不超过三个值比这个薪水大。
1 | SELECT e1.Salary |
举个栗子:
当 e1 = e2 = [4,5,6,7,8]e1.Salary = 4,e2.Salary 可以取值 [5,6,7,8],count(DISTINCT e2.Salary) = 4
e1.Salary = 5,e2.Salary 可以取值 [6,7,8],count(DISTINCT e2.Salary) = 3
e1.Salary = 6,e2.Salary 可以取值 [7,8],count(DISTINCT e2.Salary) = 2
e1.Salary = 7,e2.Salary 可以取值 [8],count(DISTINCT e2.Salary) = 1
e1.Salary = 8,e2.Salary 可以取值 [],count(DISTINCT e2.Salary) = 0
最后 3 > count(DISTINCT e2.Salary),所以 e1.Salary 可取值为 [6,7,8],即集合前 3 高的薪水
再把两个表连接,获得各个部门工资前三高的员工
1 | select d.Name as Department, |
196. 删除重复的电子邮箱
方法一:
1 | delete from Person |
需要套一层临时表,因为查询语句的输出不能作为更新语句的输入
方法二:
1 | # 如果用了表别名,delete后要加别名 |
197. 上升的温度
MySQL 使用 DATEDIFF 来比较两个日期类型的值。
1 | select w1.Id |