增删改数据
本文介绍如何利用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,否则你会发现自己更新或删除了错误的数据。