在前面的文章中对T-SQL的查询做了基本总结,接下来我们看下SQL中的另外一个常用操作——数据的修改。

INSERT

INSERT

向数据表中插入数据的基本语句,句式:

INSERT INTO table_name(field1[,field2]...)
VALUES(value1[,value2]...);

T-SQL对VALUES进行了增强,可以一条语句插入多条数据:

INSERT INTTO table_name(field1[,field2]...)
VALUES(value1[,value2]...)[,(value3,[value4]...)];

示例如下:

USE WJChi;

-- 插入一条数据
INSERT INTO dbo.UserInfo(Id,Name,Age,IdentifyId,UAddressId)
VALUES
(NEWID(),N'xfh',26,NEWID(),NEWID());

-- 插入多条数据
INSERT INTO dbo.UserInfo(Id,Name,Age,IdentifyId,UAddressId)
VALUES
(NEWID(),N'xfh',26,NEWID(),NEWID()),
(NEWID(),N'雪飞鸿',28,NEWID(),NEWID());

BULK INSERT

该语句用于将文件中的数据插入到一个现有表中,句式:

BULK INSERT target_table FROM `data_file_path`
WITH
(
DATAFILETYPE = '',
FIELDTERMINATOR = '',
ROWTERMINATOR = ''
)

INSERT...SELECT...

该语句向已存在的目标表中插入有SELECT查询返回的结果集,句式:

INSERT INTO target_table(field1[,field2])
SELECT column1[,column2]
FROM raw_table
WHERE...

SELECT...INTO...

SELECT...INTO...不是标准SQL,该语句会创建新表并将查询结果集数据插入到表中,句式:

SELECT field1[,field2]
INTO target_table
FROM raw_table;

目标表的结构和数据是基于源表的,但,不会从源表复制:约束、索引、触发器和权限。

INSERT...EXEC...

该语句可将存储过程或动态SQL处理的结果集插入到目标表中,句式:

INSERT INTO target_table(field1[,field2])
EXEC stored_procedure;

UPDATE

UPDATE

UPDATE是标准SQL语句,用于更行表中的行,句式:

UPDATE target_table
SET field1[,field2]
WHERE ...

UPDATE操作不是幂等的,我们可以借助事务来防止误操作:

BEGIN TRAN
UPDATE ...
ROLLBACK -- or COMMIT

SQL中有all-at-once operations(同时操作)的概念,即出现在同一逻辑处理阶段的所有表达式在同一时间进行逻辑计算。基于同时操作的概念,注意以下语句的运算结果:

交换两个字段的值

UPDATE dbo.T1
SET col1 = col2, col2 = col1;

如果字段col1=100,col2=200

UPDATE dbo.T1
SET col1 = col1 + 10,col2 = col1 + 10;

执行以上语句后,col1和col2的值均为110。

基于联接的UPDATE

基于联接的UPDATE操作是非标准的SQL。

UPDATE OD
SET discount += 0.5
FROM dbo.OrderDetails AS OD
JOIN dbo.Orders AS O
ON OD.orderid = O.orderid
WHERE O.custid = 1;

对上面SQL的理解,应按照SQL的执行顺序来,即:先FROM,后WHERE,最后再看UPDATE语句。该语句用于更新OD表中存在于查询结果集(FROM语句)中的数据。

DELETE

T-SQL提供了两种删除数据的方式:DELETETRUNCATE,删除操作也是非幂等的,与UPDATE一样,我们可以借助事务防止误操作。

DELETE

DELETE FROM target_table WHERE...

基于联接的DELETE

基于联接的DELETE操作是非标准的SQL。

示例如下:

DELETE FROM Sales.SalesPersonQuotaHistory
FROM Sales.SalesPersonQuotaHistory AS spqh
INNER JOIN Sales.SalesPerson AS sp
ON spqh.BusinessEntityID = sp.BusinessEntityID
WHERE sp.SalesYTD > 2500000.00;

上述语句换一种写法,如下:

DELETE spqh
FROM
Sales.SalesPersonQuotaHistory AS spqh
INNER JOIN Sales.SalesPerson AS sp
ON spqh.BusinessEntityID = sp.BusinessEntityID
WHERE sp.SalesYTD > 2500000.00;

上面两条SQL的理解与UPDATE...FROM...类似:先看FROM,其次是WHERE,最后是DELETE。该语句用于删除spqh表中存在于查询结果集(FROM语句)中的数据。

删除符合条件的部分数据,如前20行:

DELETE TOP (20)
FROM Purchasing.PurchaseOrderDetail
WHERE DueDate < '';

TRUNCATE

TRUNCATE TABLE target_table;

TRUNCATE会删除表中的所有数据并重置表结构,相当于删掉表然后重建。与DELETE相比,TRUNCATE使用最小日志记录方式而非完全日志记录方式,所以在性能上会有优势。

但,当目标表被外键约束引用时,即使引用表(父表)为空甚至外键被禁用,都不允许使用TRUNCATE操作。我们可以通过创建一个虚拟表,带有指向生产表的外键(甚至可以禁止外键以防影响性能),依此来避免TRUNCATE误操作。

MERGE

MERGE是标准的SQL语句,T-SQL对其进行了一定的扩展。MERGE语句实现的功能通常可以转换为几个其他DML语句(INSERT、UPDATE、DELETE)的组合,使用MERGE语句可以使代码更为简洁。

MERGE target_table
USING raw_table
ON...
WHEN MATCHED THEN
// do something
WHEN NOT MATCHED THEN
// do something
;

注意,必须以分号来结束MERGE语句。示例代码如下:

MERGE INTO dbo.Customers AS CT
USING dbo.CustomersStage AS CS
ON CT.Custid = CS.Custid
-- 源表中的数据与目标表相匹配
WHEN MATCHED THEN
UPDATE SET CT.CompanyName = CS.CompanyName
-- 源表中的数据与目标表不匹配
WHEN NOT MATCHED THEN
INSERT(Custid,CompanyName) VALUES(CS.Custid,CS.CompanyName)
-- 目标表中的数据不被源表匹配
WHEN NOT MATCHED BY SOURCE THEN
DELETE;

以上各个分支子句,如:WHEN MATCHED THEN可以附带额外的判断条件,即WHEN MATCHED AND... THEN。详细内容,可参考MERGE (Transact-SQL)

通过表表达式修改数据

对较为复杂的语句进行故障排除时,首先看哪些行会被修改,而不是实际的修改它们。选择之一是将代码修改为SELECT语句,并在排除代码故障后,将其改回UPDATE语句。

可以使用表表达式来简化上述解决问题的思路,示例如下:

WITH Temp AS
(
SELECT custid,OD.orderid,discount,discount+1 AS newDiscount
FROM dbo.OrderDetails AS OD
JOIN dbo.Orders AS O
ON OD.orderid = O.orderid
WHERE O.cusstid = 1
)
UPDATE Temp SET discount = newDiscount;

或者:

UPDATE Temp SET discount = newDiscount FROM
(
SELECT custid,OD.orderid,discount,discount+1 AS newDiscount
FROM dbo.OrderDetails AS OD
JOIN dbo.Orders AS O
ON OD.orderid = O.orderid
WHERE O.cusstid = 1
) AS Temp;

T-SQL基础(五)之增删改的更多相关文章

  1. Javascript数组系列五之增删改和强大的 splice()

    今天是我们介绍数组系列文章的第五篇,也是我们数组系列的最后一篇文章,只是数据系列的结束,所以大家不用担心,我们会持续的更新干货文章. 生命不息,更新不止! 今天我们就不那么多废话了,直接干货开始. 我 ...

  2. SQL语法之初级增删改查

    SQL语法之初级增删改查 1.增 1.1插入单行 INSERT INTO [表名](列名) VALUES(列值) 语法如下: INSERT INTO bsp_Nproductclass(guid,pi ...

  3. get,post,put,delete四种基础方法对应增删改查

    PUT,DELETE,POST,GET四种基础方法对应增删改查 1.GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改.增加数 ...

  4. SQL简单语句(增删改查)

    简单的SQL语句增删改查操作 说明: 在mysql里面亲测结果正确    用到的表(学生表:studnets) 1.创建一个学生表,(学号,姓名,性别,家庭住址) mysql> create t ...

  5. VS连接SQL Server数据库,增删改查详细教程(C#代码)_转载

    工具: 1.Visual Studio (我使用的是vs2013) 2.SQL Server  (我使用的是sql server2008) 操作: 1.打开SQL Server,打开后会看到数据库的初 ...

  6. MySQL 之基础操作及增删改查等

    一:MySQL基础操作 使用方法: 方式一: 通过图型界面工具,如 Navicat,DBeaver等 方式二: 通过在命令行敲命令来操作 SQL ( Structure query language ...

  7. Sql Server——数据的增删改

    所谓数据的增删改就是在创建好数据库和表后向表中添加数据.删除表中的数据.更改表中的一些数据. 新增数据: 语法一: insert into 表名 values (数据内容)        --这里需要 ...

  8. SQL学习之简单增删改查

    SQL最常用的语句,就是增删改查: 增删改查的对象,分别是库(文件夹),表(文件),表的内容(表的记录): 一.创建一个基本的表 #create table Student_Info (Name VA ...

  9. Python 模拟SQL对文件进行增删改查

    #!/usr/bin/env python # _*_ coding:UTF-8 _*_ # __auth__: Dalhhin # Python 3.5.2,Pycharm 2016.3.2 # 2 ...

  10. mybatis学习(五)——增删改查及自增主键的获取

    一.mybatis的增删改查 1.修改hotelMapper接口 package com.pjf.mybatis.dao; import com.pjf.mybatis.po.Hotel; publi ...

随机推荐

  1. Codeforces Round #418 (Div. 2)

    A: 不细心WA了好多次 题意:给你一个a序列,再给你个b序列,你需要用b序列中的数字去替换a序列中的0,如果能够替换,则需要判断a是否能构成一个非递增的序列,a,b中所有的数字不会重复 思路:就是一 ...

  2. jsp页面时间戳转换为时间格式

    jstl中格式化时间戳   在jsp页面中使用jstl标签将long型的时间戳转换为格式化后的时间字符串 1.通过<jsp:useBean /> 导入java.util.Date类2.通过 ...

  3. 2017-12-04 编写Visual Studio Code插件初尝试

    参考官方入门: Your First Visual Studio Code Extension - Hello World 源码在: program-in-chinese/vscode_helloWo ...

  4. 每天学点SpringCloud(五):如何使用高可用的Eureka

    前几篇文章我们讲了一下Eureka的基础使用,但是呢有一个很重要的问题,我们讲的都是单机版的情况,如果这个时候Eureka服务挂了的话,那么我们的服务提供者跟服务消费者岂不是都废了?服务提供者和消费者 ...

  5. VMware虚拟机磁盘操作占用过高问题

    使用虚拟机运行Linux图形桌面时,经常因为一个网页或者编译某个程序就导致虚拟机卡死,甚至影响主机使用.明明主机内存有8G,分配给虚拟机的内存也不少,为什么就这么卡顿.打开主机上的任务管理器查看发现磁 ...

  6. MyBatis 的 XML 配置文件使用说明

    简介 MyBatis 的配置文件(默认名称为 mybatis-config.xml)包含了会深深影响 MyBatis 行为的设置(settings)和属性(properties)信息.文档的顶层结构如 ...

  7. Kubernetes 笔记 02 demo 初体验

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 从前面的文章我 ...

  8. 一位90后的自述:如何从年薪3w到30w

    作者介绍:90后生人/男/二本本科/世界500强技术主管 1.引言 上海小胖,曾就职于pwc(普华永道)担任TechLeader,带领DS(Data Scientist)团队完成全美医疗保险大数据项目 ...

  9. 深入理解OkHttp源码(二)——获取响应

    首先先看一张流程图,该图是从拆轮子系列:拆 OkHttp 中盗来的,如下: 在上一篇博客深入理解OkHttp源码(一)——提交请求中介绍到了getResponseWithInterceptorChai ...

  10. 《JQuery技术内幕》读书笔记——自调用匿名函数剖析

    Javascript语言中的自调用匿名函数格式如下: (function(){ //do somethings })(); 它还有另外两种等价写法如下: //等价写法一 (function(){ // ...