天天看點

視圖的增删改會影響基表嗎_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操作更新視圖