数据库中很多时候,需要从已有表来建新的表,或者从已经存在表的部分列创建新的表。
各个数据库语言稍微有点区别,为避免混淆,整理如下。
DB2和Mysql中,从已有表创建新表格式如下:
CREATE TABLE TABLENAME LIKE ...
从已经有表的部分列创建新表格式如下:
CREATE TALBLE TABLENAME... AS SELECT ...
Teradata的使用方法如下:
1.使用已有表创建空表
Teradata从基于已存在表创建新表格式为 CREATE TALBE AS。如果不需要源表数据,使用 WITHE NO DATA 选项。
例如:
CREATE TABLE dept1 AS department WITH NO DATA;
这样dept1和表department有相同的结构定义。
2.使用子查询创建空表
使用子查询,可以限制创建目标表的行和列。
CREATE TABLE emp1 AS
(SELECT employee_number
,department_number
,salary_amount
FROM employee) WITH NO DATA;
这样新表emp1有3个列:employee_number,department_number,salary_amount。
使用子查询创建表,有一些限制:不允许使用 ORDER BY 子句。
所有列或表达式都必须有名字,缺省的或赋予的
允许使用下列内容:连接(Join)表达式(包括外连接)
OLAP 函数
嵌套子查询
使用子查询创建新表时,也可以更改列名。
例如:
CREATE TABLE emp1 AS
(SELECT employee_number AS emp
,department_number AS dept
,salary_amount AS sal
FROM employee) WITH NO DATA;
也可以对列的属性进行修改,这里不做深入讨论。
3.使用已有的表创建有数据的表
创建有源表数据的新表,只需要将参数WITH NO DATA 改成WITH DATA,
就可以复制源表的数据流。
CREATE TABLE dept1 AS department WITH DATA;
当然也可以用子查询选中部分列。甚至,子查询中也可以使用表关联。
4.子查询中使用连接
子查询中使用多个表关联,就可以得到多个表的数据了。
例如:
CREATE TABLE dept3 AS
(
SELECT d.department_number
, d.department_name
, e.last_name AS mgr_name
FROM department d
INNER JOIN employee e
ON e.employee_number = d.manager_employee_number
) WITH DATA;
也可以对子查询中的列使用计算函数,或者表达式运算(比如两个字段相减),甚至约束,得到更丰富的结果。
更多数据科学方面内容,请关注个人微信公众号:DataCode