首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第4章 数据更新
4-1 数据的插入(INSERT语句的使用方法)
什么是INSERT
INSERT语句的基本语法
列清单的省略
插入NULL
插入默认值
从其他表中复制数据
4-2 数据的删除(DELETE语句的使用方法)
DROP TABLE语句和DELETE语句
DELETE语句的基本语法
指定删除对象的DELETE语句(搜索型DELETE)
4-3 数据的更新(UPDATE语句的使用方法)
UPDATE语句的基本语法
指定条件的UPDATE语句(搜索型UPDATE)
使用NULL进行更新
多列更新
4-4 事务
什么是事务
创建事务
ACID特性
第5章 复杂查询
5-1 视图
视图和表
创建视图的方法
视图的限制① ——定义视图时不能使用ORDER BY子句
视图的限制② ——对视图进行更新
删除视图
5-2 子查询
子查询和视图
子查询的名称
标量子查询
标量子查询的书写位置
使用标量子查询时的注意事项
5-3 关联子查询
普通的子查询和关联子查询的区别
关联子查询也是用来对集合进行切分的
结合条件一定要写在子查询中
第6章 函数、谓词、CASE表达式
6-1 各种各样的函数
函数的种类
算术函数
字符串函数
日期函数
转换函数
6-2 谓词
什么是谓词
LIKE谓词——字符串的部分一致查询
BETWEEN谓词——范围查询
IS NULL、IS NOT NULL——判断是否为NULL
IN谓词——OR的简便用法
使用子查询作为IN谓词的参数
EXIST谓词
6-3 CASE表达式
什么是CASE表达式
CASE表达式的语法
CASE表达式的使用方法
第7章 集合运算
7-1 表的加减法
什么是集合运算
表的加法——UNION
集合运算的注意事项
包含重复行的集合运算——ALL选项
选取表中公共部分——INTERSECT
记录的减法——EXCEPT
7-2 联结(以列为单位对表进行联结)
什么是联结
内联结——INNER JOIN
外联结——OUTER JOIN
3张以上的表的联结
交叉联结——CROSS JOIN
联结的特定语法和过时语法
当前位置:
首页>>
技术小册>>
SQL基础教程(中)
小册名称:SQL基础教程(中)
### 章节:从其他表中复制数据 在数据库管理中,经常需要从一个表(源表)中复制数据到另一个表(目标表)中。这种操作在数据迁移、备份、报表生成、数据整合等多种场景下都极为常见。SQL(Structured Query Language)提供了多种方法来实现从其他表中复制数据的需求,包括使用`INSERT INTO ... SELECT`语句、`CREATE TABLE AS SELECT`(在某些数据库系统中)、以及通过触发器(Triggers)或存储过程(Stored Procedures)间接实现。本章节将详细探讨这些方法的使用场景、语法及示例。 #### 1. 使用`INSERT INTO ... SELECT`语句 `INSERT INTO ... SELECT`语句是SQL中最直接、最常用的从一个表复制数据到另一个表的方法。其基本语法如下: ```sql INSERT INTO 目标表 (列1, 列2, ..., 列N) SELECT 列1, 列2, ..., 列N FROM 源表 WHERE 条件; ``` - **目标表**:数据将被插入的表。如果目标表不存在,这个操作会失败,除非数据库支持在插入时自动创建表(这非常罕见)。 - **列1, 列2, ..., 列N**:目标表中指定的列,这些列的顺序和数量应与SELECT语句中选择的列相匹配。如果省略列名,则默认插入到目标表的所有列中,但要求SELECT语句返回的列数与目标表的列数完全一致且数据类型兼容。 - **源表**:数据被复制的源表。 - **WHERE 条件**:可选,用于指定从源表中复制哪些行的数据。如果不指定,则复制所有行。 **示例**: 假设有两个表,`employees`(员工表)和`former_employees`(前员工表),我们想要将离职的员工从`employees`表复制到`former_employees`表中。 ```sql -- 假设employees表有id, name, department, status列 -- 假设former_employees表结构与employees相同 INSERT INTO former_employees (id, name, department, status) SELECT id, name, department, status FROM employees WHERE status = '离职'; ``` #### 2. 使用`CREATE TABLE AS SELECT`(特定数据库) 虽然`CREATE TABLE AS SELECT`(CTAS)不是所有数据库系统都支持的标准SQL语法,但在如PostgreSQL、MySQL(部分版本)、SQLite等系统中,它提供了一种快速从现有表复制数据并创建新表的方法。其基本语法如下: ```sql CREATE TABLE 新表 AS SELECT 列1, 列2, ..., 列N FROM 源表 WHERE 条件; ``` 注意,使用CTAS时,新表的结构将基于SELECT语句的结果集自动创建,包括列名和数据类型。但索引、约束(如主键、外键)等不会从源表继承。 **示例**: ```sql -- 创建一个包含所有离职员工信息的新表 CREATE TABLE temp_former_employees AS SELECT id, name, department, status FROM employees WHERE status = '离职'; ``` #### 3. 使用触发器(Triggers) 触发器是一种特殊类型的存储过程,它会在指定的数据库表上执行INSERT、UPDATE或DELETE操作时自动执行。虽然触发器不是直接用于复制数据的工具,但可以通过在源表上设置触发器,在数据发生变化时自动将变更同步到目标表,从而实现间接的数据复制。 **示例场景**:每当`employees`表中的员工状态更新为“离职”时,自动将该记录复制到`former_employees`表中。 **注意**:由于触发器的实现高度依赖于具体的数据库系统,以下仅为概念性示例,并非直接可执行的SQL代码。 ```sql -- 伪代码示例 CREATE TRIGGER trg_after_employee_leaves AFTER UPDATE ON employees FOR EACH ROW BEGIN IF NEW.status = '离职' THEN INSERT INTO former_employees (id, name, department, status) VALUES (OLD.id, OLD.name, OLD.department, OLD.status); END IF; END; ``` **注意**:上述伪代码中的`OLD`和`NEW`关键字用于引用触发器操作前后的行数据,这是许多数据库系统(如PostgreSQL)中触发器的标准用法。但在其他系统中,可能需要不同的语法或逻辑来实现相同的功能。 #### 4. 使用存储过程(Stored Procedures) 存储过程是一组为了完成特定功能的SQL语句集,它可以在数据库中创建并保存,以便重复使用。虽然存储过程本身不直接用于复制数据,但可以通过编写一个存储过程来封装`INSERT INTO ... SELECT`语句或其他逻辑,以实现更复杂的数据复制和同步任务。 **示例**:编写一个存储过程,用于将指定部门的所有员工复制到另一个表中。 ```sql -- 伪代码示例 CREATE PROCEDURE CopyEmployeesByDepartment @DepartmentName VARCHAR(100) AS BEGIN INSERT INTO target_table (employee_id, name, department) SELECT employee_id, name, department FROM source_table WHERE department = @DepartmentName; END; ``` 在这个例子中,`@DepartmentName`是一个参数,用于指定要复制的部门名称。调用此存储过程时,需要传入相应的部门名称作为参数。 #### 总结 从其他表中复制数据是数据库管理中常见的任务,SQL提供了多种灵活的方法来实现这一需求。`INSERT INTO ... SELECT`语句是最直接且广泛支持的方法,适用于大多数场景。`CREATE TABLE AS SELECT`(如果数据库支持)则提供了一种快速创建新表并填充数据的方式。触发器和存储过程则提供了更高级的数据复制和同步机制,适用于需要自动化处理或复杂逻辑的场景。选择哪种方法取决于具体的需求、数据库系统的支持以及性能考虑。
上一篇:
插入默认值
下一篇:
4-2 数据的删除(DELETE语句的使用方法)
该分类下的相关小册推荐:
SQL基础教程(下)
SQL基础教程(上)
PostgreSQL入门教程
高性能的Postgres SQL