1. sql語言基礎(2)
通過as給欄位起一個別名
select card as 身份證,name as 姓名,sex as 性別;
別名的as可以進行省略
select card 身份證,name 姓名,sex 性別;
通過表名as 別名 給表起一個別名 as也可以省略
student表別名為s
select * from student as s;
student表別名為s (省略as)
student * from student s;
通過select distinct 欄位名,欄位名 from 表名 來過濾select查詢結果中的重復記錄
查詢學生表性別並進行去重
select distinct sex from student;
where後面跟一個條件,實現有選擇的查詢
select * from 表名 where 條件
查詢students表中學號stundentNo 等於001的記錄
select * from studnets where studnetNo = '001';
查詢students表中年齡age等於30的姓名和班級
select name,class from student where age = 30;
█ select 後面的*或者是欄位名,控制了控制了返回什麼樣的欄位(列);
█ select 中 where子句,控制l了返回什麼樣的記錄(行)
█ where後面職稱多種運算符,進行條件的處理
比較運算
邏輯運算
模糊查詢
范圍查詢
空判斷
等於 =
大於 >
大於等於 >=
小於 <
小於等於 <=
不等於 !=或<>
查詢student表中30歲及30歲以下的學生記錄
select * form students age > 30;
查詢hometown不在北京的學生記錄
select * from students where hometown != '北京';
select * from students where hometown <> '北京';
查詢class班級為1班以外的學生記錄
select * from students where class != '1班';
查詢age年齡大於25的學生姓名和性別
select name,sex from studnets where age >25 and;
and(與)
and有兩個條件
格式:條件1 and 條件2
兩個條件必須同時滿足
查詢年齡小於30,並且性別為女的記錄
select * from students where age > 30 and sex = '女';
or(或)
or有兩個條件
格式:條件1 and 條件2
兩個條件滿足一個即可
查詢性別為女或者班級為1班的學生記錄
select * from studnets where sex='女' or class = '1班';
not(非)
not只有一個條件
not 條件
如果條件為滿足,not後變為不滿足。如果條件滿足,not後變為滿足
查詢hometown老家非'天津'的學生記錄
select * from studnet where not hometown = 『天津』;
select * from students where hometown != '天津';
查詢hometown老家是河南或河北的學生記錄
select * from studnets hometown = '河南' or '河北';
查詢班級為1班,並且家是北京的學生記錄
select * from students class = '1班' and hometown = '北京'
查詢年齡非30的歲的學生記錄
select * from students not age = 30;
select *from students age ! = 30;
like實現模擬查詢,%代表任意多個字元,_代表任意一個字元
欄位名like'字元%'
指定字元開始,後面任意多個字元
欄位名_'字元_'
指定字元開始,後面任意一個字元
查詢姓名中已孫開頭的學生記錄
select * from students where name like '孫%';
查詢姓名以孫開頭,且名字只有一個字的學生記錄
select * from students where name like '孫_';
查詢姓白且年齡大於30的學生記錄
select * from studnets where name lile '白%' and age > 30;
in(值,值,值)
非連續范圍查找
between 值 and 值
連續范圍查找
查詢假象是北京或上海或廣東的學生記錄
select * from students where hometown = '北京' or hometown = '上海' or hometown = '廣東'
select * from students where hometown in ('北京','上海','廣東');
查詢年齡為25至30的學生記錄
select * from student where age >=25 and age <= 30;
select * from students where age between 25 and 30;
select * from students age in (20,25,30) and sex ='女';
select * from students not age between 25 and 30;
空判斷
null 與' '是不同的
null 代表什麼都沒有,是不佔用存儲空間的 null不能用比較運算符去判斷
is null 判斷是否為null
is not null 判斷是否不為null
' ' 代表長度為0的字元串,是佔用存儲空間的
判斷空值 is null
查詢身份證為null的學生記錄
select * from students where card is null;
判斷非空值 is not null
查詢身份證非null的學生記錄
select * from students where card is not null;
查詢身份證為空的學生記錄
select * from students where card is null or card ='';
查詢身份證不為空的學生記錄
select * from students where card is not null and card != '';
把年齡為25,並且姓名為孫尚香的學生,修改班級為2班
update students class = '2班' where age = 25 and name = '孫尚香';
刪除班級為1班,且年齡大於30的學生記錄
delect from students where age > 30 and calss ='1班';
2. 【模擬環境】SQL注入時如何繞過逗號和百分號
UNION 跟 UNION ALL 是交集跟並集的寫法
select * from a union select * from b --這種是A表與B表結果的交集寫法,合並表,沒有重復行;
select * from a union all select * from b --這種是A表與B表結果的並集寫法 有重復行;
a表和b表結構一樣,合並兩個表,沒有重復行,如果要重復行用union all
3. SQL sum函數一對多場景,消除笛卡爾積
貸款表
還款表
其中還款表使用load_id作為外鍵與貸款表關聯。
貸款表數據
還款表數據
結果為 110.00
結果為 65.00
結果為 270.00
關聯情況下,貸款表查詢出的實際數據如下,可以看出這種情況下出現了笛卡爾積。
load_id為5的貸款對應3條還款,load_id為8的貸款對應2條還款。所以sum(lc.load_amt)的結果270 = 50 * 3 + 60*2。
解決方案,使用 DISTINCT 關鍵字。
結果 110.00
結果為 270.00 , 65.00。
跟場景三一樣,貸款金額出現了笛卡爾積
這種情況可以分兩步走
這種方式可能不是很好理解,換成子查詢方式。
結果
結果
4. SQL在線模擬器網站推薦
01
SQL在線學習網
http://sample.jimstone.com.cn/xsql/
02
SQLFIDDLE
http://sqlfiddle.com/
03
SQLBOLT
https://sqlbolt.com/
04
W3RESOURCE
https://www.w3resource.com/
結束了,快樂,886!
5. mybatis中動態sql語句的實際應用場景是怎麼樣的,比如說if,具體在什麼情況下可以使用,給高分,謝謝!
<where>
<trim prefixOverrides="and">
<if test="id!=null">
and c.id=#{id}
</if>
<if test="oid!=null and oid!=0">
and b.id=#{oid}
</if>
<if test="startDate!=null">
<if test="endDate!=null">
and a.pay_time BETWEEN #{startDate} AND #{endDate}
</if>
</if>
</trim>
</where>
service層如果參數為null,mybatis執行sql語句的時候就不會去拼接你指定的if標簽中的sql語句
6. 如何用SQL分析電商用戶行為數據(案例)
本文以「淘寶用戶行為數據集」的分析全過程為例,展示數據分析的全過程
——使用工具:MySQL,Excel,Navicat,PowerBI
——分析類型:描述分析,診斷分析
——分析方法:漏斗分析,用戶路徑分析,RFM用戶價值分析,活躍/存留分析,帕累托分析,假設驗證分析。
(考慮到閱讀體驗文章中只放了SQL截圖,如需PDF版本,再公眾號後台回復「用戶行為分析」領取)
(目錄如下)
1.分析流程和方法
當沒有清晰的數據看板時我們需要先清洗雜亂的數據,基於分析模型做可視化,搭建描述性的數據看板。
然後基於描述性的數據挖掘問題,提出假設做優化,或者基於用戶特徵數據進行預測分析找規律,基於規律設計策略。簡單來說:
——描述性分析就是:「畫地圖」
——診斷性分析就是:「找問題」
——預測性分析就是 :「找規律」
在數據分析中有兩個典型的場景:
一種是有數據,沒有問題:需要先整體分析數據,然後再根據初步的描述分析,挖掘問題做診斷性分析,提出假設,設計策略解決問題。
另一種是已經發現了問題,或者已經有了假設,這種做數據分析更偏向於驗證假設。
2.淘寶用戶行為分析
本次是對「淘寶用戶行為數據集」進行分析,在分析之前我們並不知道有什麼問題,所以需要先進行描述性分析,分析數據挖掘問題。
我們首先來看下這個數據集的元數據:
根據以上數據欄位我們可以拿用戶行為為主軸從縱深方向提出一些問題,然後再從數據中找答案
縱向:
——這個數據集中用戶的日活躍和周活躍時間有什麼規律嗎?
——在當日活躍的用戶次日,三日,四日……還有多少活躍?
深向:
——用戶從瀏覽到購買的整體轉化率怎麼樣?
——用戶從瀏覽到購買的路徑是怎麼樣子的?
——平台主要會給用戶推送什麼商品?
——用戶喜歡什麼類目?喜歡什麼商品?
——怎麼判斷哪些是高價值用戶 ?
下面是叮當整理的常用分析方法:
我們可以給前面的問題匹配一下分析方法,便於後面的分析:
為了便於後面的數據分析,在分析之前我們需要先對做一下清洗
看元數據(欄位解釋,數據來源,數據類型,數據量……)初步發現問題為之後的處理做准備。
確定缺失值范圍,去除不需要欄位,填充缺失內容
根據元數據格式和後續分析需要的格式對數據進行處理
去除重復值,異常值
——去除重復值:並把用戶ID,商品ID,時間戳設置為主鍵
——異常值處理:查詢並刪除2017年11月25日至2017年12月3日之外的數據
查詢並刪除小於2017-11-25的
——驗證數據:
——分析思路:
——SQL提數:
——Excel可視化:
活躍曲線整體為上升狀態,同為周六日,12月2號,3號相比11月25日,26日活躍度更高。
用戶在周六周日相比其他時間更活躍(周六周日為休息日,用戶有更多時間)
一天內用戶活躍的最高峰期為21點(用戶在這個時間段空閑較多)
——分析思路:
——SQL提數:
列出每用戶每天及當天後面又活躍的日期,並創建「活躍時間間隔表」用於後面求次日存留,三日存留……
對「活躍時間間隔表視圖」引用進行分組統計,計算每日存留人數並創建視圖
對存留人數表進行計算,統計活躍用戶留存率
——Excel可視化:
——分析思路:
——SQL提數:
-把各種用戶行為分離出來並創建視圖方便後續查詢用戶行為數據
查詢整體數據漏斗
——Excel可視化:
用戶從瀏覽到購買整體轉化率2.3%,具體主要在哪個環節流失還需要再細分用戶路徑分析
——分析思路:
——SQL提數:
——PowerBI可視化:
用戶從瀏覽到購買的路徑主要有4條,路徑越長轉化率越底
路徑1:瀏覽→購買:轉化率1.45%
路徑2:瀏覽→加購物車→購買:轉化率0.33
路徑3:瀏覽→收藏→購買:轉化率0.11%
路徑4:瀏覽→收藏→加購物車→購買:轉化率0.03%
——分析思路:
——SQL提數:
——Excel可視化:
——描述性分析:
瀏覽量top100的商品瀏覽量呈階梯分布,越靠前的階梯之間的落差相對越大在這個階梯中的商品越少,越靠後商品瀏覽量階梯之間的落差相對越小,同階梯內的商品越多。
瀏覽量TOP100的商品所屬類目中,4756105,3607361,4357323三個類目瀏覽量遠超其他類目。
——分析思路:
——SQL提數:
查詢計算商品轉化率,升序排列,取前100個
——Excel可視化:
——描述性分析:
從商品看:有17款商品轉化率超過了1。
從類目看:這些商品所屬類目分布均勻,除965809,4801426,2735466,2640118,5063620,4789432,2945933這7個類目之外,其他類目都只有一個商品在轉化率TOP100的商品中。
——分析思路:
用戶價值分析常用的分析方式是RFM模型
本次分析中的R,F,M具體定義(僅用於演示分析方法,無實際業務參考價值):
——SQL取數與分析:
1)建立打分標准:先計算R,F的值,並排序,根據R,F值最大值和最小值得區間設計本次得打分標准
-查詢並計算R,F值創建視圖
-引用RF數值表,分別查詢R,F的最大值和最小值
-結合人工瀏覽的建立打分標准
2)給R,F按價值打分
3)計算價值的平均值
4)用平均值和用戶分類規則表比較得出用戶分類
——Excel可視化
通過描述性分析得到可視化的數據後我們一般會先看一下是否符合業務常識
如果符合常識接下來我們會通過與行業平均數據和本產品的同比環比對比看是否正常,如果不正常就要找原因,設計解決方案,如果正常那就看是否有可以優化的地方。
我們首先來看一下這些描述性分析是否符合業務常識和指標是否正常:
1.活躍曲線整體為上升狀態,同為周六日,12月2號,3號相比11月25日,26日活躍度更高。
2.用戶在周六周日相比其他時間更活躍
3.一天內用戶活躍的最高峰期為21點
4.從2017年11月15日致2017年12月3日,活躍用戶新增38%
5.從2017年11月15日致2017年12月3日,活躍用戶次日留存增長18.67%,當日的活躍用戶留存也在快速增長,第七日留存比次日留存高18.56%。
6.用戶從瀏覽到購買整體轉化率2.3%
7.用戶從瀏覽到購買的路徑主要有4條,路徑越長轉化率越低。
8.瀏覽量top100的商品瀏覽量呈階梯分布,越靠前的階梯之間的落差相對越大在這個階梯中的商品越少,越靠後商品瀏覽量階梯之間的落差相對越小,同階梯內的商品越多。
9.瀏覽量TOP100的商品所屬類目中,4756105,3607361,4357323三個類目瀏覽量遠超其他類目。
10.從商品看:有17款商品轉化率超過了1。
11.從類目看:這些商品所屬類目分布均勻,除965809,4801426,2735466,2640118,5063620,4789432,2945933這7個類目之外,其他類目都只有一個商品在轉化率TOP100的商品中。
根據以上診斷分析我們梳理出了以下假設,做假設驗證。
假設1:這些商品中有高轉化率的爆款商品
對比瀏覽量TOP5的商品,發現這些商品轉化率在同一類目下並不高,假設不成立
假設2:4756105,3607361,4357323三個類目屬於高頻剛需類目
-創建類目購買頻次表
-計算類目購買頻次平均值
-查詢4756105,3607361,4357323三個類目的購買頻次
4756105,3607361,4357323三個類目的用戶購買頻次明顯高於平均值,假設成立
假設3:有部分用戶是未點擊商詳直接從收藏和購物車購買的。
用戶不是直接從收藏和購物車購買的,只是後續復購未點擊商詳,假設不成立
假設4:淘寶推薦的商品主要是「同一類目下的高轉化商品」
用Excel對瀏覽量TOP100的商品ID和轉化率TOP100的商品ID進行去重,結果無重復值,假設不成立
3.結論:
1)用戶活躍:用戶活躍曲線整體呈上升趨勢,在一周中周六,周日活躍度比平時更高,在一天中用戶活躍曲線從凌晨4點開始往上升,在中午12點和下午5~6點有兩個小低谷(吃飯),到晚上9點時活躍度達到頂峰。
2)用戶留存:從2017年11月15日致2017年12月3日的用戶留存數據來看,淘寶的用戶留存數據較好,活躍用戶次日留存增長18.67%,當日的活躍用戶留存也在快速增長,第七日留存比次日留存高18.56%。
3)用戶轉化:整體轉化2.3%,用戶從瀏覽到購買的路徑主要有4條,路徑越長轉化率越低。
4)平台推薦與用戶偏好:從數據集中的數據來看,排除用戶興趣偏好標簽,淘寶給用戶用戶推送的商品主要是高頻剛需的類目,促使用戶復購,流量迴流平台。
以上結論受數據量和數據類型的影響,並不一定準確,僅用來練習數據分析方法。
(考慮到閱讀體驗文章中只放了SQL截圖,如需PDF版本,再公眾號後台回復「用戶行為分析」領取)
7. sql特定場景查詢(軌跡)
SELECT time1 FROM ( SELECT A.*, ROWNUM RN FROM (
select rownum no ,time1 from a
where city ='北京'
order by to_char(time1,'hh24miss')
) A WHERE ROWNUM <= 1 ) WHERE RN >= 1
上面這條語句查出來是a第一次在北京的最早一條記錄,已此類推。最晚的時間在order by 後面用
desc 倒序排列,
上海就改條件,
a第二次就改條件 WHERE ROENUM<=2) WHERE RN >1 就可以了,自己去寫吧,我懶得打了