深入浅出SQL(5)-DELETE和UPDATE

该系列文章系个人读书笔记及总结性内容,任何组织和个人不得转载进行商业活动!

 

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语句,可用于改变现有列的值;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值