Create a copy of a table
将一个表的数据复制到另一个表上
案例一
将order表中的数据复制到另一张叫orders_archive(订单存档)的表里
假设order表中有10行数据,那么按照之前学习的INSERT INTO语句,则需要编写10行相关代码
现在示范一个更方便的方法——快速将一张表中所有数据复制到另一张表上面
第一步:创建一张新表:订单存档
需要使用语句CREATE TABLE AS
CREATE TABLE orders_archived AS
SELECT * FROM orders
执行代码后,点击更新按钮即可查看到新建的表
行和列数据一致
但该表没有主键,也没有勾选自动递增
因此使用该方法创建表的时,MySQL会忽略这类属性
案例二
复制某表中一部分记录到新表
我们先清空orders_archived表
右键该表,并选择截断表(删除表中所有行)
执行结果
此时复制订单表中一部分记录(eg:2019年之前下的订单)到该表中
我们先确认一下需要的数据包括哪些
执行代码
INSERT INTO orders_archived
-- 将select语句变为INSERT INTO的子查询语句
SELECT *
FROM orders
WHERE order_date < '2019-01-01'
注意这里SELECT代替了VALUES直接将筛选出的值插入了
结果
但该方法依旧忽视了列属性
练习
将invoice表的部分数据复制到新表invoice_archive
但在这张表中不想有客户id列,想要客户id名的列、支付过的发票列(payment_date决定了该发票是否有付款)
思路:连接该表和顾客表
将该查询作为CREATE TABLE 语句中的一段子查询
返回的时候只选择有付款日期的发票
我的答案一
Create table invoices_archive
(
SELECT
c.first_name,
c.last_name,
i.payment_date
FROM invoices i
JOIN sql_store.customers c
ON c.customer_id = i.client_id
WHERE i.payment_date IS NOT NULL
)
错误
表就整错了,要的是client
我的答案二
Create table invoices_archive
(
SELECT
c.name,
i.payment_date
FROM invoices i
JOIN clients c
ON c.client_id = i.client_id
WHERE i.payment_date IS NOT NULL
)
(用JOIN USING语句会更方便噢)
标准答案
USE sql_invoicing;
Create table invoices_archive AS
(
SELECT
invoice_id,
number,
c.name AS client,
invoice_total,
payment_total,
invoice_date,
payment_date,
due_date
FROM invoices -- 因为本身上述select所需列都是来源于from的发票表,所以不用加前缀
JOIN clients c
USING (client_id)
WHERE payment_date IS NOT NULL
)
和自己写的差不多,只是返回的列变多了,棒棒!但是我在CREATE时,后面并没有加AS,但依然执行成功