【MySQL】(基础篇十五) —— 增删改数据

发布于:2024-06-21 ⋅ 阅读:(49) ⋅ 点赞:(0)

增删改数据

本文介绍如何利用SQL的INSERT语句将数据插入表中。以及如何利用UPDATE和DELETE语句进一步操纵表数据。

数据插入

INSERT是用来插入(或添加)行到数据库表的。插入可以用几种方式使用

  • 插入完整的行;
  • 插入行的一部分;
  • 插入多行;
  • 插入某些查询的结果。

插入完整的行

插入完整行到数据表中是INSERT最常见的用法,它要求指定表名和被插入行的值

【示例】插入一个新员工信息到employees表中

INSERT INTO employees
VALUES(NULL,
    'Joe',
    'gearless',
    '123@123.com',
    '123456',
    'IT_PROG',
    10000,
    NULL,
    100,
    60,
    NOW()
    );

插入成功之后,查询一下新员工的信息

SELECT * 
FROM employees
WHERE last_name = 'gearless';

运行结果:

在这里插入图片描述

这种语法很简单,但并不安全,应该尽量避免使用。上面的SQL语句高度依赖于表中列的定义次序,并且还依赖于其次序容易获得的信息。即使可得到这种次序信息,也不能保证下一次表结构变动后各个列保持完全相同的次序。因此,编写依赖于特定列次序的SQL语句是很不安全的。

编写INSERT语句的更安全(不过更烦琐)的方法如下:

INSERT INTO employees(employee_id,
    first_name,
    last_name,
    email,
    phone_number,
    job_id,
    salary,
    commission_pct,
    manager_id,
    department_id,
    hiredate)
VALUES(NULL,
    'Joe',
    'gearless',
    '123@123.com',
    '123456',
    'IT_PROG',
    10000,
    NULL,
    100,
    60,
    NOW()
);

子完成与前一个INSERT语句完全相同的工作,但在表名后的括号里明确地给出了列名。在插入行时,MySQL将用VALUES列表中的相应值填入列表中的对应项。VALUES中的第一个值对应于第一个指定的列名。第二个值对应于第二个列名,如此等等。这样的话,即使不提供全部的字段或者字段顺序和表设计时不同也不会出问题。

一般不要使用没有明确给出列的列表的INSERT语句。使用列的列表能使SQL代码继续发挥作用,即使表结构发生了变化。

省略列: 如果表的定义允许,则可以在INSERT操作中省略某些列。省略的列必须满足以下某个条件:

  • 该列定义为允许NULL值(无值或空值)。
  • 在表定义中给出默认值。这表示如果不给出值,将使用默认值。
  • 如果对表中不允许NULL值且没有默认值的列不给出值,则MySQL将产生一条错误消息,并且相应的行插入不成功。

**优先级:**数据库经常被多个客户访问,对处理什么请求以及用什么次序处理进行管理是MySQL的任务INSERT操作可能很耗时(特别是有很多索引需要更新时),而且它可能降低等待处理的SELECT语句的性能。

如果数据检索是最重要的(通常是这样),则你可以通过在INSERT和INTO之间添加关键字LOW_PRIORITY,指示MySQL降低INSERT语句的优先级。

插入多行数据

可以使用多个INSERT语句,每个INSERT语句之间用分号隔开

如果插入的多个数据结构相同的话,可以只使用一个INSERT语句,然后使用多个VALUES语句,每个VALUES之间用逗号隔开

【示例】插入多个数据到employees表中

INSERT INTO employees(employee_id,
    first_name,
    last_name,
    email,
    phone_number,
    job_id,
    salary,
    commission_pct,
    manager_id,
    department_id,
    hiredate)
VALUES(NULL,
    'Joe',
    'gearless',
    '123@123.com',
    '123456',
    'IT_PROG',
    10000,
    NULL,
    100,
    60,
    NOW()
),
(   'david',
    'lucy',
    '123@123.com',
    '123456',
    'IT_PROG',
    10000,
    NULL,
    100,
    60,
    NOW());

插入检索数据

INSERT一般用来给表插入一个指定列值的行。但是,INSERT还存在另一种形式,可以利用它将一条SELECT语句的结果插入表中。这就是所谓的INSERT SELECT,顾名思义,它是由一条INSERT语句和一条SELECT语句组成的。

假如你想从另一表中合并客户列表到你的customers表。不需要每次读取一行,然后再将它用INSERT插入

【示例】从旧员工表中查找数据插入到新员工表中(我还没有准备的数据,只是感受一下这个操作)

INSERT INTO new_employees(employee_id,
    first_name,
    last_name,
    email,
    phone_number,
    job_id,
    salary,
    commission_pct,
    manager_id,
    department_id,
    hiredate)
SELECT employee_id,
    first_name,
    last_name,
    email,
    phone_number,
    job_id,
    salary,
    commission_pct,
    manager_id,
    department_id,
    hiredate
FROM old_employees;

更新数据

为了更新(修改)表中的数据,可使用UPDATE语句。可采用两种方式使用UPDATE:

  • 更新表中特定行;
  • 更新表中所有行。

在使用UPDATE时一定要注意细心。因为稍不注意,就会更新表中所有行,要注意WHERE语句的使用。

UPDATE语句非常容易使用,甚至可以说是太容易使用了。基本的UPDATE语句由3部分组成,分别是:

  • 要更新的表;
  • 列名和它们的新值;
  • 确定要更新行的过滤条件。

UPDATE语句总是以要更新的表的名字开始。SET命令用来将新值赋给被更新的列。

【示例】更改employeees表用id为110的用户邮箱为123@123.com

UPDATE employees
SET email = '123@123.com'
WHERE employee_id = 110;

查询修改结果:

SELECT *
FROM employees
WHERE employee_id = 110;

运行结果:

在这里插入图片描述

如果要更新多个列的话,只用一个SET即可,后面的多个列之间用逗号隔开(最后一列之后不用逗号)

【示例】更改employeees表用id为110的用户邮箱为123@123.com,salary改为10000

UPDATE employees
SET email = '123@123.com',
    salary = 10000
WHERE employee_id = 110;

删除数据

为了从一个表中删除(去掉)数据,使用DELETE语句。可以两种方式使用DELETE:

  • 从表中删除特定的行;
  • 从表中删除所有行。

前面说过,UPDATE非常容易使用,而DELETE更容易使用。

【示例】删除employees表中employee_id为190的信息

DELETE FROM employees
WHERE employee_id = 190;

删除之后再次查询:

SELECT * 
FROM employees
WHERE employee_id = 190;

运行结果:

在这里插入图片描述

DELETE不需要列名或通配符。DELETE删除整行而不是删除列。为了删除指定的列,请使用UPDATE语句。

更快的删除: 如果想从表中删除所有行,不要使用DELETE。可使用TRUNCATE TABLE语句,它完成相同的工作,但速度更快(TRUNCATE实际是删除原来的表并重新创建一个表,而不是逐行删除表中的数据)。

更新和删除指导

下面是许多SQL程序员使用UPDATE或DELETE时所遵循的习惯。

  • 除非确实打算更新和删除每一行,否则绝对不要使用不带WHERE子句的UPDATE或DELETE语句。
  • 保证每个表都有主键,尽可能像WHERE子句那样使用它(可以指定各主键、多个值或值的范围)。
  • 在对UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不正确。
  • 使用强制实施引用完整性的数据库,这样MySQL将不允许删除具有与其他表相关联的数据的行。

MySQL没有撤销(undo)按钮。应该非常小心地使用UPDATE和DELETE,否则你会发现自己更新或删除了错误的数据。