MySQL——基于CASE WHEN的常用查询
RDBMS語句執行順序【補充】
這里我們簡單提一下關于SQL語句的執行問題:經過前面7個查詢關鍵詞的學習,你會發現SQL語句的書寫順序與執行順序是不一樣的。
# SQL語句書寫順序 select distinct <select_list> from <table_operate> where <where_condition> group by <group_by_list> having <having_condition> order by <order_by_list> limit <limit_number>上述語句的執行順序是這樣的:
首先會定位到from關鍵詞確認語句將要對哪些表進行操作,
然后定位到where關鍵詞看看限定了什么樣的查詢條件,
之后定位到group by關鍵詞看是否有分組統計需求,
前面執行結束之后執行having語句,對查詢結果進行條件篩選,
之后確定最終要返回哪些字段呈現給用戶(也就是select關鍵詞后面的列名)
如果有distinct關鍵詞就執行去重操作, 最后根據order by關鍵詞后面字段對返回的結果進行升序或者降序排列,
如果有返回行數限制的要求,就按照limit關鍵詞后面的數字返回相應的行數。
基于CASE WHEN的常用查詢——以電商交易數據為例
在實際工作中,經常會涉及以下兩類問題:
- 數據的映射處理:比如將離散的數字變成有意義的業務說明,或是將連續的數值映射到離散的區間
帶 - 有針對性的篩選計算:將細顆粒單位轉換為粗顆粒單位的聚合運算
這兩類問題,我們通常使用CASE WHEN語句來解決。CASE語句其實就是MySQL中的控制流語句,類似于其他很多編程工具中的IF…THEN…的分支判斷邏輯。
關于CASE WHEN的表達方式有兩種:“簡單CASE函數法”和“CASE搜索函數法”。這兩種方法各有優點,比如“簡單CASE函數法”的語法更加簡潔,但是只能處理等式的問題,“CASE搜索函數法”更加靈活好用,可以處理等式問題也可以處理不等式問題。
# 簡單CASE函數法 CASE <name> WHEN <when_condition> THEN <result> [WHEN <when_condition> THEN <result>] [……] [ELSE <else_result>] END# CASE搜索函數法 CASEWHEN <bool_condition> THEN <result> [WHEN <bool_condition> THEN <result>] [……] [ELSE <else_result>] END下面以某電商交易數據為例(goods_orders.csv)來學習CASE WHEN語法在數據查詢中的幾種常見用法。該數據集一共包含7個字段和5500條樣本,這7個字段分別是用戶ID、用戶出生日期、下單時間、訂單ID、支付方式、支付金額和是否享受折扣。
#navicat導入數據以后 use test; # 查看導入數據數量 select count(*) from goods_orders; # 查看前10行數據 select * from goods_orders limit 10;
(1)應用場景1:離散數值映射為對應的實際含義
在實際工作中,很多離散型字段值都是以數值的形式存儲的,主要是這樣可以節省數據的存儲空間并且方便數據的查詢。但是,缺點是沒有辦法根據每一個數字得知其背后的具體含義(通常情況下,會有一個數據字典對這些數字進行說明)。所以,我們可以利用case when語法在查詢中實現數字值與實際含義的一一對應,例如:
使用SQL語句實現數值與實際業務含義的一一對應:
(2)應用場景2:連續數值離散化
在做數據分析的時候,有時會需要把連續的數值切分為幾種區間,比如,將用戶的年齡切分為青年、中年、老年;收入可以切分為低收入群體、中等收入群體和高收入群體;根據用戶的訪問次數可以將用戶分為不活躍用戶、低活躍用戶、次高活躍用戶和高活躍用戶等等。對于我們的goods_orders數據集來說,我們可以根據用戶的出生日期將用戶劃分為60后、70后、80后和90后。具體查詢語句如下:
(3)應用場景3:行列轉換
有時候我們經常會將行列進行轉換,得到長形統計表和寬形統計表,如下所示:
統計結果顯示,不論是月份iMonth還是支付方式iType ,它們每一種值均在表中出現多次,所以這種表就稱為長形表,由于查詢結果是基于分組統計所得,所以這種表也稱為長形統計表。
group by后面為什么可以使用別名?
前面我們說SQL語句的執行順序是group by在select之前,那這里為什么在group by之后使用別名也可以查詢出結果而沒有報錯?原因在于MySQL對查詢做了加強處理,所以可以允許group by中使用別名,但是在其他的RDBMS中(比如Oracle)別名的使用都是嚴格遵循SQL執行順序的——group by后面不能使用別名。
寬形統計表與長形統計表正好相反,構成寬形統計表的某一種或者某一類觀測對象只能由一行組成,解決問題的思路就是將離散字段的水平值轉換成具體的字段名名稱。這里我們可以使用case when語法,將長形統計表轉換為寬形統計表,查詢語句及結果如下所示:
# 將長形統計表轉換成寬形統計表 select month(Order_Date) as iMonth, sum(case when Pay_Type in (1,3,5,7,10) then Pay_Amt end) as 'Wechat', sum(case when Pay_Type in (6,9,12) then Pay_Amt end) as 'Bank_Card', sum(case when Pay_Type not in (1,3,5,7,10,6,9,12) then Pay_Amt end) as 'Ali_Pay' from goods_orders where year(Order_Date) = 2018 group by month(Order_Date) order by month(Order_Date);總結
以上是生活随笔為你收集整理的MySQL——基于CASE WHEN的常用查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL——MySQL的数据查询功能
- 下一篇: MySQL——开窗函数