如何向表中插入数据以及如何更新、删除表中的数据

简介: 1. 插入INSERT 用来将行插入到数据库表中。插入有几种方式:插入完整的行。插入行的一部分。插入某些查询的结果。INSERT 语法要求指定表名和插入到新表中的值。例如,我们将一个新顾客插入到 customers 表中。插入前:INSERT INTO Customers VALUES('1000000006', 'Toy Land', '123 Any Street', 'New York', 'NY', '11111', 'USA', 'Jordan', 'Jordan@gmail.com');运行结果如下:插入到新表中的值由 VALUES 子

1. 插入

INSERT 用来将行插入到数据库表中。插入有几种方式:

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

INSERT 语法要求指定表名和插入到新表中的值。例如,我们将一个新顾客插入到 customers 表中。

插入前:

网络异常,图片无法展示
|

INSERT INTO Customers VALUES('1000000006', 'Toy Land', '123 Any Street', 
    'New York', 'NY', '11111', 'USA', 'Jordan', 'Jordan@gmail.com');

运行结果如下:

网络异常,图片无法展示
|

插入到新表中的值由 VALUES 子句给出,以这种方式插入数据时,我们必须为每一列提供一个值。而且各列必须以他们在表定义中出现的次序填充。虽然这种插入数据的语法很简单,但并不安全,应该尽量避免使用。因为上面的 SQL 语句高度依赖于表中列的定义次序。比较安全的写法,如下:

INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, 
    cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES('1000000006', 'Toy Land', '123 Any Street', 'New York', 
    'NY', '11111', 'USA', 'Jordan', 'Jordan@gmail.com');

运行结果如下:

网络异常,图片无法展示
|

在上述写法中,我们在表名后的括号里明确指定了列名,VALUES 中的第一个值对应于第一个指定列名,第二个值对应于第二个列名,如此等等。因为提供了列名,只要 VALUES 中的值和指定的列名能匹配上就行,不一定按照各列出现在表中的实际次序。这样做的好处是,即使表结构发生改变,这条 INSERT 语句仍然能正确工作。由于明确指定了列名,所以我们可以随意指定列的顺序。

例如,我们也可以如下插入数据:

INSERT INTO Customers(cust_id, cust_contact, cust_email, cust_name, 
    cust_address, cust_city, cust_state, cust_zip, cust_country)
VALUES('1000000006', 'Jordan', 'Jordan@gmail.com', 'Toy Land', 
    '123 Any Street', 'New York', 'NY', '11111','USA');

运行结果如下:

网络异常,图片无法展示
|

注意事项:1.不要使用没有明确给出列的 INSERT 语句。给出列能使 SQL 代码继续发挥作用,即使表结构发生了变化。2.不管使用哪种 INSERT 语法,VALUES 的数目都必须正确。如果不提供列名,则必须给每个表列提供一个值;如果提供列名,则必须给列出的每个列一个值。否则,就会产生一条错误消息,相应的行不能成功插入。

由于明确列出了列名,我们在进行插入数据时,可以省略某些列,这表示可以只给某些列提供值,给其他列不提供值。例如,我们可以如下插入数据:

INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country)
VALUES('1000000006', 'Toy Land', '123 Any Street', 'New York', 'NY', '11111', 'USA');

运行结果如下:

网络异常,图片无法展示
|

在这个例子中,我们省略了 cust_contact 和 cust_email 这两列。如果表的定义允许,则可以在 INSERT 操作中省略某些列。省略的列必须满足以下某个条件:1.该列定义为允许 NULL 值。2.在表定义中给出默认值。这表示如果不给出值,将使用默认值。如果表中不允许有 NULL 值或者默认值,这时却省略了表中的值, DBMS 就会产生错误消息,相应的行不能成功插入。

INSERT 还可以用来将查询出的数据插入到表中。就是所谓的 INSERT SELECT。它由一条 INSERT 语句和一条 SELECT 语句组成。

例如,未进行操作前, customersnew 表中的内容是空的:

网络异常,图片无法展示
|

我们从 customers 表中查询数据插入到 customersnew 表中。

INSERT INTO customersnew(cust_id, 
                      cust_contact, 
                      cust_email, 
                      cust_name, 
                      cust_address, 
                      cust_city, 
                      cust_state, 
                      cust_zip, 
                      cust_country)
SELECT cust_id, 
       cust_contact, 
       cust_email, 
       cust_name, 
       cust_address, 
       cust_city, 
       cust_state, 
       cust_zip, 
       cust_country 
FROM customers;

运行结果如下:

网络异常,图片无法展示
|

可以发现已经执行完成。

然后我们打开 customersnew 表, 可以发现数据已经插入成功:

网络异常,图片无法展示
|

在这个例子中,INSERT 和 SELECT 语句中使用了相同的列名。但是,不一定要求列名匹配。事实上,DBMS 一点儿也不关心 SELECT 返回的列名。它使用的是列的位置,因此 SELECT 中的第一列(不管其列名)将用来填充表列中指定的第一列,第二列将用来填充表列中指定的第二列,如此等等。

INSERT SELECT 中 SELECT 语句可以包含 WHERE 子句,以过滤插入的数据。

另外,有时候,我们需要把一个表的内容复制到另外一张表。这时候我们可以使用:

CREATE TABLE custcopy AS 
SELECT * FROM customers;

运行结果如下:

网络异常,图片无法展示
|
网络异常,图片无法展示
|

可以发现sql语句的执行与表内容的复制都已完成,其内容与 customers 中的内容一致

2. 更新

下面我们来讲下如何更新数据:更新表中的数据可以使用 UPDATE 语句,有两种使用 UPDATE 的方式:1.更新表中的特定行。2.更新表中的所有行。

使用 UPDATE 语句非常容易,基本的 UPDATE 语句由三部分组成:1.要更新的表。2.列名和它们的新值。3.确定要更新哪些行的过滤条件。

举个简单的例子,例如我们要更新客户 1000000005 的电子邮箱地址,语句如下:

UPDATE customers 
SET cust_email = 'kim@thetoystore.com' 
WHERE cust_id = '1000000005';

执行结果如下:

网络异常,图片无法展示
|

UPDATE 语句以 WHERE 子句结束,它告诉 DBMS 更新哪一行。没有 WHERE 子句,DBMS 将会用这个电子邮件地址更新 Customers 表中的所有行, 这不是我们希望的。

更新多列的语法稍微不同,例如:

UPDATE Customers 
SET cust_contact = 'Sam Roberts',
    cust_email = 'sam@toyland.com' 
WHERE cust_id = '1000000006';

执行结果如下:

网络异常,图片无法展示
|

在更新多个列时,只需要使用一条 SET 命令,每个“列=值”对之间用逗号分隔(最后一列之后不用逗号)。在此例子中,更新顾客 1000000006 的 cust_contact 和 cust_email 列。

要删除某个列的值,可设置它为 NULL。例如:

UPDATE Customers 
SET cust_email = NULL 
WHERE cust_id = '1000000005';

执行结果如下:

网络异常,图片无法展示
|

在使用 UPDATE 语句时,不要省略 WHERE 子句,因为稍不注意,就会更新表中所有的行。

3. 删除

下面来讲下如何删除数据:从一个表中删除数据,使用 DELETE 语句。有两种使用 DELETE 的方式:1.从表中删除特定的行;2.从表中删除所有行。例如:从Customers 表中删除一行:

DELETE FROM Customers 
WHERE cust_id = '1000000006';

执行结果如下:

网络异常,图片无法展示
|

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

如果想从表中删除所有行,不要使用 DELETE。可使用 TRUNCATE TABLE 语句,它完成相同的工作,而速度更快(因为不记录数据的变动)。

使用 UPDATE 和 DELETE 时所遵循的重要原则:1.除非确实打算更新和删除每一行,否则绝对不要使用不带 WHERE 子句的 UPDATE 或 DELETE 语句。2.在 UPDATE 或 DELETE 语句使用 WHERE 子句前,应该先用 SELECT 进行测试,保证它过滤的是正确的记录,以防编写的 WHERE 子句不正确。

1.更新客户 1000000001 的电子邮箱地址为 justin@gmail.com。

2.复制vendors表中内容,并命名为copy。

相关文章
|
SQL Kubernetes 调度
Flink 流批一体在模型特征场景的使用
本文整理自B站资深开发工程师张杨老师在 Flink Forward Asia 2023 中 AI 特征工程专场中的分享。
77859 5
Flink 流批一体在模型特征场景的使用
|
人工智能 自然语言处理 算法
SAM-U升级SAM | 带你分析SAM的弱点并重新优化设计填补空缺
SAM-U升级SAM | 带你分析SAM的弱点并重新优化设计填补空缺
268 0
|
Kubernetes 负载均衡 安全
【K8S系列】深入解析k8s网络插件—Cilium
【K8S系列】深入解析k8s网络插件—Cilium
2140 1
|
12月前
|
存储 API 数据库
QML使用Sqlite数据库存储ListModel数据
本文介绍了在QML中使用Sqlite数据库存储ListModel数据的方法,包括如何创建数据库、读取数据、动态添加和删除数据,以及如何在程序启动和退出时与数据库同步数据。
259 2
|
11月前
|
Ubuntu PHP 开发者
如何在Ubuntu中切换多个PHP版本
通过上述步骤,您不仅能够高效地在Ubuntu系统中安装和切换PHP版本,还能根据项目需求灵活配置,大大提升开发效率与灵活性。更多关于服务器配置与优化的信息,获取全面的技术支持与解决方案。
297 1
|
前端开发 JavaScript 开发者
探究单页应用(SPA)与多页应用(MPA):技术的选择与对比
在当今快节奏的互联网时代,单页应用(SPA)和多页应用(MPA)是两种常见的前端开发架构。本文将深入探讨这两种应用类型的特点、优势和不足,并提供一些帮助开发者做出选择的指导。
Vue3信息提示(Modal)
这是一个基于 Vue2 的信息提示模态框组件,支持多种弹窗类型(如 info、success、error 等),并提供丰富的自定义属性,包括按钮文本、按钮类型、居中方式等。该组件可根据内容自动调整高度,并兼容不同按钮样式配置。预览效果展示了不同类型的模态框及其样式。代码中详细介绍了组件的实现方式和使用方法。
385 1
Vue3信息提示(Modal)
|
NoSQL Redis
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
327 0
|
编解码 开发者 Python
【Python】已解决:SyntaxError: (unicode error) ‘unicodeescape’ codec can’t decode bytes in position 2-3: t
【Python】已解决:SyntaxError: (unicode error) ‘unicodeescape’ codec can’t decode bytes in position 2-3: t
3360 0
|
API 网络架构 开发者
邮箱REST API发送邮件有什么方法步骤?
AokSend指南:通过邮箱REST API发送邮件涉及6步。首先,研究邮箱服务提供商的API文档;其次,获取API密钥和身份验证信息;然后,用编程语言构建包含收件人、发件人、主题、正文和附件的API请求;接着,使用HTTP POST发送请求到API端点;收到响应后处理邮件发送状态;最后,进行错误处理。AokSend提供高效稳定的触发式及SMTP/API接口,支持大量验证码发送。在使用过程中,遵守服务条款和隐私政策。