这是一个系列文章,这个系列的理念是通过一道题,搞懂一类题。涵盖了SQL面试最常考的知识点。搞懂这些题,面试时工作中sql不可能有问题。
文章分为引入问题-完整解析-答案-leetcode题和答案-知识点拓展-BAT等大厂面试真题几个部分。
希望能帮你全方位的弄懂。有问题可以留言,码字不易,写一篇要好几个小时,希望能得到点赞收藏哦
一、问题
下面是某店铺每天的营业额,表名为“日销”。“日期”这一列的数据类型是日期类型(date)。 现在要求找出比前一天销售额高的记录。比如表中2015-01-02的营业额25万,大于2015-01-01的营业额10万。所以返回2015-01-02这一条记录。
二、准备
CREATE TABLE 日销 (
Id int(11) DEFAULT NULL,
日期 date DEFAULT NULL,
营业额 int(11) DEFAULT NULL
);
INSERT INTO 日销 VALUES ('1','2015-01-01', '10');
INSERT INTO 日销 VALUES ('2','2015-01-02', '25');
INSERT INTO 日销 VALUES ('3','2015-01-03', '20');
INSERT INTO 日销 VALUES ('4','2015-01-04', '30');
三、解答
[解题思路]
1.确定题目需求。要求比较前后两天的营业额,如果比前一天营业额高就返回。
2.确定两表连接类型。这里我们看到a表1号的营业额和b表2号的营业额比较......所以这里使用两表连接。如上图,我们以b表为主,所以选择右连接。当你选择保留左表的记录时,转换成左连接。
3.确定主键。a表的2015-01-01和b表的2015-01-02比较,所以a.日期 = b.日期-1,转化下就是DATEDIFF(a.日期, b.日期) = -1。需要返回比前一天营业额大的日期,所以a.营业额 < b.营业额
[代码]
select a.ID, a.日期, a.营业额
from 日销 as a right join 日销 as b
on DATEDIFF(a.日期, b.日期) = 1
where a.营业额 > b.营业额;
[知识点讲解]
Datediff函数,时间类函数:
Datediff语句的用法
DATEDIFF(date1,date2) # 返回date1 - date2的时间差
时间类函数:
- DATE_FORMAT (datetime ,FormatCodes ):转换日期格式
- EXTRACT(unit FROM date):提取日期的指定部分
- DAY、week、year:提取date中的日、周、年等
- CURRENT_X
- 日期加减:DATEDIFF (date1 ,date2 ) 两个日期差; TIMEDIFF(datetime1,datetime2) : 两个日期时间型相减;DATE_ADD(date2 , INTERVAL d_value d_type )在date2中加上日期或时间;DATE_SUB (date2 , INTERVAL d_value d_type )在date2上减去一个时间;
[本题答案]
[题目]
给定一个 Weather
表,编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 Id。
[参考答案]
SELECT
weather.id AS 'Id'
FROM
weather
JOIN
weather w ON DATEDIFF(weather.date, w.date) = 1
AND weather.Temperature > w.Temperature