本文實現的這個需求其實十分廣泛,舉例來講,咱們存在一個用戶來源表,用來標記用戶從哪一個渠道註冊進來。sql
表結構以下所示…blog
其中 origin 是用戶來源,其中的值有 iPhone 、Android 、Web 三種,如今須要分別統計由這三種渠道註冊的用戶數量。io
解決方案1class
SELECT count(*) FROM user_operation_log WHERE origin = 'iPhone'; SELECT count(*) FROM user_operation_log WHERE origin = 'Android'; SELECT count(*) FROM user_operation_log WHERE origin = 'Web';
用 where 語句分別統計各自的數量。im
這樣查詢的量有點多了,若是這個值有 10 個呢,那還得寫 10 條類似的語句,很麻煩。d3
有沒有一條語句就搞定的呢?因而去查了些資料。統計
解決方案2查詢
咱們知道 count 不只能夠用來統計行數,也能統計列值的數量,例如:img
統計 user_operation_log 有多少行:di
SELECT count(*) FROM user_operation_log
統計 origin 這列值不爲 NULL 的數量:
SELECT count(origin) FROM user_operation_log
因此咱們能夠利用這個特性來實現上面的需求
第一種寫法(用 count 實現)
SELECT count(origin = 'iPhone' OR NULL) AS iPhone, count(origin = 'Android' OR NULL) AS Android, count(origin = 'Web' OR NULL) AS Web FROM user_operation_log;
查詢結果
第二種寫法(用 sum 實現):
SELECT sum(if(origin = 'iPhone', 1, 0)) AS iPhone, sum(if(origin = 'Android', 1, 0)) AS Android, sum(if(origin = 'Web', 1, 0)) AS Web FROM user_operation_log;
查詢結果:
第四種寫法:
SELECT origin,count(*) num FROM user_operation_log GROUP BY origin;
查詢結果: