先建立一個實驗表:html
CREATE TABLE gmm_test ( id INT AUTO_INCREMENT PRIMARY KEY, `unqi` INT, field1 INT, field2 VARCHAR(12), UNIQUE KEY (unqi) ) ;
這張表裏面,id自增,unqi是惟一索引。
同時咱們添加一條記錄:mysql
INSERT INTO `gmm_test` (`unqi`,`field1`,`field2`) VALUES (2,2,'ddd');
表裏面是這樣的:sql
id unqi field1 field2 1 2 2 ddd
當咱們想以unqi爲條件來一波--有更無增(指符合條件的記錄執行更新,不符合的則插入新紀錄,下同)
操做時;markdown
以下便可:函數
REPLACE INTO `gmm_test` (`unqi`,`field2`) VALUES (2, 'qqqq')
執行後,有以下結果:
1 queries executed, 1 success, 0 errors, 0 warnings優化
查詢:replace into `gmm_test` (`unqi`,`field2`) values (2, 'qqq') 共 2 行受到影響 執行耗時 : 0.003 sec 傳送時間 : 0.003 sec 總耗時 : 0.006 sec
這時你應該注意到,共2行受到影響ui
看下錶的結果,code
id unqi field1 field2 2 2 (NULL) qqqq
連主鍵id都自增了一次,因此在使用時要注意了,畢竟id變了可不是小事~~htm
再來看看 INSET INTO * ON DUPLICATE KEY UPDATE , 這個也能夠來 ---有更無增;blog
INSERT INTO `gmm_test` (`unqi`, `field1`, `field2`) VALUES (2, 0, 'qqqq') ON DUPLICATE KEY UPDATE field1 = field1 + 10;
或者
INSERT INTO gmm_test
(unqi
, field1
, field2
) VALUES (2, 10, 'qqqq') ON DUPLICATE KEY UPDATE field1 = values(field1
);
結果以下:
查詢:INSERT INTO `gmm_test` (`unqi`, `field1`, `field2`) VALUES (2, 0, 'qqqq') ON DUPLICATE KEY UPDATE field1 = field1 + 10 共 2 行受到影響 執行耗時 : 0.002 sec 傳送時間 : 0.001 sec 總耗時 : 0.003 sec
雖然也是兩行,可是主鍵id並無變,
id unqi field1 field2 2 2 10 qqqq
關於效率問題,木有測,就借網上別人測好了的吧 .這裏
總結下來,就是儘可能仍是不用replace into 吧,畢竟好多坑 坑
好比我要統計 在線時間 分別 在 0~50h,50~100h,100~200h,200~500h ,200h以上 內的人數分別有多少?
SELECT ELT(INTERVAL(h.online_time,0, 50,100, 200), '0','50','100', '200') AS on_time, COUNT(h.online_time) AS cnt FROM hupu_user h GROUP BY ELT(INTERVAL(h.online_time, 0, 50,100, 200), '0','50','100', '200');
解釋:
INTERVAL()函數進行比較列表(N1,N2,N3等等)中的N值。該函數若是N<N1返回0,若是N<N2返回1,若是N<N3返回2 等等。若是N爲NULL,它將返回-1。列表值必須是N1<N2<N3的形式才能正常工做。
eg:
假設有一個下載速度表(有 speed 和 count 兩個字段),
而後統計1M,2M,4M,8M,8M以上這個5個速度區間的個數
select INTERVAL(speed,1000,2000,4000,8000) as i_s, sum(count) from a_speed_table group by i_s
上面的 sql 根據速度區間分組,再對不一樣區間出現的次數求和
若是N =1返回str1,若是N= 2返回str2,等等。返回NULL若是參數的數量小於1或大於N。ELT()是FIELD()的補集。 這個比較好理解了
當order by 後面值相同時,系統對數據的排序可能變得隨機化,即一下子這條數據在前面,一下子這條數據在後面了 ,因此咱們看到了重複數據,因此在分頁的時候使用oerder by的時候最後在目標排序字段的基礎上再加上一個字段,組成一個不會相同的排序依據
···這些也不算難,權當些無聊時的獲取些筆記樂趣吧,而後想吐槽下博客園對markdown格式支持仍是有些不同額,和預期的排版差一些~~||0,0||···
做者:fredGui
*來源:http://www.cnblogs.com/guixiaoming/p/8672343.html
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。