这是一个系列文章,这个系列的理念是
通过一道题,搞懂一类题。涵盖了
SQL面试最常考的知识点。搞懂这些题,
面试时工作中sql不可能有问题。文章分为引入问题-完整解析-答案-leetcode题和答案-知识点拓展-BAT等大厂面试真题几个部分。
希望能帮你全方位的弄懂。有问题可以留言,码字不易,写一篇要好几个小时,希望能得到点赞收藏哦
一、问题
X 市建了一个新的体育馆,每日人流量信息被记录在这三列信息中:序号 (id)、日期 (visit_date)、 人流量 (people)。
请编写一个查询语句,找出人流量的高峰期。高峰期时,至少连续三行记录中的人流量不少于100。
二、准备
create table 日人流量表 (
序号 float,
日期 date,
人流量 int(20));
insert into 日人流量表 values
(1, '2017-01-01', 10),
(2, '2017-01-02',109),
(3, '2017-01-03', 150),
(4, '2017-01-04', 99),
(5, '2017-01-05', 145),
(6, '2017-01-06', 1455),
(7, '2017-01-07', 199),
(8, '2017-01-08', 188);
三、解答
[思路讲解]
我们在
数据蛙图解SQL-连续出现N次类问题这篇文章里讲解过,连续类问题使用多表连接解决。
1.明确题目要求。
连续3行说明3天的日期递增,
人流量不少于100说明这连续3天的人流量都大于等于100。使用3表自连接。
select *
from 日人流量表 a,
日人流量表 b,
日人流量表 c,
where a.人流量 > 100
and b.人流量 > 100
and c.人流量 > 100
2.确定连接主键 连续3天,所以可以用DATEDIFF(a.日期 , b.日期) = -1 and DATEDIFF(b.日期 , c.日期) = -1。
SELECT *
FROM 日人流量表 as a,
日人流量表 as b,
日人流量表 as c
where DATEDIFF(a.日期 , b.日期) = -1
and DATEDIFF(b.日期 , c.日期) = -1
and a.`人流量` >= 100
and b.`人流量` >= 100
and c.`人流量` >= 100
3.代码与逻辑修正 我们发现输出结果与我们理想状态有点不同。问题在于这里使用的是左连接,默认a表为最小日期,所以自连接会将3行转换为1行,这一行按照日期从小到大排列。现在要保证3行, 我们再将 a 的 日期 设为三个连续值中中间值和最大值,可以得到全部的连续 3 个值 。
SELECT distinct a.*
FROM 日人流量表 as a,
日人流量表 as b,
日人流量表 as c
where ((a.日期 = b.日期-1 and b.日期+1 = c.日期) or
(a.日期-1 = b.日期 and a.日期+1 = c.日期) or
(a.日期1 = c.日期 and c.日期-1 = b.日期))
and (a.人流量>=100 and b.人流量>=100 and c.人流量>=100)
order by a.日期;
[代码]
SELECT distinct a.*
FROM 日人流量表 as a,
日人流量表 as b,
日人流量表 as c
where ((a.日期 = b.日期-1 and b.日期+1 = c.日期) or
(a.日期-1 = b.日期 and a.日期+1 = c.日期) or
(a.日期1 = c.日期 and c.日期-1 = b.日期))
and (a.人流量>=100 and b.人流量>=100 and c.人流量>=100)
order by a.日期;
[知识点讲解]
[什么是视图]
视图(view)是一种
虚拟存在的表,是一个逻辑表,本身并不包含数据。
作为一个select语句保存在数据字典中的。通过视图,可以展现基表的部分数据;视图数据来自定义视图的查询中使用的表,使用视图动态生成。
基表:用来创建视图的表叫做基表base table
[视图的优点]
- 简单 :使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。
- 安全 :使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。
- 数据独立 :一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。
总而言之,使用视图的大部分情况是为了
保障数据安全性,提高查询效率。
[语法]
- 视图的创建
sql create view <视图名称>[(column_list)] as select语句
- 使用show create view语句查看视图信息
sql show create view <视图名称>;
- 视图一旦创建完毕,就可以像一个普通表那样使用, 视图主要用来查询
sql select * from view_name;
- 视图的更改
- CREATE OR REPLACE VIEW语句修改视图
- ALTER语句修改视图
- DML操作更新视图