当前位置:网站首页>SQL Server 知识汇集9 : 修改数据
SQL Server 知识汇集9 : 修改数据
2022-07-07 08:31:00 【꧁小ۣۖิ鸽ۣۖิ子ۣۖิ꧂】
第9节.修改数据
1. insert语句
insert语句向表中添加新行,以下是 insert语句的最基本形式:
INSERT INTO table_name (column_list)
VALUES (value_list);
首先, table_name 指定要插入的表的名称。 通常,通过模式名称引用表名称,
例如 production.products ,其中 production 是模式名称, products 是表名称。
其次, column_list 指定要在其中插入数据的一个或多个列的列表。必须将列列表括在括号中并用逗号 分隔列。
如果列在列列表中没有出现,则SQL Server必须能够提供插入值,否则无法插入行。
SQL Server自动对表中可用的列使用以下值,但不会出现在 INSERT 语句的列列表中:
如果列具有[IDENTITY]属性,则为下一个增量值。
如果列具有指定的默认值,则为默认值。
如果列的数据类型是时间戳数据类型(timestamp),则默认为当前时间戳值。
如果列可以为 NULL 值,则使用 NULL 。
第三,要在 VALUES 子句中提供插入的值列表。 列列表中的每列必须在值列表中具有相应的值。 此外, 必须将值列表括在括号中。
创建一个名为 promotions 的新表:
CREATE TABLE sales.promotions (
promotion_id INT PRIMARY KEY IDENTITY (1, 1),
promotion_name VARCHAR (255) NOT NULL,
discount NUMERIC (3, 2) DEFAULT 0,
start_date DATE NOT NULL,
expired_date DATE NOT NULL
);
在sales模式中创建了一个名为promotions的新表。 promotions表有五列,包括:促销标识号
(promotion_id),名称(name),折扣(discount),开始日期(start_date)和过期日期
(expired_date)。
promotion_id是标识列,因此当向表中添加新行时,SQL Server会自动填充其值。
1.基本INSERT
以下语句将新行插入 promotions 表:
INSERT INTO sales.promotions (
promotion_name,
discount,
start_date,
expired_date
)
VALUES
(
'2020夏季促销',
0.25,
'20200601',
'20200901'
);
在此示例中,为 promotions 表中的四列指定了值。但没有为 promotion_id 列指定值,因为SQL Server会自动为此列提供值。
如果 INSERT 语句成功执行,将返回插入的行数。
(1 row affected)
要验证插入操作结果
SELECT
*
FROM
sales.promotions;
2.将显式值插入标识列
通常,不为标识列指定值,因为SQL Server将自动提供值。但是,在某些情况下,可能希望在标识列中插入值,例如数据迁移要为标识列插入显式值,必须首先执行以下语句:
SET IDENTITY_INSERT table_name ON;
要关闭标识插入,请使用类似的语句:
SET IDENTITY_INSERT table_name OFF;
在 promotion 表中插入标识列的值:
SET IDENTITY_INSERT sales.promotions ON;
INSERT INTO sales.promotions (
promotion_id,
promotion_name,
discount,
start_date,
expired_date
)
VALUES
(
2,
'2020春季促销',
0.25,
'20200201',
'20200301'
);
SET IDENTITY_INSERT sales.promotions OFF;
3.Insert多行
要一次向表中添加多行,请使用以下形式的 INSERT 语句:
INSERT INTO table_name (column_list)
VALUES
(value_list_1),
(value_list_2),
...
(value_list_n);
在此语法中,不使用单个值列表,而是使用多个以逗号分隔的值列表进行插入。
使用此形式的 INSERT 语句,一次可以插入的行数为 1000 行
如果尚未创建 promotions 表,则可以使用以下 CREATE TABLE 语句:
drop table if exists sales.promotions;
CREATE TABLE sales.promotions (
promotion_id INT PRIMARY KEY IDENTITY (1, 1),
promotion_name VARCHAR (255) NOT NULL,
discount NUMERIC (3, 2) DEFAULT 0,
start_date DATE NOT NULL,
expired_date DATE NOT NULL
);
以下语句将多个行添加到 promotions 表:
-- 先删除表中的所有记录
DELETE FROM sales.promotions;
-- 开始插入
INSERT INTO sales.promotions (
promotion_name,
discount,
start_date,
expired_date
)
VALUES
(
'2020夏季促销',
0.15,
'20200601',
'20200901'
),
(
'2020秋季促销',
0.20,
'20201001',
'20201101'
),
(
'2020冬季促销',
0.25,
'20201201',
'20210101'
);
2. insert into select语句
要将其他表中的数据插入另一个表中,请使用以下SQL Server INSERT INTO SELECT 语句:
INSERT [ TOP ( expression ) [ PERCENT ] ]
INTO target_table (column_list)
select_query
在此语法中,查询语句返回的行将插入 target_table 。
该查询是从任何其他表中检索数据的有效 SELECT 语句。
它必须返回与 column_list 中指定的列对应的数据
为了方便演示,下面创建一张 addresses 表:
CREATE TABLE sales.addresses (
address_id INT IDENTITY PRIMARY KEY,
street VARCHAR (255) NOT NULL,
city VARCHAR (50),
state VARCHAR (25),
zip_code VARCHAR (5)
);
1.将表的所有行插入另一张表
以下语句将 customers 表中的所有地址都插入到 addresses 表中:
INSERT INTO sales.addresses (street, city, state, zip_code)
SELECT
street,
city,
state,
zip_code
FROM
sales.customers
ORDER BY
first_name,
last_name;
要验证插入结果,请使用以下查询:
SELECT
*
FROM
sales.addresses;
3.update语句
要修改表中的现有数据,请使用以下 UPDATE 语句语法:
UPDATE table_name
SET c1 = v1, c2 = v2, ... cn = vn
[WHERE condition]
在上面语法中,
首先,指定要从中更新数据的表的名称。
其次,指定要更新的列 c1 , c2 , … , cn 和值 v1 , v2 , … vn 的列表。
第三,在 WHERE 子句中指定条件以选择更新的行。WHERE子句是可选的。 如果不指定 WHERE 子 句,则表中的所有行都将更新。
创建一个名为 taxes 的新表。
drop table if exists sales.taxes;
CREATE TABLE sales.taxes (
tax_id INT PRIMARY KEY IDENTITY (1, 1),
state VARCHAR (50) NOT NULL UNIQUE,
state_tax_rate DEC(3, 2),
avg_local_tax_rate DEC(3, 2),
combined_rate AS state_tax_rate + avg_local_tax_rate,
max_local_tax_rate DEC (3, 2),
updated_at datetime
);
执行以下语句将数据插入 taxes 表:
INSERT INTO
sales.taxes(state,state_tax_rate,avg_local_tax_rate,max_local_tax_rate)
VALUES('Alabama',0.04,0.05,0.07);
INSERT INTO
sales.taxes(state,state_tax_rate,avg_local_tax_rate,max_local_tax_rate)
VALUES('Alaska',0,0.01,0.07);
1.更新所有行
以下语句更新 taxs 表中所有行的单个列:
UPDATE sales.taxes
SET updated_at = GETDATE();
在此示例中,语句将 updated_at 列中的值更改为 GETDATE() 函数返回的系统日期时间。
SQL Server发出以下消息:
(2 rows affected)
这表示有 2 行记录已成功更新。
下面通过以下查询来验证更新结果:
SELECT
*
FROM
sales.taxes;
从输出中可以清楚地看到, updated_at 列已使用当前日期值进行更新。
2.更新多列示例
对于最高当地税率为 1% 的州,以下语句将最高当地税率提高 2% ,以及平均税率提高 1% 。
UPDATE sales.taxes
SET max_local_tax_rate += 0.02,
avg_local_tax_rate += 0.01
WHERE
max_local_tax_rate = 0.01;
4. delete语句
要删除表中的现有数据,请使用以下 DELETE 语句语法:
DELETE FROM table_name
[WHERE condition]
在上面语法中
首先,指定要从中删除数据的表的名称。
其次,在 WHERE 子句中指定条件以选择删除的行。WHERE子句是可选的。 如果不指定 WHERE 子 句,则表中的所有行都将被删除。
以sales.taxes为例
删除 sales.taxes 表中 state(州) 为 ‘Alabama’的数据
delete from sales.taxes where state= 'Alabama' ;
----------
(1 行受影响)
删除表中所有数
delete from sales.taxes ;
5.Merge语句
假设有两个表名为: source 表和 target 表,并且需要根据 source 表中匹配的值更新 target 表。
有 三种情况:
source 表有一些 target 表中不存在的行。在这种情况下,需要将 source 表中的行插入到 target 表中。
target 表有一些 source 表中不存在的行。 在这种情况下,需要从 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 表中删除行。
1. SQL Server MERGE语句示例
假设有两个表: sales.category 和 sales.category_staging ,它们按产品类别存储销售额。
参考以 下创建语句:
CREATE TABLE sales.category (
category_id INT PRIMARY KEY,
category_name VARCHAR(255) NOT NULL,
amount DECIMAL(10 , 2 )
);
INSERT INTO sales.category(category_id, category_name, amount)
VALUES(1,'Children Bicycles',15000),
(2,'Comfort Bicycles',25000),
(3,'Cruisers Bicycles',13000),
(4,'Cyclocross Bicycles',10000);
CREATE TABLE sales.category_staging (
category_id INT PRIMARY KEY,
category_name VARCHAR(255) NOT NULL,
amount DECIMAL(10 , 2 )
);
INSERT INTO sales.category_staging(category_id, category_name, amount)
VALUES(1,'Children Bicycles',15000),
(3,'Cruisers Bicycles',13000),
(4,'Cyclocross Bicycles',20000),
(5,'Electric Bikes',10000),
(6,'Mountain Bikes',10000);
要使用 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 表中的数据完全同步
边栏推荐
- 多线程-异步编排
- 555 circuit details
- 【作业】2022.7.6 写一个自己的cal函数
- [STM32] solution to the problem that SWD cannot recognize devices after STM32 burning program
- 2022.7.5DAY597
- php \n 换行无法输出
- Pre knowledge reserve of TS type gymnastics to become an excellent TS gymnastics master
- Talking about the return format in the log, encapsulation format handling, exception handling
- Some properties of leetcode139 Yang Hui triangle
- ArrayList thread insecurity and Solutions
猜你喜欢
Using U2 net deep network to realize -- certificate photo generation program
IIC基本知识
1323:【例6.5】活动选择
【实战】霸榜各大医学分割挑战赛的Transformer架构--nnFormer
Multithreaded asynchronous orchestration
字符串格式化
P1223 queuing for water /1319: [example 6.1] queuing for water
P1031 [NOIP2002 提高组] 均分纸牌
求方程ax^2+bx+c=0的根(C语言)
【STM32】STM32烧录程序后SWD无法识别器件的问题解决方法
随机推荐
Encrypt and decrypt stored procedures (SQL 2008/sql 2012)
Slurm资源管理与作业调度系统安装配置
2022.7.5DAY597
Application of OpenGL gllightfv function and related knowledge of light source
Jump to the mobile terminal page or PC terminal page according to the device information
ArrayList thread insecurity and Solutions
P2788 数学1(math1)- 加减算式
Remote meter reading, switching on and off operation command
CC2530 ZigBee iar8.10.1 environment construction
Hdu-2196 tree DP learning notes
The width of table is 4PX larger than that of tbody
Trajectory planning for multi robot systems: methods and Applications Overview reading notes
原型与原型链
[higherhrnet] higherhrnet detailed heat map regression code of higherhrnet
Multithreaded asynchronous orchestration
关于easyflash v3.3使用过程的记录
软考中级,软件设计师考试那些内容,考试大纲什么的?
想考中级软考,一般需要多少复习时间?
使用Tansformer分割三维腹部多器官--UNETR实战
CSAPP Bomb Lab 解析