插入
a.插入单行
语法:
INSERT
INTO 表名 [(属性列1,属性列2,属性列3,....)]
VALUES (常量1,常量2,常量3,....)
注意:
- 插入时需要保证字段列和数值列的数量必须相同
- 在指定字段名插入时,可以调整字段名称及对应值顺序,不需要和表结构严格对齐
- 当id设置为自增时,添加数据时最好不要直接给一个确切的数值,避免重复冲突,使用默认值让MySQL自己生成这个值。
实例:
-- 在顾客表里插入一个新顾客的信息
INSERT INTO customers
VALUES(DEFAULT,'John','Smith','1990-01-01',NULL,'address','city','CA',DEFAULT)
b.插入多行
语法:
INSERT
INTO 表名 [(属性列1,属性列2,属性列3,....)]
VALUES (常量1,常量2,常量3,....),(常量1,常量2,常量3,....).....
实例:
-- 插入多条运货商信息
INSERT INTO shippers (NAME)
VALUES ('shipper1'),
('shipper2'),
('shipper3')
c.插入分层行
订单表(orders表)里的一条记录对应订单项目表(order_items表)里的多条记录,一对多,是相互关联的父子表。通过添加一条订单记录和对应的多条订单项目记录,学习如何向父子表插入分级(层)/耦合数据(insert hierarchical data):
- 关键:在插入子表记录时,需要用内建函数
LAST_INSERT_ID()获取相关父表记录的自增ID(这个例子中就是 order_id) - 内建函数:MySQL里有很多可用的内置函数,也就是可复用的代码块,各有不同的功能,注意函数名的单词之间用下划线连接
LAST_INSERT_ID():获取最新的成功的INSERT 语句中的自增id,在这个例子中就是父表里新增的 order_id. 实例:
-- 新增一个订单(order),里面包含两个订单项目/两种商品(order_items),
-- 请同时更新订单表和订单项目表
INSERT INTO orders(customer_id, order_date, STATUS)
VALUES(1,'2019-01-01',1)
INSERT INTO order_items
VALUES( LAST_INSERT_ID(),3,1,2.95),( LAST_INSERT_ID(),4,1,3.95)
更新
a.更新单行
语法:
UPDATE 表名
SET 列名=表达式,列名=表达式,....
WHERE 条件
实例:
UPDATE invoices
SET payment_total = 10, payment_date = '2019-03-01'
WHERE invoice_id = 1
b.更新多行
语法一样,就是让WHERE 的条件包含更多记录
实例:
-- 让所有非90后顾客的积分增加50点
UPDATE customers
SET points = points + 50
WHERE birth_date < '1990-01-01'
c.使用子查询
子查询可以嵌套在UPDATE语句中,用以构造修改的条件
实例:
-- 更改发票记录表中名字叫Myworks的payment_total和payment_date的记录
UPDATE invoices
SET payment_total = 10, payment_date = '2029-03-01'
WHERE client_id =
(SELECT client_id
FROM clients
WHERE NAME = 'Myworks')
删除
删除行
语法:
DELETE
REOM 表名
WHERE 条件
注意:
- 省略where删除全部表
实例:
DELETE
FROM invoices
WHERE client_id = 2
创建表的副本
实例:
语法:
CREAT TABLE 新表名 AS 子查询
-- 快速创建表 orders 的副本表 orders_archived
CREATE TABLE orders_archived AS
SELECT * FROM orders