该系列文章系个人读书笔记及总结性内容,任何组织和个人不得转载进行商业活动!
DELETE和UPDATE:改变是件好事
在这之前,先回顾下之前我们创建的数据库表结构及相应的数据内容:
执行SQL:
SHOW databases;
USE drinks;
SHOW tables;
SELECT * FROM drink_info;
SELECT * FROM easy_drinks;
检查数据记录如下图:
命令:DELETE和UPDATE
UPDATE:改变数据;
DELETE:删除不需要的数据;
本章教你如何选择性地使用这些新能力,避免舍弃了需要的数据;
我们以drink_info表举例:
Blue Moon饮料的我们新调制了几种颜色,并准备逐一上架试卖;
我们上架一种颜色的Blue Moon就增加一条记录;所以需要频繁改变表以及时更新数据;
将新调制的新颜色Blue Moon插入表中:
我们使用两种方式插入3条记录:
INSERT INTO drink_info
(drink_name,cost,carbs,color,ice,calories)
VALUES
('Blue Moon',2.5,3.2,'yellow','Y',33);
INSERT INTO drink_info
VALUES
('Blue Moon',2.5,3.2,'black','Y',33),
('Blue Moon',2.5,3.2,'brown','Y',33);
| Blue Moon | 2.50 | 3.20 | yellow | Y | 33 |
| Blue Moon | 2.50 | 3.20 | black | Y | 33 |
| Blue Moon | 2.50 | 3.20 | brown | Y | 33 |
值得注意的是:
表中最后一条显示的数据,并不一定是最新插入的一条,因为我们不可以相信表中的记录真的按时间顺序排列;
有几个数据内部的因素可以改变行在表中存储的顺序,如采用RDBMS软件,还会对列创建索引(后续会介绍);
现在我们有了新的要求:
上架新的Blue Moon时,需要将原来的Blue Moon进行下架;即表中只保留一种Blue Moon;
所以,我们应该删除掉重复的Blue Moon;
值得注意的是:
表中不应该存储重复的数据,因为重复的数据会占用空间,随着数据量增加,会拖垮RDBMS;
良好设计的表可以避免重复情况的发生;
对于已经很“烂”的表,也有很多技巧来清除重复的数据,如利用联接(join),后续我们会学习;
用DELETE删除记录:
DELETE语句就是从表中删除一行数据所需的工具,使用上一章相同的WHERE子句;
执行SQL:
DELETE FROM drink_info WHERE drink_name = 'Blue Moon' AND color = 'blue’;
注意:
DELETE并不需要指定删除的列,因为他删除的是整条记录;
上述SQL从指定表中删除符合条件的记录,确定没有忘记WHERE子句,否则将会删除所有行;
DELETE和WHERE搭配使用 与 SELECT和WHERE搭配使用的方式是一样的;
DELETE的规则:
DELETE不能删除单一列中的值或表中某一列的所有值;
DELETE可用于删除一行或多行,根据WHERE子句而定;
WHERE子句告诉DELETE该删除那些行;之前我们学过的用于WHERE子句的关键字:LIKE(搭配通配符)、IN、BETWEEN等,都可以在此使用;
没有WHERE子句的DELETE FROM table;会删除表中的每一行;
WHERE子句没有找到相符数据的时候,不会进行DELETE;
INSERT-DELETE双步运作:
我们将删除的blue颜色的Blue Moon重新添加;但为了保证不重复数据,还需要将之前的所有Blue Moon删除掉;
1)首先以INSERT添加新的信息;
INSERT INTO drink_info
VALUES
('Blue Moon',2.5,3.2,'blue','Y',33);
2)接下来,利用DELETE搭配WHERE子句删除记录:
DELETE FROM drink_info WHERE drink_name = 'Blue Moon' AND color = 'yellow' OR color = 'black' OR color = 'brown’;
现在表中就只有一条蓝色的Blue Moon;
类似的我们还可以更新其他的记录,只需要将新的记录INSERT之后,把旧的记录DELETE掉;
如把Blackthorn的颜色由yellow改为black;
执行SQL:
INSERT INTO drink_info
VALUES
('Blackthorn',3.00,8.40,'black','Y',33);
DELETE FROM drink_info WHERE drink_name = 'Blackthorn' AND color = 'yellow’;
需求:把定价2.5美元的饮料价格改为3.5 把3.5的改为4.5;
注意的有两点:
1)需要先修改3.5到4.5,再修改2.5到3.5;
2)找出定价为3.5/2.5的饮料,使用INSERT-DELETE更新记录;
慎用DELETE:
在我们插入了新数据之后,一定要慎用DELETE,确定加入的WHERE子句可以精确查出真正想要删除的行;
SELECT一下:
除非非常确定WHERE子句只会限制你打算删除的行,否则都应该用SELECT确认情况;
这是一个确保不会意外删除所需数据的安全方法,而且也会有助于选出所有要删除的记录;
DELETE不精确的麻烦:
使用SELECT确定你想要删除的记录;再使用INSERT-DELELE这两个步骤删除数据;
DELETE要使用和SELECT相同的WHERE子句;
最后,就只剩下新数据了;
以UPDATE改变数据:
与其使用先插入在删除的方式,其实可以重新使用已经存在的记录,只需要调整需要改变的列;
使用SQL语句:UPSDATE;
他可以更新一列或多列的值,UPDATE也可以使用WHERE子句来精确地指定要更新的行;
把Blackthorn的颜色从black修改回yellow:
UPDATE drink_info
SET color = 'yellow'
WHERE drink_name = 'Blackthorn' AND color = 'black';
| Blackthorn | 3.00 | 8.40 | black | Y | 33 |
| Blackthorn | 3.00 | 8.40 | yellow | Y | 33 |
关键字SET:告诉RDBMS,把WHERE子句限定的记录中 set的列的值修改为其指定的值;
UPDATE的规则:
使用UPDATE,你可以改变单一一列或所有列的值;
在SET子句中加入多column = value组,其间以逗号分隔;
UPDATE更新单行还是多行,一切都交由WHERE子句决定;
UPDATE之前也可以使用SELECT确定要更新的行;
UPDATE是我们的新INSERT-DELETE:
使用UPDATE并不会删除任何内容,只是把旧记录回收,并替换为新记录;
UPDATE开始,后接需要更新的表的名字;
SET用于指定要对记录做的改变;
可靠的WHERE子句确定准备改变的记录;
没有了DELETE操作,少了很多风险;
再看需求:把定价2.5美元的饮料价格改为3.5 把3.5的改为4.5;
只需一次UPDATE:
cost列中存储数据;在SQL中,可以对数字列套用基础数学运算;
UPDATE drink_info
SET cost = 3.5 + 1
WHERE cost = 3.5;
UPDATE drink_info
SET cost = cost + 1
WHERE cost = 2.5;
类似的,对于文本可以进行UPPER()和LOWER()函数调用,改变大小写;
UPDATE语句能运用在表的多条记录;还可以和基础运算符一起使用,可以操作数值数据;
数据会改变,所以知道如何改变数据才如此重要:
良好的表设计,可以让更新操作尽可能的少,也能让我们从专注表的内容中解放出来;
下一章,会介绍表的设计;
总结:
DELETE:删除表中记录;
UPDATE:以新值更新现有一列或多列;
SET:这个关键字属于UPDATE语句,可用于改变现有列的值;