首先說明一下,本人之前一直都是用MSSQL,由於工作原因,每天寫上百條sql語句,並持續了幾年;由於換了工作目前主要接觸的MYSQL;所以現在開始學習MYSQL。
我的學習計劃很簡單,我在MSSQL使用或學習到的功能,都會嘗試在MYSQL實現,所以如果我都嘗試了一遍,我認為MYSQL的使用也學的差不多了,當然工作中遇到的問題和解決經驗也會總結下來。
剛開始工作中最首先使用的也是最常用的當然就是增刪改查了,所以第一遍就會介紹MYSQL的新增,修改,刪除;查詢是很大的一塊,所以會另外展開
INSERT
1.插入一條記錄 ,很簡單的標准sql
insert into mytable(col1,col2,col3) values('val1','val2',4);
說明:請留意最後的分號; 用慣了mssql ,最不適應的地方就是,mysql中每條sql語句必須用分號間開,否則如果想一次執行多條語句,就會報錯.
另外,如果使用自增ID,插入時也可以設置自增ID的值,而不報錯; 這對於數據遷移是一大方便.
2.復制表的數據,這跟mssql是一樣的
insert into mytable(col1,col2,col3) select col1,col2,col3 from copytable;
3.新增表並同時復制數據,這個跟mssql不同 (ms:select * into newtable from copytable)
CREATE TABLE newtable SELECT * FROM copytable WHERE 1=2;
說明:跟mssql一樣,只是單純復制表結構,索引什麼的並不會復制過來; 去掉where 條件將會復制所有數據
4.批量插入,mysql的特點,有點似鏈式寫法 (相當好用!)
insert into mytable (col1,col2,col3) values ('A','VAL1',1),('B','VAL2',2),('C','VAL3',3);
說明:執行效率相當高,同時插入數萬記錄也只是10秒以內;而且對於項目中的處理字符,實現批量插入相當輕松,我特別喜歡這個語句.
UPDATE
1.標准sql
UPDATE mytable SET col1='A',col2='val1',col3=1 where id='0001';
2.表連接更新,同時更新多列,部分跟mssql一致
UPDATE newtable a,oldtable b set a.col1=b.col1,a.col2=b.col2 where a.id=b.id;
說明:mssql的寫法更加靈活,支持該寫法: update newtable set col1=oldtabel.col1,col2=oldtabel.col2 from oldtabel where newtable.id=oldtabel.id
3.批量更新
REPLACE INTO mytable (id,name)VALUES ('01','hello'),('02','haha');
說明:跟批量插入的格式是一樣的, 當values後面的數據插入到mytable中不會引起主鍵沖突或唯一索引沖突時,那麼就會直接新增數據, 否則就會修改數據.簡單點說就是,如果記錄存在則更新,如果記錄不存在則插入; 上例中,如果執行插入操作,受影響行數為2, 如果執行修改操作,受影響行數為4; 所以執行修改操作的本質是先delete,然後再插入.所以如果更新的字段不齊,其它字段將變為默認值 下面是該功能的增強版
INSERT INTO mytable(id,name,col)VALUES (78,'456','55'),(88,'456','d') ON DUPLICATE KEY UPDATE name=VALUES(name),col=VALUES(col);
INSERT INTO mytable(id,name,col)VALUES (78,'456','55'),(88,'456','d') ON DUPLICATE KEY UPDATE name=VALUES(name); --只更新name
說明:跟replace 是一樣的,唯一不同的是可以選擇更新的列, 其它的列的值並不會受影響.
DELETE
1.標准sql
delete from mytable where id='001';
2.清空表, 跟mssql是一樣的
truncate table mytable;
說明:執行後,自增ID也會從1開始編號.
處理數據時注意事項
1.對日期類型的列插入數據時,如果插入的值不符合日期格式,mysql 並不會報錯,但是會保存為'0000-00-00 00:00:00'的格式, 一般的程序並不會承認,所以你會發現後台讀取數據沒有問題,而應用程序讀取數據時會報錯. 這個我被坑慘了.
下面是網上找到的解決辦法,並沒有實際測試
給jdbc url加上 zeroDateTimeBehavior參數:
datasource.url=jdbc:mysql://localhost:3306/testdbuseUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true
zeroDateTimeBehavior=round是為了指定MySql中的DateTime字段默認值查詢時的處理方式;默認是拋出異常,
對於值為0000-00-00 00:00:00(默認值)的紀錄,如下兩種配置,會返回不同的結果:
zeroDateTimeBehavior=round //結果: 0001-01-01 00:00:00.0
zeroDateTimeBehavior=convertToNull //結果 null
目前關於mysql的新增更新刪除就是以上內容,遇到新情況再補充吧