MySQL如何进行增删改操作

1.2.1. 插入数据(INSERT)

插入单行数据:

指明字段名,有默认值的字段可以跳过,且可更改顺序,一般用这种,更清晰(一个字段名对应一个值)

-- 插入数据
INSERT INTO customers (
    address,
    city,
    state,
    last_name,
    first_name,
    birth_date,
    )
VALUES (
    '5225 Figueroa Mountain Rd',
    'Los Olivos',
    'CA',
    'Jackson',
    'Michael',    
    '1958-08-29',  
    )

插入多行数据:

INSERT INTO products (name, quantity_in_stock, unit_price)
VALUES ('product1', 1, 10),
       ('product2', 2, 20),
       ('product3', 3, 30)

注意:对于AI (Auto Incremental 自动递增) 的id字段,MySQL会记住删除的/用过的id,并在此基础上递增——目前有10条数据,删除了最后两条数据再进行插入数据后,会在10的基础上递增。

插入分层行:

当插入的数据具有分层结构,就是一个数据项又包含了另一个数据项(一对多),可采用分层插入的方法。

下面案例通过添加一条订单记录和对应的多条订单项目记录,来记住如何向父表插入分级(层)/耦合数据(insert hierarchical data):

        新增一个订单(order),包含两个订单项目(order_items),同时更新订单表和订单项目表

INSERT INTO orders (customer_id, order_date, status)
VALUES (1, '2019-01-01', 1);

-- 可以先试一下用 SELECT last_insert_id() 看能否成功获取到的最新的 order_id

INSERT INTO order_items  -- 全是必须字段,就不用指定了
VALUES 
    (last_insert_id(), 1, 2, 2.5), -- 获取最新成功insert语句的主键id
    (last_insert_id(), 2, 5, 1.5)

执行流程:向orders表中插入了一条数据,然后在order_items表中插入该记录的其他信息,一对多的关系。

  • LAST_INSERT_ID():内建函数,获取最新的成功的 INSERT 语句 中的自增id,上面案例中获取的就是父表记录的自增ID( orders的主键id)

创建表复制:

DROP TABLE 要删的表名、CREATE TABLE 新表名 AS 子查询、TRUCATE 要清空的表名、INSERT INTO 表名 子查询

创建副本表案例:

可用于创建表的副本:

CREATE TABLE orders_archived AS
    SELECT * FROM orders  -- 子查询

SELECT * FROM orders 选择了 oders 中所有数据,作为AS的内容,是一个子查询

  • 子查询: 任何一个充当另一个SQL语句的一部分的 SELECT…… 查询语句都是子查询。

如果不需要全部的数据,就选用原表中部分数据创建副本表,如,用今年以前的 orders 创建一个副本表 orders_archived,其实就是在子查询里增加了一个WHERE orders<今年时间的 语句进行筛选。注意要先 drop 删掉 或 truncate清空掉之前建的 orders_archived 表保证该表是不存在的且是空的,再重建或重新插入数据。

        DROP TABLE 要删的表名、CREATE TABLE 新表名 AS 子查询

DROP TABLE orders_archived;  -- 也可用可视化工具直接删除
CREATE TABLE orders_archived AS
    SELECT * FROM orders
    WHERE order_date < '2019-01-01'

INSERT INTO 表名 子查询 很常用,子查询替代原先插入语句中 VALUES(……,……),(……,……),…… 的部分

        INSERT INTO 表名 子查询

INSERT INTO orders_archived  
-- 不用指明字段名,会直接用子查询表里的字段名
    SELECT * FROM orders  
    -- 子查询,替代原先插入语句中VALUES(……,……),(……,……),…… 的部分
    WHERE order_date < '2019-01-01'

1.2.2. 更新数据(UPDATE)

使用UPDATE....来修改表中的一条或多条记录,具体语法⬇:

UPDATE 表 
SET 要修改的字段 = 具体值/NULL/DEFAULT/列间数学表达式 (修改多个字段用逗号分隔)
WHERE 行筛选

更新多行:

语法是一样的,就是让 WHERE…… 的条件包含更多记录,就会同时更改多条记录了

UPDATE invoices
SET payment_total = 233, payment_date = due_date
WHERE client_id = 3  
-- 该客户的发票记录不止一条,将同时更改
/WHERE client_id IN (3, 4) 
-- 第二章 4~9 讲的那些写 WHERE 条件的方法均可用
-- 甚至可以直接省略 WHERE 语句,会直接更改整个表的全部记录

在UPDATE中使用子查询:

本质上是将子查询用在 WHERE…… 筛选条件中,WHERE中使用子查询需要用括号括起来。IN …… 后除了可接 (……, ……) 也可接由子查询得到的多个数据(一列多条数据)。

        update中使用子查询

UPDATE invoices
SET payment_total = 567, payment_date = due_date
WHERE client_id = 
    (SELECT client_id 
    FROM clients
    WHERE name = 'Yadel');
    -- 放入括号,确保先执行

-- 若子查询返回多个数据(一列多条数据)时就不能用等号而要用 IN 了:
WHERE client_id IN 
    (SELECT client_id 
    FROM clients
    WHERE state IN ('CA', 'NY'))

注意:Update 前,最好先执行一下查询子句,验证一下子查询以及WHERE行筛选条件是不是准确的, 确保不会改错记录,再套入 UPDATE SET 语句更新。

1.2.3. 删除数据(DELETE)

语法结构:

DELETE FROM 表 
WHERE 行筛选条件
(当然也可用子查询)
(若省略 WHERE 条件语句会删除表中所有记录)

删除操作案例:

选出顾客id为3/顾客名字叫'Myworks'的发票记录

DELETE FROM invoices
WHERE client_id = 3
-- WHERE可选,省略就是会删除整个表的所有行/记录
/WHERE client_id = 
    (SELECT client_id  
    FROM clients
    WHERE name = 'Myworks')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值