MySQL常用及高階語法集錦
阿新 • • 發佈:2018-12-22
一、前言
本文記錄專案需求中遇到過的MySQL語法例項,持續更新。
二、語法例項
0x01 常用語法
留個沙發空位
0x02 根據外來鍵關聯錶轉移欄位
表T1中有個t2_id欄位,想將關聯表T2中對應的欄位內容轉移到t1中來
UPDATE t1 LEFT JOIN t2 ON t1.t2_id = t2.id
SET t1.name=t2.name,t1.phone=t2.phone where t1.t2_id>0;
表T2
name,phone
場景:此處有這個需求,是因為前面開發人員訂單設計時關聯的是一個地址表id,使用者已經提交訂單,但修改地址後還會導致訂單地址更改。訂單設計時應該建立資料快照,防止其他表的更改導致快照更改,以免與使用者產生糾紛。
0x03 無規則欄位批量修改資料
根據給定的一些無規則id批量修改資料
UPDATE user SET is_pass=0 WHERE id IN(1,2,7,9);
場景:前期後臺功能並不完善,一些機器需要更改資料庫修改狀態。顯然在這裡'IN'比'='要省事。
0x04 一小時內的平均值/總和等統計
#每分鐘內的平均值
SELECT DATE_FORMAT(FROM_UNIXTIME(`time`),'%Y-%m-%d %H:%i') AS TIME,AVG(tx_kb)
FROM traffic WHERE machine_id=1234 GROUP BY DATE_FORMAT(FROM_ UNIXTIME(`time`),'%Y-%m-%d %H:%i');
#每小時內的平均值
SELECT DATE_FORMAT(FROM_UNIXTIME(`time`),'%Y-%m-%d %H') AS TIME,AVG(tx_kb)
FROM traffic WHERE machine_id=1234 GROUP BY DATE_FORMAT(FROM_UNIXTIME(`time`),'%Y-%m-%d %H');
場景:假設機器每隔10秒流量上傳一次流量。(正常情況下不會那麼頻繁不然伺服器受不了) 我們需要檢視某臺機器一天24個小時時間段的流量統計圖,進而分析日使用高峰。
0x05 一對多關係分組統計
SELECT machine.id,machine.name,COUNT(bind.user_id) AS user_num FROM machine,bind
WHERE machine.id=bind.machine_id GROUP BY machine.id;
假設機器A、B、C、D,每臺機器綁定了若干使用者,我們統計每臺機器繫結使用者數
0x06 按日期分類統計使用者
SELECT FROM_UNIXTIME(regdate,'%Y-%m-%d') days,COUNT(id) num
FROM USER GROUP BY days ORDER BY days DESC;
0x07 使用者金幣TOP10排行榜
SELECT user_id,nickname,img,SUM(gold) AS gold FROM gold_log
LEFT JOIN user ON user.id=user_id WHERE GROUP BY user_id ORDER BY gold DESC LIMIT 0,10;
0x08 遷移表字段資料
INSERT INTO user2(`u_id`,`name`) SELECT `id`,`name` FROM user;