LeetCode DataBase 标签下所有SQL题 【简单】
SQL对于目前数据分析相关的求职很重要,笔试、面试基本主要问的还是SQL。LeetCode SQL题库共有83道题,分为简单、中等、难。故,决定按难度分级把SQL题库刷通。计划用5天时间刷完。#xxx为题号。
#175 组合两个表
Answer:
SELECT FirstName,LastName,City,State
FROM Person P LEFT JOIN Address A
ON P.PersonID = A.PersonID
考察join的使用,left join保留左表所有数据,可满足person表有信息address表为null的题目条件。
# 176 第二高薪水
Answer:
SELECT IFNULL (
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1, 1), NULL) SecondHighestSalary;
先对数据去重,在降序排列,使用分页思想取,再考虑极端情况。
MySQL的isfull 与limit的用法:
1、ifnull(value1,value2):如果value1不为空,结果返回value1。如果value1为空,结果返回value2。
2、Limit x: 返回多少条数据;limit x,y :从第X+1条开始,返回y条;limit y offset x: 跳过 x 条数据,读取 y 条数据
# 181 超过经理收入的员工
Answer:
SELECT a.Name Employee
FROM Employee a JOIN Employee b
ON a.ManagerID = b.ID
AND a.Salary > b.Salary
# 182 查找重复的电子邮箱
Answer:
SELECT Email FROM Person
GROUP BY Email
HAVING COUNT(Email) > 1
SQL优先顺序:from>on>join>where>group by>with>having>order by>select
# 183 从不订购的客户
Answer:
% Method 1
SELECT Name Customers FROM Customers c LEFT JOIN Orders o
ON c.Id = o.CustomerID
WHERE o.Id is NULL
% Method 2: NOT IN
SELECT Name AS Customers FROM Customers
WHERE Id NOT IN (SELECT CustomerId FROM Orders)
# 196 删除重复的电子邮箱
Answer:
DELETE FROM Person
WHERE Id NOT IN (SELECT t.ID FROM (SELECT MIN(Id) ID FROM Person GROUP BY Email)t )
找到要留下的数据的id做临时表,如果要删除的表中数据的id不在临时表里,则删除。
# 197 上升的温度
Answer:
SELECT a.Id FROM Weather a, Weather b
Where a.Temperature > b.Temperature
AND DATEDIFF(a.RecordDate,b.RecordDate) = 1
DATEDIFF('2019-12-31','2019-12-30'); # 1
DATEDIFF('2019-12-30','2019-12-31'); # -1
# 595 大的国家
Answer:
SELECT name,population,area FROM World
WHERE area > 3000000
OR population > 25000000
或者用UNION合并查询。
# 596 超过5名学生的课
Answer:
SELECT class FROM courses c
GROUP BY class
HAVING COUNT(DISTINCT(student))>=5
考虑学生重复选同一门课,根据Note,应当进行去重。
# 620 有趣的电影
Answer:
SELECT * FROM cinema
WHERE description != 'boring'
HAVING id % 2 = 1 # mod(id,2)=1; id&1=1
ORDER BY rating DESC
判断是否为奇数可用“%”,mod(),以及“&”。
&是“与”的意思,按二进制位进行与运算,故id&1=1为奇数,0为偶数。
# 627 交换工资
Answer:
% Method 1: CASE WHEN
UPDATE salary
SET sex = CASE sex
WHEN 'm' THEN 'f'
ELSE 'm'
END;
% Method 2: if(e,v1,v2)
UPDATE salary
SET sex = if(sex='m','f','m')
CASE WHEN 包含简单case函数和case搜索函数,推荐阅读:CASE WHEN 及 SELECT CASE WHEN的用法
IF(expression,v1,v2):如果expression为真,返回v1,否则返回v2。其他IF语句,推荐阅读:SQL中的IF语句
# 1179 重新格式化部门表
Answer:
SELECT id,
SUM(IF(month='Jan',revenue,NULL)) AS Jan_Revenue,
SUM(IF(month='Feb',revenue,NULL)) AS Feb_Revenue,
SUM(IF(month='Mar',revenue,NULL)) AS Mar_Revenue,
SUM(IF(month='Apr',revenue,NULL)) AS Apr_Revenue,
SUM(IF(month='May',revenue,NULL)) AS May_Revenue,
SUM(IF(month='Jun',revenue,NULL)) AS Jun_Revenue,
SUM(IF(month='Jul',revenue,NULL)) AS Jul_Revenue,
SUM(IF(month='Aug',revenue,NULL)) AS Aug_Revenue,
SUM(IF(month='Sep',revenue,NULL)) AS Sep_Revenue,
SUM(IF(month='Oct',revenue,NULL)) AS Oct_Revenue,
SUM(IF(month='Nov',revenue,NULL)) AS Nov_Revenue,
SUM(IF(month='Dec',revenue,NULL)) AS Dec_Revenue
FROM Department
GROUP BY id