1. 程式人生 > 實用技巧 >MySQL 常用語句(查重,分割槽間查詢)

MySQL 常用語句(查重,分割槽間查詢)

    1. 查重
      select*frompeoplewherepeopleIdin(selectpeopleIdfrompeoplegroupbypeopleIdhavingcount(peopleId)>1) select * from Users where UserId in (select UserId from Users group by UserId having count(UserId) > 1)

      不過在資料量過大的時候查詢的速度會非常慢


      selectcount(peopleId)frompeople selectcount(distinctpeopleId)frompeople
      我們可以用上面兩條語句的結果進行對比判斷是否存在重複資料
    2. 分割槽間

      業務場景:統計消費總金額大於1000元的,800到1000元的,500到800元的,以及500元以下的人數。

      SELECT COUNT(CASE WHEN IFNULL(total_money,0) >=1000 THEN a.customer_id END) AS '>1000'
            ,COUNT(CASE WHEN IFNULL(total_money,0) >=800 AND IFNULL(total_money,0) <1000 THEN a.customer_id END) AS '800~1000'
            ,COUNT(CASE WHEN IFNULL(total_money,0) >=500 AND IFNULL(total_money,0) <800 THEN a.customer_id END) AS '500~800'
            ,COUNT(CASE WHEN IFNULL(total_money,0) <500  THEN a.customer_id END) AS '<500'
      FROM mc_userdb.`customer_login` a
      LEFT JOIN
      ( SELECT customer_id,SUM(order_money) AS total_money
        FROM mc_orderdb.`order_master` GROUP BY customer_id) b
      ON a.`customer_id`=b.`customer_id`

3. 現在要統計:<50、50-60、60-70、70-80、80-90、90-100、>=100分數區間的人數;
利用 INTERVAL 劃出7個區間;
再利用 elt 函式將7個區間分別返回一個列名,如下SQL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SELECT elt(INTERVAL(score, 0, 50, 60, 70, 80, 90, 100), '<50', '50-60', '60-70', '70-80', '80-90', '90-100', '>=100') as score_level, count(name) as counts
-> FROM class
-> GROUP BY elt(INTERVAL(score, 0, 50, 60, 70, 80, 90, 100), '<50', '50-60', '60-70', '70-80', '80-90', '90-100', '>=100');
+-------------+--------+
| score_level | counts |
+-------------+--------+
| 50-60 | 1 |
| 60-70 | 3 |
| 70-80 | 1 |
| 80-90 | 2 |
| 90-100 | 1 |
| <50 | 1 |
| >=100 | 1 |
+-------------+--------+
7 rows in set (0.00 sec)

4. update select用法

UPDATEuser_online_month_atu a

INNERJOIN( SELECT user_id, sum(c.online_times)asonline_times, SUM(c.login_count)aslogin_count, Sum(c.view_page_count)asview_page_count, LEFT(c.log_date,length(c.log_date) - 2)asdate FROM user_online_time_atu c GROUPBY c.user_id ,date ) bONa.user_id = b.user_idANDa.`month`=b.date SETa.online_time = b.online_times ,a.login_count=b.login_count,a.view_page_count=b.view_page_count