总览
DDL
序号 | 语言分类 | 操作 | 关键字 |
---|
1 | 数据定义语言 DDL | 创建表(临时表) | CREATE TABLE(CREATE TEMPORARY TABLE) |
2 | 数据定义语言 DDL | 创建表复制 | CREATE TABLE… AS…; |
3 | 数据定义语言 DDL | 修改表——添加,删除,修改,重命名列 | ALTER TABLE…ADD/DROP COLUMN/COLUMN/CHANGE…; |
4 | 数据定义语言 DDL | 删除表 | DROP TABLE |
5 | 数据定义语言 DDL | 清空表 | TRUNCATE TABLE |
6 | 数据定义语言 DDL | 重命名表 | RENAME TABLE…TO…; |
DML
序号 | 语言分类 | 操作 | 关键字 |
---|
1 | 数据操作语言 DML | 插入数据 | INSERT INTO…VALUES…; |
2 | 数据操作语言 DML | 更新数据 | UPDATE…SET…; |
3 | 数据操作语言 DML | 删除数据 | DELETE FROM…WHERE…; |
4 | 数据操作语言 DML | 合并数据 | MERGE INTO…; |
DQL
序号 | 语言分类 | 操作 | 关键字 |
---|
1 | 数据查询语言 DQL | 选择数据 | SELECT…FROM…WHERE…; |
2 | 数据查询语言 DQL | 联合查询 | SELECT…FROM…UNION…SELECT…FROM…; |
DCL
序号 | 语言分类 | 操作 | 关键字 |
---|
1 | 数据控制语言 DCL | 授予权限 | GRANT…ON…TO…; |
2 | 数据控制语言 DCL | 撤销权限 | REVOKE…ON…FROM…; |
3 | 数据控制语言 DCL/事物控制语言 TCL | 开始事物 | START TRANSACTION; |
4 | 数据控制语言 DCL/事物控制语言 TCL | 提交事物 | COMMIT; |
5 | 数据控制语言 DCL/事物控制语言 TCL | 回滚事物 | ROLLBACK; |
6 | 数据控制语言 DCL/事物控制语言 TCL | 保存点 | SAVEPOINT |
适用于大多数关系型数据库管理系统(RDBMS),如MySQL,PostgreSQL、SQL Server、Oracle等。不过,具体语法和功能可能会根据不同的数据库系统有所差异。
详细解释及语法示例(本篇只含DDL与DML,其余详解会在(二)中展示)
DDL
创建表
语法
CREATE TABLE table_name (
column1 datatype constraints,
column2 datatype constraints,...
);
解释:
元素 | 解释 |
---|
CREATE TABLE table_name | 指定要创建的新表的名称 |
table_name | 新表的名称,必须遵循数据库系统对表名的命名规则 |
() | 定义表中的列(字段)以及它们的属性 |
column1, column2, … | 列的名称。在定义列时,需要为每个列指定一个唯一的名称。 |
datatype | 列的数据类型,定义该列可以存储的数据种类。例如,INT, VARCHAR, DATE, DECIMAL 等 |
constraints | 可选用于指定对列数据的限制或规则,常见的约束包括 NOT NULL(不允许空值)、PRIMARY KEY(主键)、FOREIGN KEY(外键)、UNIQUE(唯一值)、CHECK(检查特定条件)和 DEFAULT(默认值)。 |
示例
CREATE TABLE employees (
id INT PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
birth_date DATE,
salary DECIMAL(10, 2) CHECK (salary > 0)
);
解释:
创建了一个名为 employees 的新表。
id 列是一个整数类型,被设置为主键,这意味着它的值必须是唯一的,并且不能为空。
first_name 和 last_name 列是可变长度的字符串,最大长度为50个字符,并且不允许为空值。
birth_date 列是日期类型,可以存储员工的出生日期。
salary 列是十进制类型,可以存储带有两位小数的数值。还有一个检查约束,确保存储的薪水值大于0。
注意事项:
序号 | 事项 |
---|
1 | 在创建表时,应该仔细考虑每个列的数据类型和约束,以确保数据的完整性和准确性。 |
2 | 在某些数据库系统中,表名和列名可能对大小写敏感,因此需要根据数据库的具体规则来命名。 |
3 | 创建表之前,需要检查数据库中是否已经存在同名的表,以避免命名冲突。 |
4 | 在创建表时,还可以指定其他表级约束,如 INDEX(索引)或 REFERENCES(引用其他表的外键)。 |
创建临时表
临时表是一种特殊类型的表,它仅在当前数据库会话中存在,当会话结束时,临时表及其数据会被自动删除。
语法:
CREATE TEMPORARY TABLE table_name (
...
);
解释:
元素 | 解释 |
---|
CREATE TEMPORARY TABLE | SQL关键字,用于指示接下来的操作是关于创建一个临时表的。 |
table_name | 临时表的名称 |
() | 定义了临时表中的列(字段)以及它们的属性,与创建常规表时的列定义相同,包括列名、数据类型和可选的约束条件 |
示例:
CREATE TEMPORARY TABLE temp_employees (
id INT,
name VARCHAR(100),
department VARCHAR(50)
);
解释:
创建了一个名为 temp_employees 的临时表
有三个列:
id(整数类型),
name(可变长度字符串,最大长度为100个字符),
department(可变长度字符串,最大长度为50个字符)
注意事项:
序号 | 事项 |
---|
1 | 临时表仅在创建它的数据库会话中可见,其他会话无法访问它,即使它们有足够的权限也不行。 |
2 | 当创建临时表的会话结束时(例如,当用户断开连接或执行了 END 语句),数据库系统会自动删除临时表及其所有数据。 |
3 | 临时表可以具有与常规表相同的结构,包括索引、触发器、约束等。 |
4 | 在某些数据库系统中,临时表可以有全局和会话两种范围。全局临时表在所有会话中可见,直到创建它的会话结束;而会话临时表仅在创建它的会话中可见。 |
5 | 临时表通常用于存储中间结果或进行复杂的数据操作,而不需要将数据永久存储在数据库中。 |
创建表复制
基于现有表的数据创建一个新表
语法:
CREATE TABLE new_table_name AS SELECT * FROM existing_table_name;
解释:
元素 | 解释 |
---|
CREATE TABLE | 指示接下来的操作是关于创建一个新表 |
new_table_name | 新表选择的名称。 |
AS | 用于将 CREATE TABLE 语句与 SELECT 语句连接起来,表示新表的结构和数据将基于 SELECT 语句的结果。 |
SELECT * FROM existing_table_name | 用于从现有表中检索所有列的数据 |
* | 通配符,表示选择所有列 |
existing_table_name | 是想要从中复制数据的现有表的名称 |
1.SELECT * FROM existing_table_name 首先执行,从 existing_table_name 表中选择所有列的数据。
2.然后,数据库系统使用这些数据创建一个新表 new_table_name。
3.新表 new_table_name 将具有与 existing_table_name 相同的列和数据类型,但是它不复制任何表级属性,如索引、触发器或约束(除了 NOT NULL 约束,如果原表列上有这个约束,新表列也会有)。
示例:
CREATE TABLE new_employees AS SELECT * FROM employees;
解释:
创建了一个名为 new_employees 的新表,它包含 employees 表中所有列的数据
注意事项:
序号 | 事项 |
---|
1 | 新表 new_table_name 是一个独立的实体,对它的更改不会影响原始表 existing_table_name。 |
2 | 如果 existing_table_name 表中有任何约束(如主键、外键或唯一约束),这些约束不会自动复制到新表 new_table_name 中。 |
3 | 如果只想复制表结构而不复制数据,可以使用 CREATE TABLE new_table_name LIKE existing_table_name;(在某些数据库系统中有效)。 |
4 | 在创建新表之前,确保你有足够的权限来执行这个操作,并且新表名在数据库中是唯一的,以避免命名冲突。 |
5 | 在执行这个操作之前,可能需要考虑性能影响,特别是如果 existing_table_name 包含大量数据时 |
修改表
一、添加列
向现有数据库表添加一个新的列(字段)。
语法:
ALTER TABLE table_name ADD column_name datatype;
解释:
元素 | 解释 |
---|
ALTER TABLE | 用于指示接下来的操作是关于修改一个已经存在的表的结构。 |
table_name | 要添加新列的表的名称 |
ADD | 用于指示想要向表中添加一个新的列 |
column_name | 新列的名称 |
datatype | 这是新列的数据类型,它定义了该列可以存储的数据种类。例如,INT, VARCHAR, DATE, DECIMAL 等。 |
示例:
ALTER TABLE employees ADD email VARCHAR(100);
解释:
向名为 employees 的表中添加了一个名为 email 的新列,其数据类型为 VARCHAR,最大长度为100个字符
扩展:
ALTER TABLE employees ADD email VARCHAR(100) NOT NULL;
NOT NULL 约束确保了 email 列在插入新行时必须有值,不能为空。
注意事项:
序号 | 事项 |
---|
1 | 在添加新列时,你可能还需要指定其他属性,如 NOT NULL(不允许空值)、DEFAULT(默认值)等约束。 |
2 | 在某些数据库系统中,添加列可能会触发相关触发器或影响依赖于该表的其他数据库对象。 |
3 | 添加列通常是一个即时操作,但可能会根据表中已有数据量的多少而耗费不同时间。 |
4 | 在执行 ALTER TABLE 操作之前,建议先备份数据库,以防万一操作失败导致数据丢失或损坏。 |
5 | 使用此语句需要足够的权限来修改表结构。 |
二、删除列
从现有数据库表中删除一个列(字段)
语法:
ALTER TABLE table_name DROP COLUMN column_name;
解释:
元素 | 解释 |
---|
ALTER TABLE | SQL关键字,用于指示接下来的操作是关于修改一个已经存在的表的结构。 |
table_name | 这是你要从中删除列的表的名称。 |
DROP COLUMN | SQL关键字,用于指示你想要从表中删除一个列。 |
column_name | 这是你要删除的列的名称。 |
示例:
ALTER TABLE employees DROP COLUMN email;
解释:
从名为 employees 的表中删除了一个名为 email 的列。
注意事项:
序号 | 事项 |
---|
1 | 在删除列之前,请确保该列不是任何数据库约束(如主键、外键或唯一约束)的一部分,因为这些约束可能依赖于该列的存在。 |
2 | 删除列将永久移除该列及其所有数据,因此操作之前应仔细考虑。 |
3 | 在某些数据库系统中,删除列可能会触发相关触发器或影响依赖于该表的其他数据库对象,如视图或存储过程。 |
4 | 删除列的操作通常是不可逆的,一旦执行,被删除的数据将无法恢复(除非有数据库备份)。 |
5 | 在执行 ALTER TABLE 操作之前,建议先备份数据库,以防万一操作失败导致数据丢失或损坏。 |
6 | 使用此语句需要足够的权限来修改表结构。 |
三、修改列
用于修改现有数据库表中某个列的数据类型
语法:
ALTER TABLE table_name MODIFY COLUMN column_name datatype;
解释:
元素 | 解释 |
---|
ALTER TABLE | SQL关键字,用于指示接下来的操作是关于修改一个已经存在的表的结构。 |
table_name | 要修改列的表的名称 |
MODIFY COLUMN | SQL关键字,用于指示想要修改表中某个列的属性。 |
column_name | 要修改的列的名称 |
datatype | 这是新的数据类型,希望列在修改后使用的数据类型。例如,INT, VARCHAR, DATE, DECIMAL 等。 |
示例:
ALTER TABLE employees MODIFY COLUMN salary DECIMAL(10, 2);
解释:
将名为 employees 的表中 salary 列的数据类型修改为 DECIMAL(10, 2)
这意味着 salary 列可以存储最多10位数字,其中包括2位小数。
注意事项:
序号 | 事项 |
---|
1 | 在修改列的数据类型时,必须确保新的数据类型与现有数据兼容,否则可能会出现数据丢失或精度问题。 |
2 | 如果列中已有数据,且新数据类型与旧数据类型不兼容,数据库可能会拒绝执行该操作,或者需要额外的转换步骤。 |
3 | 在某些数据库系统中,如果列上存在任何约束(如 NOT NULL、DEFAULT 等),你可能需要在修改数据类型的同时重新指定这些约束。 |
4 | 在修改列的数据类型之前,建议先备份数据库,以防万一操作失败导致数据丢失或损坏。 |
5 | 使用此语句需要足够的权限来修改表结构。 |
在某些数据库系统中,如MySQL,可能需要使用稍微不同的语法:
ALTER TABLE employees MODIFY salary DECIMAL(10, 2);
如Oracle,语法可能会有所不同:
ALTER TABLE employees MODIFY (salary DECIMAL(10, 2));
四、重命名列
语法:
ALTER TABLE table_name CHANGE old_column_name new_column_name datatype;
解释:
元素 | 解释 |
---|
ALTER TABLE | SQL关键字,用于指示接下来的操作是关于修改一个已经存在的表的结构。 |
table_name | 要修改列的表的名称 |
CHANGE | SQL关键字,用于指示想要更改表中某个列的名称,并且可以选择性地更改其数据类型。 |
old_column_name | 这是当前存在于表中,你想要重命名和/或更改数据类型的列的名称 |
new_column_name | 这是新的列名称,将 old_column_name 改成这个名称 |
datatype | 这是新的数据类型,你希望列在重命名后使用的数据类型。例如,INT, VARCHAR, DATE, DECIMAL 等。 |
示例:
ALTER TABLE employees CHANGE salary annual_salary DECIMAL(10, 2);
解释:
将名为 employees 的表中 salary 列的名称更改为 annual_salary
并且将其数据类型修改为 DECIMAL(10, 2)
这意味着 annual_salary 列可以存储最多10位数字,其中包括2位小数。
注意事项:
序号 | 事项 |
---|
1 | 在更改列的名称和数据类型时,必须确保新的数据类型与现有数据兼容,否则可能会出现数据丢失或精度问题。 |
2 | 如果列中已有数据,且新数据类型与旧数据类型不兼容,数据库可能会拒绝执行该操作,或者需要额外的转换步骤。 |
3 | 在某些数据库系统中,如果列上存在任何约束(如 NOT NULL、DEFAULT 等),你可能需要在更改数据类型的同时重新指定这些约束。 |
4 | 在更改列的名称和数据类型之前,建议先备份数据库,以防万一操作失败导致数据丢失或损坏。 |
5 | 使用此语句需要足够的权限来修改表结构。 |
6 | 如果只想更改列的名称而不更改数据类型,可以在 CHANGE 子句中重复旧的数据类型。 |
删除表
语法:
DROP TABLE table_name;
解释:
元素 | 解释 |
---|
DROP TABLE | SQL关键字,用于指示接下来的操作是关于从数据库中删除一个表。 |
table_name | 这是要删除的表的名称。 |
示例:
DROP TABLE employees;
解释:
删除了名为 employees 的表。
注意事项:
序号 | 事项 |
---|
1 | 删除表是一个永久性的操作,一旦执行,表及其所有内容都将被永久移除,并且无法恢复(除非有数据库备份)。 |
2 | 在删除表之前,应该仔细考虑,因为这可能会影响到依赖于该表的其他数据库对象,如视图、存储过程、触发器或外键约束。 |
3 | 如果其他表中的外键约束引用了要删除的表,那么删除操作可能会失败,除非你使用额外的SQL语句来首先删除或修改这些外键约束。 |
4 | 在执行 DROP TABLE 操作之前,建议先备份数据库,以防万一操作失误导致数据丢失。 |
5 | 使用此语句需要足够的权限来删除表。 |
6 | 在某些数据库系统中,删除表可能会导致存储空间未被回收,需要定期执行维护操作来优化数据库性能。 |
清空表
语法:
TRUNCATE TABLE table_name;
解释:
元素 | 解释 |
---|
TRUNCATE TABLE | SQL关键字,用于指示接下来的操作是关于清空表中的所有数据行。 |
table_name: | 需要清空数据的表的名称。 |
示例:
TRUNCATE TABLE employees;
解释:
清空了名为 employees 的表中的所有数据行
但是表结构(包括列定义、索引、约束等)保持不变。
注意事项:
序号 | 事项 |
---|
1 | TRUNCATE TABLE 语句删除表中的所有数据行,这个过程比逐行删除数据(例如,使用 DELETE FROM table_name;)要快得多,因为它不记录每行删除的日志,而是直接删除数据文件中的内容。 |
2 | 与 DELETE 语句不同,TRUNCATE TABLE 不会激活与删除行相关的触发器(如 DELETE 触发器)。 |
3 | 执行 TRUNCATE TABLE 操作后,表中的自增列(如果有的话)通常会重置为起始值。 |
4 | 在某些数据库系统中,TRUNCATE TABLE 可能不支持事务回滚,即一旦执行,就无法撤销操作(除非有数据库备份)。 |
5 | 使用此语句需要足够的权限来清空表。 |
6 | 在执行 TRUNCATE TABLE 操作之前,建议先备份数据库,以防万一操作失误导致数据丢失。 |
7 | 在多用户环境中,执行 TRUNCATE TABLE 可能会影响其他用户或系统正在使用的数据,因此在执行之前应通知所有可能受影响的用户或系统。 |
TRUNCATE TABLE 通常用于测试环境中快速清除数据,或者在不再需要表中数据但希望保留表结构的情况下使用。在生产环境中使用之前,应该非常谨慎,并确保不会影响到业务流程。
重命名表
语法:
RENAME TABLE old_table_name TO new_table_name;
解释:
元素 | 解释 |
---|
RENAME TABLE | SQL关键字,用于指示接下来的操作是关于更改表的名称。 |
old_table_name | 要更改名称的表的当前名称。 |
TO | 关键字,用于分隔旧表名和新表名,表明 old_table_name 将被重命名为后面的 new_table_name。 |
new_table_name | 这是新的表名称,将 old_table_name 改成这个名称。 |
示例:
RENAME TABLE employees TO staff;
解释:
将名为 employees 的表重命名为 staff。
注意事项:
序号 | 事项 |
---|
1 | 使用 RENAME TABLE 语句之前,应该确保新的表名在数据库中是唯一的,以避免命名冲突。 |
2 | 更改表名不会影响表中的数据或表结构,只是改变了表的名称。 |
3 | 在某些数据库系统中,RENAME TABLE 可能不支持在同一数据库中重命名表,或者可能需要管理员权限才能执行。 |
4 | 在执行 RENAME TABLE 操作之前,建议先备份数据库,以防万一操作失误导致数据丢失或损坏。 |
5 | 更改表名可能会影响依赖于该表的其他数据库对象,如视图、存储过程、触发器或外键约束。在更改表名之前,应该检查是否有其他对象依赖于该表,并确保它们可以正确地引用新的表名。 |
DML
插入数据
向数据库表中插入新的行。
语法:
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
解释:
元素 | 解释 |
---|
INSERT INTO | SQL关键字,用于指示接下来的操作是关于向表中插入数据的。 |
table_name | 想要插入数据的表的名称。 |
(column1, column2, …) | 可选的,列名列表。当你知道要插入哪些列的值时,可以使用列名列表来指定哪些列将接收值。如果省略列名列表,默认情况下,值将被插入到所有列中,前提是这些列的数据类型兼容。 |
VALUES (value1, value2, …) | 必须的,它定义了要插入的值。这些值必须与列名列表中的列顺序相对应,并且数据类型必须与列定义兼容。 |
示例:
INSERT INTO employees (id, name, department) VALUES (1, 'John Doe', 'Sales');
解释:
向名为 employees 的表中插入了一个新行
其中 id 列的值为1,name 列的值为 ‘John Doe’,department 列的值为 ‘Sales’。
注意事项:
序号 | 事项 |
---|
1 | 如果你省略了列名列表,你需要确保提供的值的数量与表中的列数相匹配,并且数据类型兼容。 |
2 | 如果你为表中的某个列提供了值,其他列(如果没有默认值或列为 NOT NULL)也必须有值,除非你使用 INSERT IGNORE 或 INSERT ON DUPLICATE KEY UPDATE 这样的语法来忽略或更新可能存在的重复行。 |
3 | 在执行 INSERT 操作之前,建议先备份数据库,以防万一操作失误导致数据丢失或损坏。 |
4 | 使用此语句需要足够的权限来插入数据。 |
5 | 如果你想要插入多个行,可以使用多个 VALUES 子句,每个子句都包含一组值 |
例如:
INSERT INTO employees (id, name, department) VALUES (2, 'Jane Smith', 'Marketing'), (3, 'Alice Johnson', 'HR');
更新数据
更新数据库表中满足特定条件的行(记录)的列值
语法:
UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition;
解释:
元素 | 解释 |
---|
UPDATE table_name | SQL关键字,用于指示接下来的操作是关于更新表中的数据的。 |
SET | SQL关键字,用于指定要更新的列及其新值。 |
column1 = value1, column2 = value2 | 这是更新操作的列值对。column1 和 column2 是表中的列名,而 value1 和 value2 是这些列的新值。 |
WHERE condition | 这是可选的,用于指定哪些行应该被更新。只有满足 WHERE 子句中指定条件的行才会被更新。 |
condition | 是一个布尔表达式,通常涉及比较操作符(如 =, <>, >, <, >=, <=)和逻辑操作符(如 AND, OR, NOT)。 |
示例:
UPDATE employees SET salary = salary * 1.10 WHERE department = 'Sales';
解释:
新了名为 employees 的表中 salary 列的值
将所有在 department 列上值为 ‘Sales’ 的行的 salary 增加10%。
注意事项:
序号 | 事项 |
---|
1 | 如果没有指定 WHERE 子句,那么表中的所有行都会被更新,这是一个非常危险的操作,因为它会更改表中的所有数据。 |
2 | 在执行 UPDATE 操作之前,通常建议先执行一个 SELECT 查询来确认将要更新的行,以确保不会意外更新错误的数据。 |
3 | 更新操作通常是不可逆的,一旦执行,被更新的数据可能无法恢复(除非有数据库备份)。 |
4 | 在某些数据库系统中,UPDATE 操作可能会触发触发器(trigger),这些触发器可能会执行额外的操作,例如记录更新日志或维护相关表的数据完整性。 |
5 | 使用 UPDATE 语句时,需要确保拥有足够的权限来执行更新操作。 |
删除数据
从数据库表中删除满足特定条件的行(记录)
语法:
DELETE FROM table_name WHERE condition;
解释:
元素 | 解释 |
---|
DELETE FROM | SQL关键字,用于指示接下来的操作是关于从表中删除数据的。 |
table_name | 要从中删除行的表的名称。 |
WHERE condition | 可选,用于指定哪些行应该被删除。只有满足 WHERE 子句中指定条件的行才会被删除 |
condition | 是一个布尔表达式,通常涉及比较操作符(如 =, <>, >, <, >=, <=)和逻辑操作符(如 AND, OR, NOT)。 |
示例:
DELETE FROM employees WHERE department = 'Sales';
解释:
删除了名为 employees 的表中 department 列上值为 ‘Sales’ 的所有行。
注意事项:
序号 | 事项 |
---|
1 | 如果省略了 WHERE 子句,那么表中的所有行都会被删除,这是一个非常危险的操作,因为它会清空整个表。 |
2 | 在执行 DELETE 操作之前,通常建议先执行一个 SELECT 查询来确认将要删除的行,以确保不会意外删除错误的数据。 |
3 | 删除操作通常是不可逆的,一旦执行,被删除的数据可能无法恢复(除非有数据库备份)。 |
4 | 在某些数据库系统中,DELETE 操作可能会触发触发器(trigger),这些触发器可能会执行额外的操作,例如记录删除日志或维护相关表的数据完整性。 |
5 | 使用 DELETE 语句时,需要确保拥有足够的权限来执行删除操作 |
合并数据
将数据从一个或多个源表合并到一个目标表中。在Oracle数据库中称为 MERGE,而在SQL Server中称为 MERGE 或 UPSERT。
语法:
MERGE INTO target_table USING source_table ON (condition)
WHEN MATCHED THEN
UPDATE SET target_table.column = source_table.column
WHEN NOT MATCHED THEN
INSERT (column_list) VALUES (value_list);
解释:
元素 | 解释 |
---|
MERGE INTO target_table | 指定了要合并数据的目标表。 |
USING source_table | 指定源表,即从中获取数据的表。source_table 是包含要合并到目标表中的数据的表。 |
ON (condition) | 这个子句定义了目标表和源表之间的匹配条件。只有当条件为真时,才会对目标表中的行执行更新或插入操作。condition 是一个布尔表达式,通常涉及两个表的列比较。 |
WHEN MATCHED THEN | 当目标表中的行与源表中的行根据 ON 子句中的条件匹配时,这个子句定义了要执行的操作。在这个子句中,可以指定 UPDATE 语句来更新目标表中的行。 |
UPDATE SET target_table.column = source_table.column: | 这个子句指定了如何更新目标表中的行。可以列出多个列和它们的新值,这些值通常来自源表。 |
WHEN NOT MATCHED THEN | 当源表中的行在目标表中没有匹配的行时,这个子句定义了要执行的操作。在这个子句中,可以指定 INSERT 语句来向目标表中插入新行。 |
INSERT (column_list) VALUES (value_list) | 这个子句指定了要插入到目标表中的新行的列和对应的值。column_list 是要插入数据的列名列表,而 value_list 是与列对应的值列表。 |
示例:
MERGE INTO employees AS target_table USING sales_reports AS source_table
ON (target_table.employee_id = source_table.employee_id)
WHEN MATCHED THEN
UPDATE SET target_table.sales_amount = source_table.sales_amount * 1.10
WHEN NOT MATCHED THEN
INSERT (employee_id, sales_amount)
VALUES (source_table.employee_id, source_table.sales_amount * 1.10);
解释:
正在修改名为 employees 的表。
根据 employee_id 列匹配 sales_reports 表中的数据。
如果 employee_id 匹配,则更新 sales_amount 列,使其增加10%。
如果 employee_id 不匹配,则插入新的行,sales_amount 列的值也增加10%。
注意事项:
序号 | 事项 |
---|
1 | MERGE 语句可能在不同数据库系统中的语法略有不同。 |
2 | 在执行 MERGE 操作之前,通常建议进行备份,因为这是一个可以更改大量数据的操作。 |
3 | 并非所有数据库系统都支持 MERGE 语句。例如,MySQL 在早期版本中不支持这个语句,但在 8.0 版本中引入了类似的功能。 |