這是一個系列文章,這個系列的理念是
通過一道題,搞懂一類題。涵蓋了
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操作更新視圖