当前位置:网站首页>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 表中的数据完全同步
边栏推荐
- Study summary of postgraduate entrance examination in September
- 【华为机试真题详解】高矮个子排队
- ThreadLocal is not enough
- Kotlin realizes wechat interface switching (fragment exercise)
- [sword finger offer] 42 Stack push in and pop-up sequence
- 嵌入式工程师如何提高工作效率
- About hzero resource error (groovy.lang.missingpropertyexception: no such property: weight for class)
- Multisim--软件相关使用技巧
- Trajectory planning for multi-robot systems: Methods and applications 综述阅读笔记
- table宽度比tbody宽度大4px
猜你喜欢
P1223 排队接水/1319:【例6.1】排队接水
P1031 [NOIP2002 提高组] 均分纸牌
Basic introduction of yarn and job submission process
使用Tansformer分割三维腹部多器官--UNETR实战
[higherhrnet] higherhrnet detailed heat map regression code of higherhrnet
[STM32] solution to the problem that SWD cannot recognize devices after STM32 burning program
软考一般什么时候出成绩呢?在线蹬?
高级软考(网络规划设计师)该如何备考?
JMeter installation
南航 PA3.1
随机推荐
Schnuka: machine vision positioning technology machine vision positioning principle
JMeter installation
1324: [example 6.6] integer interval
XML configuration file parsing and modeling
小程序跳转H5,配置业务域名经验教程
Experience sharing of software designers preparing for exams
[detailed explanation of Huawei machine test] tall and short people queue up
原型与原型链
[second on] [jeecgboot] modify paging parameters
Socket communication principle and Practice
Study summary of postgraduate entrance examination in September
String formatting
中级软件评测师考什么
2022年上半年5月网络工程师试题及答案
Multisim--软件相关使用技巧
Talking about the return format in the log, encapsulation format handling, exception handling
[homework] 2022.7.6 write your own cal function
Common shortcut keys in IDA
BUUCTF---Reverse---reverse1
Easyexcel read write simple to use