天天看点

视图的增删改会影响基表吗_leetcode题库-sql练习精讲系列--十四、连续出现N类问题-讲解视图...

这是一个系列文章,这个系列的理念是

通过一道题,搞懂一类题

。涵盖了

SQL面试最常考的知识点

。搞懂这些题,

面试时工作中sql不可能有问题。

文章分为引入问题-完整解析-答案-leetcode题和答案-知识点拓展-BAT等大厂面试真题几个部分。

希望能帮你全方位的弄懂。有问题可以留言,码字不易,写一篇要好几个小时,希望能得到点赞收藏哦

一、问题

X 市建了一个新的体育馆,每日人流量信息被记录在这三列信息中:序号 (id)、日期 (visit_date)、 人流量 (people)。

请编写一个查询语句,找出人流量的高峰期。高峰期时,至少连续三行记录中的人流量不少于100。

视图的增删改会影响基表吗_leetcode题库-sql练习精讲系列--十四、连续出现N类问题-讲解视图...

二、准备

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
           
视图的增删改会影响基表吗_leetcode题库-sql练习精讲系列--十四、连续出现N类问题-讲解视图...
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

[视图的优点]

  1. 简单 :使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。
  2. 安全 :使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。
  3. 数据独立 :一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

总而言之,使用视图的大部分情况是为了

保障数据安全性,提高查询效率

[语法]

  • 视图的创建

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操作更新视图