日度归档:2019年9月8日

mssql sqlserver sql脚本中应尽量避免使用distinct关键字


摘要:
下文讲述sqlserver中应尽量避免使用distinct关键字的原因,如下:

我们都知道distinct关键字的功能是对结果进行“显示唯一值”的操作,但是distinct关键字操作的原理,首先将数据查出来,然后再进行一个唯一的取值操作,这种操作如果涉及排序,那么将是一种开销非常大的方式,
所以在sql中,我们应尽量避免使用distinct关键字,并使用group by关键字代替distinct完成此功能,使用group by 关键字是一种非常高效的做法。
例:

  select distinct a.keyId,a.info from [maomao365.com] a 
  ---可以等价转换为以下group by 语句
   select a.keyId,a.info from [maomao365.com] a 
   group by a.keyId,a.info 

相关阅读:
sqlserver group by 聚合函数用法汇总说明

MSSQL 插入数据时候,如果存在则更新的方法分享


摘要:
下文讲述MSSQL中,插入数据时,如果存在则更新,否则就插入数据的方法分享
实验环境:sql server 2017


mssql中,我们可以采用 MERGE INTO 关键字实现此功能,
当两者匹配成功,则运行***语句,否则运行其它语句,达到插入数据时的判断操作,
具体操作方法如下所示:

create table [maomao365.com]
(keyId int identity,
info varchar(80)
 )
 go
 insert into [maomao365.com]
(info)values('sqlblog'),
 ('sqlserver'),('maomao365.com') 

---merge into实现如果存在,则更新
---如果不存在,则删除
MERGE INTO [maomao365.com] a
USING (SELECT 2 AS keyId_B, 'other' AS info_B )  b 
ON ( a.keyId = b.keyId_B)

WHEN MATCHED THEN
UPDATE SET a.info= b.info_B  --更新

WHEN NOT MATCHED THEN
INSERT (info) VALUES(b.info_B); ---插入

go
select * from [maomao365.com]
go
MERGE INTO [maomao365.com] a
USING (SELECT 20 AS keyId_B, 'new Info' AS info_B )  b 
ON ( a.keyId = b.keyId_B)

WHEN MATCHED THEN
UPDATE SET a.info= b.info_B  --更新
 
WHEN NOT MATCHED THEN
INSERT (info) VALUES(b.info_B); ---插入
go

select * from [maomao365.com]
go
truncate table [maomao365.com]
drop     table [maomao365.com]

相关阅读:
merge关键字实现增删改

MySQL 插入数据时,如存在则更新(ON DUPLICATE KEY UPDATE)用法简介说明


摘要:
下文讲述MySQL数据表操作时,如果存在则更新的操作方法
实验环境:sql serer 2008 R2


在数据表的设计中,通常我们会为数据表加上主键,作为数据更新的条件。
例:

   if exists(select null from tableName where keyId =@keyId)
   begin
      /*更新数据表*/ 
   end
   else
   begin
      /*插入数据表*/
   end

这种写法最大的弊端就是,每次操作时,都使用了两条sql脚本,即先判断后运行。


那么在MySQL中,新推出了一个关键字“ ON DUPLICATE KEY UPDATE ”,我们可以使用此关键字达到“数据存在则更新,否则插入的目的”。

ON DUPLICATE KEY UPDATE 关键字的作用
向数据库插入数据时,如果主键值存在,则运行update操作,否则运行插入操作


ON DUPLICATE KEY UPDATE 关键字举例应用

  ---创建测试表
   CREATE TABLE `maomao` (
  `keyId` int(11) NOT NULL,
  `info` varchar(80) DEFAULT NULL,
  PRIMARY KEY (`keyId`)
) ENGINE=InnoDB;
---插入测试数据
INSERT INTO `maomao` VALUES ('1', 'sqlblog');
INSERT INTO `maomao` VALUES ('2', 'sqlserver');
INSERT INTO `maomao` VALUES ('3', 'maomao365.com');
---测试ON DUPLICATE KEY UPDATE关键字
INSERT INTO maomao(keyId,`value`) VALUES(3, 'insertTest') ON DUPLICATE KEY UPDATE `info`='updateTest';
---查询表数据
select * from    `maomao`