[Leetcode]database 相关题目的总结
2015-08-23 00:53
495 查看
Combine Two Tables
https://leetcode.com/problems/combine-two-tables/
解题思路:
合并table Person 和Address,其中提示说不管Address里有没有personId,Person里的记录都要显示全部。这是典型的 left join 功能。
知识点:left join (left outer join) 关键字从左表返回所有的行,即使在右表中没有匹配的行
Second Highest Salary
https://leetcode.com/problems/second-highest-salary/
解题思路:
找到第二大的数字。第一反应就是先找到 max,然后从比max小的数里面找个最大的。
知识点:max 聚合函数,不能跟where一起,如果要把聚合函数作为条件,用having
Nth Highest Salary
https://leetcode.com/problems/nth-highest-salary/
解题思路:
写个找第N大数字的函数,先排序再取数字。
知识点: limit N,相当于打印前N条; limit N,m, 打印从第N+1开始的m笔记录。计数从0开始;
limit N-1 是语法错误的,这里只能用 numeric
Rank Scores
https://leetcode.com/problems/rank-scores/
解题思路:
对每一个Score,找出>=它的score的数量,这个数量就是rank
知识点:在内层的select中 s >= Score 表示,对一个Score,每一个s都跟它比较一次。
相当于外面的select是外层for,内嵌的select是内层for的感觉
Employees Earning More Than Their Managers
https://leetcode.com/problems/employees-earning-more-than-their-managers/
解题思路:
看成两个表e1和e2,找到满足e1.ManagerId = e2.Id 并且 e1.Salary > e2.Salary的记录
Duplicate Emails
https://leetcode.com/problems/duplicate-emails/
解题思路:
找到group以后count > 1的记录
知识点:count作为合计函数,无法与where一起使用,所以出现了having
Customers Who Never Order
https://leetcode.com/problems/customers-who-never-order/
解题思路:
先 left join,再找到 CustomerId为空的记录
Department Highest Salary
https://leetcode.com/problems/department-highest-salary/
解题思路:
合并两个table,然后看salary是否是 max的那个
知识点: max
Department Top Three Salaries
https://leetcode.com/problems/department-top-three-salaries/
解题思路:
先join,然后再来个select count,计算比当前salary大的数量,0表是当前salary最大,以此类推,找到 count = 0,1,2的就是了
知识点:count(*) , distinct , 3 > (table_numeric_column)
Delete Duplicate Emails
https://leetcode.com/problems/delete-duplicate-emails/
解题思路:
找到以email Group的最小id,然后删除所有不在这个id 集合里面的所有记录
知识点:not in (table column )
Rising Temperature
https://leetcode.com/problems/rising-temperature/
解题思路:
当成2个表来进行比较。条件满足 DATEDIFF(a.Data, b.Data) = 1 并且 a.温度 > b.温度
知识点:DATEDIFF(a, b) = 1 当a-b=1时;
Trips and Users
https://leetcode.com/problems/trips-and-users/
解题思路:
说不清楚,直接看指令吧
知识点:
round( , 2), sum(), like, count, group, where
https://leetcode.com/problems/combine-two-tables/
解题思路:
合并table Person 和Address,其中提示说不管Address里有没有personId,Person里的记录都要显示全部。这是典型的 left join 功能。
select P.FirstName, P.LastName, A.City, A.State from Person P left outer join Address A on P.PersonId = A.PersonId
知识点:left join (left outer join) 关键字从左表返回所有的行,即使在右表中没有匹配的行
Second Highest Salary
https://leetcode.com/problems/second-highest-salary/
解题思路:
找到第二大的数字。第一反应就是先找到 max,然后从比max小的数里面找个最大的。
select max(Salary) from Employee where Salary < (select max(Salary) from Employee)
知识点:max 聚合函数,不能跟where一起,如果要把聚合函数作为条件,用having
Nth Highest Salary
https://leetcode.com/problems/nth-highest-salary/
解题思路:
写个找第N大数字的函数,先排序再取数字。
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT BEGIN set N = N-1; RETURN ( select distinct Salary from Employee order by Salary desc limit N,1 ); END
知识点: limit N,相当于打印前N条; limit N,m, 打印从第N+1开始的m笔记录。计数从0开始;
limit N-1 是语法错误的,这里只能用 numeric
Rank Scores
https://leetcode.com/problems/rank-scores/
解题思路:
对每一个Score,找出>=它的score的数量,这个数量就是rank
select Score , (select count(*) from (select distinct Score s from Scores) tmp where s >= Score) from Scores order by Score desc
知识点:在内层的select中 s >= Score 表示,对一个Score,每一个s都跟它比较一次。
相当于外面的select是外层for,内嵌的select是内层for的感觉
Employees Earning More Than Their Managers
https://leetcode.com/problems/employees-earning-more-than-their-managers/
解题思路:
看成两个表e1和e2,找到满足e1.ManagerId = e2.Id 并且 e1.Salary > e2.Salary的记录
select e1.Name as Employee from Employee e1, Employee e2 where e1.ManagerId = e2.Id and e1.Salary > e2.Salary
Duplicate Emails
https://leetcode.com/problems/duplicate-emails/
解题思路:
找到group以后count > 1的记录
select Email from Person group by Email having count(Email) > 1
知识点:count作为合计函数,无法与where一起使用,所以出现了having
Customers Who Never Order
https://leetcode.com/problems/customers-who-never-order/
解题思路:
先 left join,再找到 CustomerId为空的记录
select C.Name as Customers from Customers C left join Orders O on C.Id = O.CustomerId where O.CustomerId is NULL
Department Highest Salary
https://leetcode.com/problems/department-highest-salary/
解题思路:
合并两个table,然后看salary是否是 max的那个
select D.Name as Department, E.Name as Employee, E.Salary from Department D, Employee E where D.Id = E.DepartmentId and E.Salary in (Select max(Salary) from Employee where DepartmentId = E.DepartmentId);
知识点: max
Department Top Three Salaries
https://leetcode.com/problems/department-top-three-salaries/
解题思路:
先join,然后再来个select count,计算比当前salary大的数量,0表是当前salary最大,以此类推,找到 count = 0,1,2的就是了
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(*) from (select distinct Salary, DepartmentId from Employee) E2 where E2.Salary > E1.Salary and E1.DepartmentId = E2.DepartmentId)
知识点:count(*) , distinct , 3 > (table_numeric_column)
Delete Duplicate Emails
https://leetcode.com/problems/delete-duplicate-emails/
解题思路:
找到以email Group的最小id,然后删除所有不在这个id 集合里面的所有记录
delete from Person where Id not in (select A.Id from (select min(Id) as Id from Person Group by Email) A)
知识点:not in (table column )
Rising Temperature
https://leetcode.com/problems/rising-temperature/
解题思路:
当成2个表来进行比较。条件满足 DATEDIFF(a.Data, b.Data) = 1 并且 a.温度 > b.温度
select a.Id from Weather as a, Weather as b where DATEDIFF(a.Date, b.Date) = 1 and a.Temperature > b.Temperature
知识点:DATEDIFF(a, b) = 1 当a-b=1时;
Trips and Users
https://leetcode.com/problems/trips-and-users/
解题思路:
说不清楚,直接看指令吧
select t.Request_at Day, round(sum(t.Status like "cancelled_%") / count(*), 2) Rate from Trips t join Users u on t.Client_Id = u.Users_Id where u.Banned = "No" and t.Request_at >="2013-10-01" and t.Request_at <= "2013-10-03" group by t.Request_at
知识点:
round( , 2), sum(), like, count, group, where
相关文章推荐
- Linux权限机制
- Linux下获取帮助
- SpringMVC原理流程图
- Android笔记(十七) Android中的Service
- 判断浮点数是否为0
- Linux文件系统挂载管理
- DICOM:开源DICOM书籍本地版本管理方案
- 使用Git时 SSL certificate problem错误的解决方法
- Linux文件系统
- [LeetCode]Climbing Stairs
- 非计算机专业的伟伯是如何拿到阿里Offer的。励志!
- fdisk分区工具
- 不重启修改计算机名【批处理】
- go get报错 error: RPC failed; result=56, HTTP code =
- [.NET] 使用Json.NET提供依赖注入功能(Dependence Injection)
- [LeetCode]Remove Duplicates from Sorted Array
- Linux--使用fdisk进行磁盘管理
- leetcode 162: Find Peak Element
- 反转整数的每一位(reverse integer)
- 图的广度遍历(BFS)与深度遍历(DFS)