1.Merge语句

假设有两个表名为: source 表和 target 表,

并且需要根据 source 表中匹配的值更新 target 表。

有 三种情况: source 表有一些 target 表中不存在的行。

在这种情况下,需要将 source 表中的行插入到 target 表中。

target 表有一些 source 表中不存在的行。

在这种情况下,需要从 target 表中删除行。 source 表的某些行具有与 target 表中的行相同的键。 但是,这些行在非键列中具有不同的值。 在这种情况下,需要使用来自 source 表的值更新 target 表中的行。

如果单独使用 INSERT , UPDATE 和 DELETE 语句,则必须构造三个单独的语句,以使用 source 表中的 匹配行将数据更新到 target 表。

但是,SQL Server提供 MERGE 语句以用于同时执行三个操作。

以下是 MERGE 语句的语法:

MERGE target_table USING source_table
ON merge_condition
WHEN MATCHED
THEN update_statement
WHEN NOT MATCHED
THEN insert_statement
WHEN NOT MATCHED BY SOURCE
THEN DELETE;

首先,在 MERGE 子句中指定 source_table 表和 target_table 表。

其次, merge_condition 确定 source_table 表中的行如何与 target_table 表中的行匹配。

它类似 于 join 子句中的 join 条件。

通常,使用主键或唯一键的键列进行匹配。 第三, merge_condition 有三种状态: MATCHED , NOT MATCHED 和 NOT MATCHED BY SOURCE 。

MATCHED :这些是与合并条件匹配的行。 在图中,它们显示为蓝色。 对于匹配的行,需要使用 source_table 表中的值更新 target_table 表中的行列。 NOT MATCHED

:这些是 source_table 表中的行, target_table 表中没有任何匹配的行。

在图 中,它们显示为橙色。 在这种情况下,需要将 source_table 表中的行添加到 target_table 表

。 NOT MATCHED BY TARGET 也称为目标不匹配。 NO MATCHED BY SOURCE :

这些是 target_table 表中与 source_table 表中的任何行都不匹配的 行。

它们在图中显示为绿色。 如果要将 target_table 表与 source_table 表中的数据同步,则 需要使用此匹配条件从 target_table 表中删除行。

要使用 sales.category_staging (源表)中的值将数据更新到 sales.category (目标表),请使用以下 MERGE 语句:

merge sales.category t using sales.category_staging s
on s.category_id = t.category_id
when matched
then update set t.category_name =s.category_name,t.amount = s.amount
when not matched by target
then insert (category_id,category_name,amount)
values (s.category_id,s.category_name,s.amount)
when not matched by source
then delete;

在此示例中,使用两个表中 category_id 列中的值作为合并条件。

首先, sales.category_staging 表中 id 值为 1 , 3 , 4 的行与目标表中的行匹配,

因此, MERGE 语句更新 sales.category 表中类别名称和 amount 列中的值。

其次, sales.category_staging 表中 id 值为 5 和 6 的行在 sales.category 表中不存在,

因此 MERGE 语句将这些行插入到目标表中。

第三, sales.sales_staging 表中不存在 sales.category 表中具有 id 值为 2 的行

,因此, MERGE 语句将删除此行。 在合并的结果中, sales.category 表中的数据与 sales.category_staging 表中的数据完全同步

2.SQL Server数据类型

数据类型 描述 存储
char(n) 固定长度的字符串。最多 8,000 个字符。
varchar(n) 可变长度的字符串。最多 8,000 个字符。
varchar(max) 可变长度的字符串。最多 1,073,741,824 个字符。
text 可变长度的字符串。最多 2GB 字符数据。

Unicode 字符串:

数据类型 描述 存储
nchar(n) 固定长度的 Unicode 数据。最多 4,000 个字符。
nvarchar(n) 可变长度的 Unicode 数据。最多 4,000 个字符。
nvarchar(max) 可变长度的 Unicode 数据。最多 536,870,912 个字符。
ntext 可变长度的 Unicode 数据。最多 2GB 字符数据。

VARCHAR与NVARCHAR比较

比较 项 VARCHAR NVARCHAR
字符 数据 类型 可变长度的非Unicode字符 可变长度,Unicode和非Unicode字符, 如:中文,日语和韩语。
最大 长度 最多 8000 个字符 最多 4000 个字符
字符 大小 每个字符占用 1 个字节 每个Unicode/非Unicode字符占用 2 个字节
使用 当数据长度为可变或可变长度列且 实 际数据始终小于容量时使用 仅限存储,仅在需要Unicode支持时使用, 例如:汉字,日语或韩文字符。

Binary 类型:

数据类型 描述 存储
bit 允许 0、1 或 NULL
binary(n) 固定长度的二进制数据。最多 8,000 字节。
varbinary(n) 可变长度的二进制数据。最多 8,000 字节。
varbinary(max) 可变长度的二进制数据。最多 2GB 字节。
image 可变长度的二进制数据。最多 2GB。

Number 数字类型:

数据类型 描述 存 储
tinyint 允许从 0 到 255 的所有数字。 1 字 节
smallint 允许从 -32,768 到 32,767 的所有数字。 2 字 节
int 允许从 -2,147,483,648 到 2,147,483,647 的所有数字。 4 字 节
bigint 允许介于 -9,223,372,036,854,775,808 和 9,223,372,036,854,775,807 之间的所有数字。 8 字 节
decimal(p,s) 固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。s 参数指示小数点右侧存储的最大位数。s 必须 是 0 到 p 之间的值。默认是 0。 5- 17 字 节
numeric(p,s) 固定精度和比例的数字。允许从 -10^38 +1 到 10^38 -1 之间的数字。p 参数指示可以存储的最大位数(小数点左侧和右侧)。p 必须是 1 到 38 之间的值。默认是 18。s 参数指示小数点右侧存储的最大位数。s 必须 是 0 到 p 之间的值。默认是 0。 5- 17 字 节
smallmoney 介于 -214,748.3648 和 214,748.3647 之间的货币数据。 4 字 节
money 介于 -922,337,203,685,477.5808 和 922,337,203,685,477.5807 之间的 货币数据。 8 字 节
float(n) 从 -1.79E + 308 到 1.79E + 308 的浮动精度数字数据。 参数 n 指示该字 段保存 4 字节还是 8 字节。float(24) 保存 4 字节,而 float(53) 保存 8 字 节。n 的默认值是 53。 4 或 8 字 节
real 从 -3.40E + 38 到 3.40E + 38 的浮动精度数字数据。 4 字 节

3.SQL Server创建表

CREATE TABLE语句简介 表用于在数据库中存储数据。

表在数据库和模式中唯一命名。 每个表包含一个或多个列。

每列都有一个相关的数据类型,用于定义它可以存储的数据类型,例如:数字,字符串和日期。 要创建新表,请使用 CREATE TABLE 语句,如下所示:

CREATE TABLE [database_name.][schema_name.]table_name (
pk_column data_type PRIMARY KEY,
column_1 data_type NOT NULL,
column_2 data_type,
...,
table_constraints
);

在上面的语法中, 首先,指定创建表的数据库的名称。

database_name 必须是现有数据库的名称。

如果未指定,则 database_name 默认为当前数据库。 其次, schema_name 指定新表所属的模式。 第三, table_name 指定新表的名称。

第四,每个表应该有一个由一列或多列组成的主键。

通常,首先列出主键列,然后列出其他列。

如果主键只包含一列,则可以在列名后使用 PRIMARY KEY 关键字。 如果主键由两列或更多列组 成,则需要将 PRIMARY KEY 约束指定为表约束。

每个列都在语句中的名称后面指定了关联的数据 类型。

列可能具有一个或多个列约束,例如: NOT NULL 和 UNIQUE 。 第五,表可能在表约束部分中指定了一些约束,

例如: FOREIGN KEY , PRIMARY KEY , UNIQUE 和 CHECK 。 请注意, CREATE TABLE 可以很复杂,并且具有比上述语法更多的选项。

SQL Server CREATE TABLE示例 以下语句创建一个名为 visits 的新表来跟踪客户的店内访问:

CREATE TABLE sales.visits (
visit_id INT PRIMARY KEY IDENTITY (1, 1),
first_name VARCHAR (50) NOT NULL,
last_name VARCHAR (50) NOT NULL,
visited_at DATETIME,
phone VARCHAR(20),
store_id INT NOT NULL,
FOREIGN KEY (store_id) REFERENCES sales.stores (store_id)
);

在这个示例中: 因为没有明确指定创建表的数据库名称,所以在 bb_stores 数据库中创建了 visits 表。

但是已经明确指定模式,

因此,在 sales 模式中创建了 visits 表。

visits 表中定义了 6 列,下面来看每一列的简介描述: visit_id 列是表的主键列。 IDENTITY(1,1) 指示SQL Server自动生成从 1 开始的列的整数,

并 为每个新行递增 1 。 first_name 和 last_name 列是 VARCHAR 类型的字符串列。

这些列最多可以存储 50 个字符。

visited_at 是 DATETIME 数据类型的列,记录客户访问商店的日期和时间。

phone 列是一个接受 NULL 的 VARCHAR 字符串列。 store_id 列存储标识客户访问商店的标识号。 表定义的末尾是 FOREIGN KEY 约束。

此外键确保 visit 表的 store_id 列中的值必须在 stores 表的 store_id 列中可用。可在后续教程中了解有关 FOREIGN KEY 约束的更多信息。

(1).SQL Server复制表

SQL Server中,如果目标表存在:

insert into 目标表 [column] select * from 原表;

SQL Server中,,如果目标表不存在:

select * into 目标表 from 原表

SQL Server标识列

要为表创建标识列,请使用 IDENTITY 属性,如下所示:

 IDENTITY[(seed,increment)]

Sql serever的语句相关推荐

  1. SQL update select语句

    SQL update select语句 最常用的update语法是: UPDATE <table_name> SET <column_name1> = <value> ...

  2. MySQL补充部分-SQL逻辑查询语句执行顺序

    一 SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOI ...

  3. SQL基础---SQL SELECT DISTINCT 语句

    SQL SELECT DISTINCT 语句 本章讲解 SELECT DISTINCT 语句. SQL SELECT DISTINCT 语句 在表中,可能会包含重复值.这并不成问题,不过,有时您也许希 ...

  4. mysql五补充部分:SQL逻辑查询语句执行顺序

    mysql五补充部分:SQL逻辑查询语句执行顺序一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SE ...

  5. 将EXCEL中的列拼接成SQL insert插入语句

    工作中经常需要将EXCEL文件中的数据导入到各种数据库,但是对于不熟悉数据库的人来说,如果直接使用命令执行导入,这无疑是一个难题,也是一个风险.这里我们直接在EXCEL文件中拼接成标准的SQL ins ...

  6. SQL ALTER TABLE 语句

    SQL ALTER TABLE 语句 ALTER TABLE 语句 ALTER TABLE 语句用于在已有的表中添加.删除或修改列. SQL ALTER TABLE 语法 如需在表中添加列,请使用下面 ...

  7. SQL SELECT DISTINCT 语句 用法

    SQL SELECT DISTINCT 语句 在表中,可能会包含重复值.这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值. 关键词 DISTINCT 用于返回唯一不同的值. 语法 ...

  8. 标准SQL的update语句三种用法

    标准SQL的update语句三种用法 一.环境: MySQL-5.0.41-win32 Windows XP professional   二.建立测试环境:   DROP TABLE IF EXIS ...

  9. mysql create很多table,SQL CREATE TABLE 语句

    原标题:SQL CREATE TABLE 语句 SQL CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中的表. 表由行和列组成,每个表都必须有个表名. SQL CREAT ...

最新文章

  1. linux统计文件的个数
  2. 自动驾驶中,激光雷达点云如何做特征表达
  3. 计算机软件与理论考研考试科目,2014年电子科技大学081202计算机软件与理论考研专业目录及考试科目...
  4. 图形处理(十)测地极坐标参数化
  5. Transformer、BERT学习笔记
  6. KubeOperator总体介绍(K8S集群部署管理工具)
  7. 如何开发出优秀的APICloud应用
  8. 过完年,又不想上班了?
  9. leetcode 331. 验证二叉树的前序序列化
  10. linux 安装swoole
  11. hsqldb快速入门
  12. 上一季诺基亚销售下跌28%
  13. 一招教你如何修复MySQL slave中继日志损坏问题
  14. 黑科技 | 电脑必备黑科技软件
  15. java无头浏览器_Java + Selenium 无头浏览器模式
  16. K线形态识别—多K线之买入型多日K线组合
  17. 以太坊主动数据同步简析
  18. vue-cli 3 跑项目时卡在 ‘98%’ after emitting CopyPlugin 无法运行
  19. 怎样恢复电脑丢失的文件?
  20. TCP/IP网络编程:计算器服务器端/客户端

热门文章

  1. 计算机考试的知识要记忆背,计算机考试怎么过
  2. python 排产计划_生产排程计划表
  3. 一阶电路实验报告心得_一阶电路实验报告5篇
  4. pure-specifier on function-definition
  5. 如何做简单的数据分析
  6. 为什么Y电容容量基本都不大于0.1uF?
  7. mysql的基础查阅
  8. ES term terms 查询
  9. rsa java模数_公钥/私钥中的RSA密钥值和模数
  10. 游戏技巧-《文明6》的C盘爆满问题