leetcode上的数据库题目(Easy)
2016-01-15
leetcode 上的数据库题目不是很多,大都比较简单,先选几道easy级别的题目来开始我的博客之旅吧。SQL语句都是支持MySQL的。
***
##175. Combine Two Tables
Table: Person
Column Name | Type |
---|---|
PersonId | int |
FirstName | varchar |
LastName | varchar |
PersonId is the primary key column for this table.
Table: Address
Column Name | Type |
---|---|
AddressId | int |
PersonId | int |
City | varchar |
State | varchar |
AddressId is the primary key column for this table.
Write a SQL query for a report that provides the following information for each person in the Person table, regardless if there is an address for each of those people:
FirstName, LastName, City, State
###175解答 这道题目考察连接的问题,不做细描述,直接给出答案
# MySQL
select a.FirstName,a.LastName,b.City,b.State
from Person a left join Address b
on a.PersonId=b.PersonId
176. Second Highest Salary
Write a SQL query to get the second highest salary from the Employee
table.
Id | Salary |
---|---|
1 | 100 |
2 | 200 |
3 | 300 |
For example, given the above Employee table, the second highest salary is 200
. If there is no second highest salary, then the query should return null
.
###176解答 这道题目考察的是是排序外加分页的功能,见答案
# MySQL
select IFNULL(
(select e.Salary from Employee e
group by e.Salary order by e.Salary desc limit 1, 1)
, NULL) SecondHighestSalary;
##181. Employees Earning More Than Their Managers
The Employee
table holds all employees including their managers. Every employee has an Id, and there is also a column for the manager Id.
Id | Name | Salary | ManagerId |
---|---|---|---|
1 | Joe | 70000 | 3 |
2 | Henry | 80000 | 4 |
3 | Sam | 60000 | NULL |
4 | Max | 90000 | NULL |
Given the Employee
table, write a SQL query that finds out employees who earn more than their managers. For the above table, Joe is the only employee who earns more than his manager.
Employee |
---|
Joe |
###181解答 这道题目考查的是一张表关联自己。
# MySQL
select a.Name from Employee a
inner join Employee b on a.ManagerId=b.Id
and a.Salary>b.Salary
##182. Duplicate Emails
Write a SQL query to find all duplicate emails in a table named Person
.
Id | |
---|---|
1 | a@b.com |
2 | c@d.com |
3 | a@b.com |
For example, your query should return the following for the above table:
a@b.com |
Note: All emails are in lowercase.
###182解答
这道题目考查的having 的使用。
# MySQL
select Email from Person
group by Email having count(*)>1
##183. Customers Who Never Order
Suppose that a website contains two tables, the Customers
table and the Orders
table. Write a SQL query to find all customers who never order anything.
Table: Customers
.
Id | Name |
---|---|
1 | Joe |
2 | Henry |
3 | Sam |
4 | Max |
Table: Orders
.
Id | CustomerId |
---|---|
1 | 3 |
2 | 1 |
Using the above tables as example, return the following:
Customers |
---|
Henry |
Max |
###183解答 这道题目考查的左连接匹配不上的情况。
# MySQL
select a.name from Customers a
left join Orders b on a.id =b.CustomerId
where b.id is null
##196. Delete Duplicate Emails
Write a SQL query to delete all duplicate email entries in a table named Person
, keeping only unique emails based on its smallest Id.
Id | |
---|---|
1 | john@example.com |
2 | bob@example.com |
3 | john@example.com |
Id is the primary key column for this table.
For example, after running your query, the above Person
table should have the following rows:
Id | |
---|---|
1 | john@example.com |
2 | bob@example.com |
###196解答 通过group by 聚合的子查询得到留下来的结果,删掉其他就对了。
# MySQL
delete a from Person a
inner join
(select Email,min(Id) Id from Person group by Email) b
on a.Email=b.Email and a.Id<>b.Id
##197. Rising Temperature
Given a Weather
table, write a SQL query to find all dates’ Ids with higher temperature compared to its previous (yesterday’s) dates.
Id(INT) | Date(DATE) | Temperature(INT) |
---|---|---|
1 | 2015-01-01 | 10 |
2 | 2015-01-02 | 25 |
3 | 2015-01-03 | 20 |
4 | 2015-01-04 | 30 |
For example, return the following Ids for the above Weather table:
Id |
---|
2 |
4 |
###197解答
这道题目主要是join时候做一个日期的运算,考察日起计算的函数
# MySQL
select b.Id from Weather a inner join Weather b
on DATE_ADD(a.Date,INTERVAL 1 DAY)=b.Date and a.Temperature<b.Temperature