= string.Empty)高效、批量插入和删除的sql语句是要那样写才执行最快、接口和抽象类的区别不仅是语言层面、本来权限办理是要如许设计的、某个类那样设计职责才更纯一更便于扩大……本来前两篇文章是...
技能程度总能在扯皮和无中生有中患上到提高。如果从来不"求疵",可能就不会知道if(str != "")不比if(str != string.Empty)高效、批量插入和删除的sql语句是要那样写才执行最快、接口和抽象类的区别不仅是语言层面、本来权限办理是要如许设计的、某个类那样设计职责才更纯一更便于扩大……
本来前两篇文章是进修cnblogs编辑控件用的,瞅见跟贴的朋友询问批量插入和批量删除的问题,决定整理成文和大家分享。
我们这里讨论的只是普通sql语句如何写更高效,不思量特殊的用文件中转等导入体式格局,终究在代码中挪用sql语句或存储过程才更方便。
批量删除很简略,大家可能都用过:
DELETE FROM TestTable WHEREID IN (1, 3, 54, 68) --sql2005下运行通过
当用户在界面上不连续的选择多项举行删除时,该语句比轮回挪用多次删除或多条delete语句中间加分号一次挪用等方法都高效的多。
本文重点讲评的是批量插入的写法:
sql写法:
INSERT INTO TestTable SELEDT1, 'abc'UNION SELEDT 2, 'bcd' UNION SELEDT3, 'cde' --TestTable表没有主键,ID不是主键
Oracle写法:
INSERT INTO TestTable SELEDT 1, 'abc' From daul UNION SELEDT 2, 'bcd' From daul --TestTable表没有主键,ID不是主键
曾经试验过,这种写法插入1000条数据比轮回挪用1000次insert或1000条insert语句简略叠加一次挪用要高效患上多,大概快20多倍(调试状态不是太准)。其实很简略,就用了个union(union all 也能够),但其时患上出试验结果时还是很惊喜的。
要患上出这个结果需要两个条件:
1、表来不患上主键或者主键是数据库默认的(sql用自动递增列,oracle用序列)
二、组合sql语句时只能直接用字符串毗连,不能用参量化sql语句的写法(就是在组合的sql中用@parm做占位符,再给Dommand对象添加Parameter)
以上两条任意一条不餍足,效率的提高都不较着。
另外,sql语句的最大长度有限制,组合几千条数据写成一条insert语句,可能会超过上限,所以如果有5000条数据,可以一次insert 1000条,分5次写完(纷歧定一次1000条最合适,有乐趣的朋友可以研究)。
声明:看了几位朋友的评论后发明本身没有叙述清楚
上面的两个条件并不是说如许做就好,而是说当应用途景餍足这两个条件时才合适用union的写法
其时用这种写法时,是为相识决一个WinForm程序批量导入电话号码的问题,程序给本身人用,Excel文件也是靠患上住的,不需要思量sql攻击。还有一些场景是大量数据来历于通过Gprs网络毗连的专用终端,总之数据来历是靠患上住的,还有就是数据量很大但不可能巨大。
PS:常常碰到一些小技巧或者值当注重的小细节,没有记下来,要等下次再碰到时才想起来。现鄙人决心要养成好的工作习惯,留此文为证。
能够整理成文的要写在项目组开发规范中,其他的至少要记录下来。
在写SQL时,经常灵活运用一些SQL语句编写的技巧,可以大大简化程序逻辑。减少程序与数据库的交互次数,有利于数据库高可用性,同时也能显得你的SQL很牛B,让同事们眼前一亮。 目录 实用的SQL 1.插入或替换 2....
在写SQL时,经常灵活运用一些SQL语句编写的技巧,可以大大简化程序逻辑。减少程序与数据库的交互次数,有利于数据库高可用性,同时也能显得你的SQL很牛B,让同事们眼前一亮。
目录
高能预警,这是一篇干货满满的MySQL技术文章,总有一天,你必然会用到,记得收藏! -- 来自一位被技术经理毒打多年的程序员的忠告
实用的SQL

1.插入或替换

如果我们想插入一条新记录(INSERT),但如果记录已经存在,就先删除原记录,再插入新记录。
情景示例:这张表存的每个客户最近一次交易订单信息,要求保证单个用户数据不重复录入,且执行效率最高,与数据库交互最少,支撑数据库的高可用。
此时,可以使用"REPLACE INTO"语句,这样就不必先查询,再决定是否先删除再插入。
"REPLACE INTO"语句是基于唯一索引或主键来判断唯一(是否存在)的。
"REPLACE INTO"语句是基于唯一索引或主键来判断唯一(是否存在)的。
"REPLACE INTO"语句是基于唯一索引或主键来判断唯一(是否存在)的。
注意事项:如下SQL所示,需要在username字段上建立唯一索引(Unique),transId设置自增即可。
-- 20点充值 REPLACE INTO last_transaction (transId,username,amount,trans_time,remark) VALUES (null, 'chenhaha', 30, '2020-06-11 20:00:20', '会员充值'); -- 21点买皮肤 REPLACE INTO last_transaction (transId,username,amount,trans_time,remark) VALUES (null, 'chenhaha', 100, '2020-06-11 21:00:00', '购买盲僧至高之拳皮肤');
若username='chenhaha'的记录不存在,REPLACE语句将插入新记录(首次充值),否则,当前username='chenhaha'的记录将被删除,然后再插入新记录。
id不要给具体值,不然会影响SQL执行,业务有特殊需求除外。

2.插入或更新

如果我们希望插入一条新记录(INSERT),但如果记录已经存在,就更新该记录,此时,可以使用"INSERT INTO ... ON DUPLICATE KEY UPDATE ..."语句:
情景示例:这张表存了用户历史充值金额,如果第一次充值就新增一条数据,如果该用户充值过就累加历史充值金额,需要保证单个用户数据不重复录入。
这时可以使用"INSERT INTO ... ON DUPLICATE KEY UPDATE ..."语句。
注意事项:同上,"INSERT INTO ... ON DUPLICATE KEY UPDATE ..."语句是基于唯一索引或主键来判断唯一(是否存在)的。如下SQL所示,需要在username字段上建立唯一索引(Unique),transId设置自增即可。
-- 用户陈哈哈充值了30元买会员 INSERT INTO total_transaction (t_transId,username,total_amount,last_transTime,last_remark) VALUES (null, 'chenhaha', 30, '2020-06-11 20:00:20', '充会员') ON DUPLICATE KEY UPDATE total_amount=total_amount + 30, last_transTime='2020-06-11 20:00:20', last_remark ='充会员'; -- 用户陈哈哈充值了100元买瞎子至高之拳皮肤 INSERT INTO total_transaction (t_transId,username,total_amount,last_transTime,last_remark) VALUES (null, 'chenhaha', 100, '2020-06-11 20:00:20', '购买盲僧至高之拳皮肤') ON DUPLICATE KEY UPDATE total_amount=total_amount + 100, last_transTime='2020-06-11 21:00:00', last_remark ='购买盲僧至高之拳皮肤';
若username='chenhaha'的记录不存在,INSERT语句将插入新记录,否则,当前username='chenhaha'的记录将被更新,更新的字段由UPDATE指定。

3.插入或忽略

如果我们希望插入一条新记录(INSERT),但如果记录已经存在,就啥事也不干直接忽略,此时,可以使用INSERT IGNORE INTO ...语句:情景很多,不再举例赘述。
注意事项:同上,"INSERT IGNORE INTO ..."语句是基于唯一索引或主键来判断唯一(是否存在)的,需要在username字段上建立唯一索引(Unique),transId设置自增即可。
-- 用户首次添加 INSERT IGNORE INTO users_info (id, username, sex, age ,balance, create_time) VALUES (null, 'chenhaha', '男', 12, 0, '2020-06-11 20:00:20'); -- 二次添加,直接忽略 INSERT IGNORE INTO users_info (id, username, sex, age ,balance, create_time) VALUES (null, 'chenhaha', '男', 12, 0, '2020-06-11 21:00:20');
若username='chenhaha'的记录不存在,INSERT语句将插入新记录,否则,不执行任何操作。

4.SQL中的if-else判断语句

众所周知,if-else判断在任何地方都很有用,在SQL语句中,"CASE WHEN ... THEN ... ELSE ... END"语句可以用在增删改查各类语句中。
给个情景:妇女节大回馈,2020年注册的新用户,所有成年女性账号送10元红包,其他用户送5元红包,自动充值。
示例语句如下:
-- 送红包语句 UPDATE users_info u SET u.balance = CASE WHEN u.sex ='女' and u.age > 18 THEN u.balance + 10 ELSE u.balance + 5 end WHERE u.create_time >= '2020-01-01'情景2:有个学生高考分数表,需要将等级列出来,650分以上是重点大学,600-650是一本,500-600分是二本,400-500是三本,400以下大专;
原测试数据如下:
查询语句:
SELECT *,case when total_score >= 650 THEN '重点大学' when total_score >= 600 and total_score= 500 and total_score= 400 and total_score