SQL笔记#数据更新

news/2025/2/24 20:10:38

一、数据的插入(INSERT语句的使用方法)

1、什么是INSERT

        首先通过CREATE TABLE语句创建表,但创建的表中没有数据;再通过INSERT语句向表中插入数据。

sql">--创建表ProductIns
CREATE TABLE ProductIns
(product_id      CHAR(4)      NOT NULL,
 product_name    VARCHAR(100) NOT NULL,
 product_type    VARCHAR(32)  NOT NULL,
 sale_price      INTEGER      DEFAULT 0,
 purchase_price  INTEGER      ,
 regist_date     DATE         ,
 PRIMARY KEY (product_id));

2、INSERT语句的基本语法

INSERT INTO <表名> (列1,列2,列3,……) VALUES (值1,值2,值3,……);

sql">INSERT INTO ProductIns (product_id, product_name, product_type, sale_price, purchase_price, regist_date) VALUES ('0001', 'T恤衫' ,'衣服', 1000, 500, '2009-09-20');

列清单为(列1,列2,列3,……);

值清单为(值1,值2,值3,……)。 

        列清单与值清单的列数必须保持一致, 通常执行一次INSERT语句会插入一行数据;但也就二将多条VALUE子句通过都好进行分隔排列。

sql">-- 多行INSERT(Oracle除外)
INSERT INTO ProductIns VALUES ('0002', '打孔器', '办公用品', 500, 320, '2009-09-11'),
                              ('0003', '运动T恤', '衣服', 4000, 2800, NULL),
                              ('0004', '菜刀', '厨房用具', 3000, 2800, '2009-09-20');

3、列清单的省略

sql">-- 包含列清单
INSERT INTO ProductIns (product_id, product_name, product_type, sale_price, purchase_price, regist_date) VALUES ('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15');

-- 省略列清单
INSERT INTO ProductIns VALUES ('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15');

4、插入NULL

sql">INSERT INTO ProductIns (product_id, product_name, product_type, sale_price, purchase_price, regist_date) VALUES ('0006', '叉子', '厨房用具', 500, NULL, '2009-09-20');

5、插入默认值

\blacksquare 通过显性的方式插入默认值

sql">INSERT INTO ProductIns (product_id, product_name, product_type, sale_price, purchase_price, regist_date) VALUES ('0007', '擦菜板', '厨房用具', DEFAULT, 790, '2009-04-28');
sql">postgres=# SELECT * FROM ProductIns WHERE product_id = '0007';
 product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------
 0007       | 擦菜板       | 厨房用具     |          0 |            790 | 2009-04-28

 \blacksquare 通过隐性的方式插入默认值

sql">-- 可通过对sale_price列和值的省略设定默认值
INSERT INTO ProductIns (product_id, product_name, product_type, purchase_price, regist_date) VALUES ('0007', '擦菜板', '厨房用具', 790, '2009-04-28');

        若未设定默认值,则自动设定为NULL;但遇到该列设定为NOT NULL则会报错。 

6、从其他表中复制数据

sql">-- 用来插入数据的商品复制表
CREATE TABLE ProductCopy
(product_id      CHAR(4)      NOT NULL,
 product_name    VARCHAR(100) NOT NULL,
 product_type    VARCHAR(32)  NOT NULL,
 sale_price      INTEGER      ,
 purchase_price  INTEGER      ,
 regist_date     DATE         ,
 PRIMARY KEY (product_id));
sql">-- 将商品表中的数据复制到商品复制表中
INSERT INTO ProductCopy (product_id, product_name, product_type, sale_price, purchase_price, regist_date)
SELECT product_id, product_name, product_type, sale_price, purchase_price, regist_date
  FROM Product;

-- 打印商品复制表
SELECT * FROM ProductCopy;
sql"> product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------
 0001       | T恤          | 衣服         |       1000 |            500 | 2009-09-20
 0002       | 打孔器       | 办公用品     |        500 |            320 | 2009-09-11
 0003       | 运动T恤      | 衣服         |       4000 |           2800 |
 0004       | 菜刀         | 厨房用具     |       3000 |           2800 | 2009-09-20
 0005       | 高压锅       | 厨房用具     |       6800 |           5000 | 2009-01-15
 0006       | 叉子         | 厨房用具     |        500 |                | 2009-09-20
 0007       | 擦菜板       | 厨房用具     |        880 |            790 | 2008-04-28
 0008       | 圆珠笔       | 办公用品     |        100 |                | 2009-11-11

\blacksquare 多种多样的SELECT语句

sql">-- 根据商品种类进行汇总的表
CREATE TABLE ProductType
(product_type        VARCHAR(32)  NOT NULL,
 sum_sale_price      INTEGER      ,
 sum_purchase_price  INTEGER      ,
 PRIMARY KEY (product_type));
sql">INSERT INTO ProductType (product_type, sum_sale_price, sum_purchase_price)
SELECT product_type, SUM(sale_price), SUM(purchase_price)
  FROM Product
 GROUP BY product_type;

-- 确认插入的数据行
SELECT * FROM ProductType;
sql"> product_type | sum_sale_price | sum_purchase_price
--------------+----------------+--------------------
 衣服         |           5000 |               3300
 办公用品     |            600 |                320
 厨房用具     |          11180 |               8590

二、数据的删除(DELETE语句的使用方法)

1、DROP TABLE语句和DELETE语句

        DROP TABLE 语句 可以将表完全删除;

        DELETE 语句 会留下表(容器),而删除表中的全部数据。

 2、DELETE语句的基本语法

sql">DELETE FROM Product;
sql"> product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------

3、指定删除对象的DELETE语句(搜索型DELETE)

DELETE FROM <表名>

      WHERE <条件>;

sql">DELETE FROM Product
 WHERE sale_price >= 4000;

-- 确认删除后的结果
SELECT * FROM Product;

        删之前的数据: 

sql"> product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------
 0001       | T恤          | 衣服         |       1000 |            500 | 2009-09-20
 0002       | 打孔器       | 办公用品     |        500 |            320 | 2009-09-11
 0003       | 运动T恤      | 衣服         |       4000 |           2800 |
 0004       | 菜刀         | 厨房用具     |       3000 |           2800 | 2009-09-20
 0005       | 高压锅       | 厨房用具     |       6800 |           5000 | 2009-01-15
 0006       | 叉子         | 厨房用具     |        500 |                | 2009-09-20
 0007       | 擦菜板       | 厨房用具     |        880 |            790 | 2008-04-28
 0008       | 圆珠笔       | 办公用品     |        100 |                | 2009-11-11

        删之后的数据: 

sql"> product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------
 0001       | T恤          | 衣服         |       1000 |            500 | 2009-09-20
 0002       | 打孔器       | 办公用品     |        500 |            320 | 2009-09-11
 0004       | 菜刀         | 厨房用具     |       3000 |           2800 | 2009-09-20
 0006       | 叉子         | 厨房用具     |        500 |                | 2009-09-20
 0007       | 擦菜板       | 厨房用具     |        880 |            790 | 2008-04-28
 0008       | 圆珠笔       | 办公用品     |        100 |                | 2009-11-11
(6 行记录)

三、数据的更新(UPDATE语句的使用方法)

1、UPDATE语句的基本语法

UPDATE <表名>

       SET <列名>=<表达式>;

sql">-- 将登记的数据更新为"2009-10-10"
UPDATE Product
   SET regist_date = '2009-10-10';

-- 确认更新的数据
SELECT * FROM Product ORDER BY product_id;
sql"> product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------
 0001       | T恤          | 衣服         |       1000 |            500 | 2009-10-10
 0002       | 打孔器       | 办公用品     |        500 |            320 | 2009-10-10
 0004       | 菜刀         | 厨房用具     |       3000 |           2800 | 2009-10-10
 0006       | 叉子         | 厨房用具     |        500 |                | 2009-10-10
 0007       | 擦菜板       | 厨房用具     |        880 |            790 | 2009-10-10
 0008       | 圆珠笔       | 办公用品     |        100 |                | 2009-10-10

2、指定条件的UPDATE语句(搜索型UPDATE)

UPDATE <表名>

       SET <列名>=<表达式>

 WHERE <条件>;

sql">-- 将商品种类为厨房用具的记录的销售单价更新为原来的10倍
UPDATE Product
   SET sale_price = sale_price * 10
 WHERE product_type = '厨房用具';

-- 确认更新内容
SELECT * FROM Product ORDER BY product_id;
sql"> product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------
 0001       | T恤          | 衣服         |       1000 |            500 | 2009-10-10
 0002       | 打孔器       | 办公用品     |        500 |            320 | 2009-10-10
 0004       | 菜刀         | 厨房用具     |      30000 |           2800 | 2009-10-10
 0006       | 叉子         | 厨房用具     |       5000 |                | 2009-10-10
 0007       | 擦菜板       | 厨房用具     |       8800 |            790 | 2009-10-10
 0008       | 圆珠笔       | 办公用品     |        100 |                | 2009-10-10

3、使用NULL进行更新

sql">-- 将商品编号为0008的数据(圆珠笔)的登记日期更新为NULL
UPDATE Product
   SET regist_date = NULL
 WHERE product_id = '0008';

-- 确认更新的内容
SELECT * FROM Product ORDER BY product_id;
sql"> product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------
 0001       | T恤          | 衣服         |       1000 |            500 | 2009-10-10
 0002       | 打孔器       | 办公用品     |        500 |            320 | 2009-10-10
 0004       | 菜刀         | 厨房用具     |      30000 |           2800 | 2009-10-10
 0006       | 叉子         | 厨房用具     |       5000 |                | 2009-10-10
 0007       | 擦菜板       | 厨房用具     |       8800 |            790 | 2009-10-10
 0008       | 圆珠笔       | 办公用品     |        100 |                |

4、多列更新

        下列三种更新方式都可以达到一个目标

sql">-- 能够正确执行的繁琐的UPDATE语句
UPDATE Product
   SET sale_price = sale_price * 10
 WHERE product_type = '厨房用具';

UPDATE Product
   SET purchase_price = purchase_price / 2
 WHERE product_type = '厨房用具';

-- 确认更新的内容
SELECT * FROM Product ORDER BY product_id;
sql">-- 使用逗号对列进行分隔排列
UPDATE Product
   SET sale_price = sale_price * 10,
       purchase_price = purchase_price / 2
 WHERE product_type = '厨房用具';

-- 确认更新的内容
SELECT * FROM Product ORDER BY product_id;
sql">-- 将引用()括起来
UPDATE Product
   SET (sale_price, purchase_price) = (sale_price * 10, purchase_price / 2)
 WHERE product_type = '厨房用具';

-- 确认更新内容
SELECT * FROM Product ORDER BY product_id;
sql"> product_id | product_name | product_type | sale_price | purchase_price | regist_date
------------+--------------+--------------+------------+----------------+-------------
 0001       | T恤          | 衣服         |       1000 |            500 | 2009-10-10
 0002       | 打孔器       | 办公用品     |        500 |            320 | 2009-10-10
 0004       | 菜刀         | 厨房用具     |     300000 |           1400 | 2009-10-10
 0006       | 叉子         | 厨房用具     |      50000 |                | 2009-10-10
 0007       | 擦菜板       | 厨房用具     |      88000 |            395 | 2009-10-10
 0008       | 圆珠笔       | 办公用品     |        100 |                |

四、事务

1、什么是事务

        事务就是需要再同一个处理单元中执行的一系列更新处理的集合。

2、创建事务

事务开始语句;

        

        DML语句1;

        DML语句2;

        DML语句3;

        ……

事务结束语句(COMMIT或者ROLLBACK);

sql">--SQL Server, PostgreSQL
BEGIN TRANSACTION;

    -- 将运动T恤的销售单价降低1000日元
    UPDATE Product
       SET sale_price = sale_price - 1000
     WHERE product_name = 'T恤';

    -- 将T恤衫的销售单价上浮1000日元
    UPDATE Product
       SET sale_price = sale_price + 1000
     WHERE product_name = 'T恤';

COMMIT;

SELECT *
  FROM Product
  ORDER BY product_id;

        COMMIT——提交处理

        ROLLBACK——取消处理 

3、ACID特性

1、原子性        包含的事务或全部执行或全部不执行;

2、一致性        事务中处理要满足数据库提前设置的约束;

3、隔离性        确保不同事务之间湖北干扰;

4、持久性        在事务结束后,DBMS能够保证该时间点的数据状态会被保存的特性。


http://www.niftyadmin.cn/n/5864777.html

相关文章

Gin从入门到精通 (五)数据绑定与验证

数据绑定与验证 数据绑定是指将请求数据&#xff08;如 JSON、表单、URL 参数等&#xff09;绑定到 Go 语言中的结构体。Gin 提供了便捷的方法将请求中的数据映射到预定义的结构体字段上&#xff0c;使得开发者可以像访问结构体字段一样访问请求数据。 数据验证是对绑定到结构…

Github 2025-02-21 Java开源项目日报Top7

根据Github Trendings的统计,今日(2025-02-21统计)共有7个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目7Groovy项目1C++项目1TypeScript项目1本地托管的PDF文件操作工具 创建周期:464 天开发语言:Java, HTML协议类型:GNU General Public …

【MySQL篇】数据库基础

目录 1&#xff0c;什么是数据库&#xff1f; 2&#xff0c;主流数据库 3&#xff0c;MySQL介绍 1&#xff0c;MySQL架构 2&#xff0c;SQL分类 3&#xff0c;MySQL存储引擎 1&#xff0c;什么是数据库&#xff1f; 数据库&#xff08;Database&#xff0c;简称DB&#xf…

Office和WPS中使用deepseek,解决出错问题,生成速度极快,一站式AI处理文档

让office集成deepseek&#xff0c;支持office和WPS办公软件&#xff0c;无需本地部署一站式使用&#xff01; WPS中集成deepseek&#xff0c;一站式搞定AI排版、润色和翻译&#xff01; 但是由于deepseek官方的某些原因导致无法正常使用&#xff0c;会出现不回答或者是回答报…

HOW - 服务接口超时时间和建议策略

目录 1. 常见超时时间设置2. 影响超时时间的因素3. 建议避免长任务超时&#xff1a;异步任务轮询1. 为什么要用异步任务 轮询&#xff1f;2. 实现方案后台示例&#xff1a;Node.js Redis Queue 实现前端示例&#xff1a;React Axios 轮询示例 3. 其他优化方案WebSocket 实时…

什么是完全前向保密(PFS)?

在当今数字化时代&#xff0c;信息安全至关重要。而密码学中的完全前向保密&#xff08;Perfect Forward Secrecy&#xff0c;简称PFS&#xff09;技术&#xff0c;已经成为保障信息安全的关键一环。如果没有完全前向保密&#xff0c;一旦长期密钥被泄露&#xff0c;攻击者就可…

C++ 编程语言简介

C 是一种通用编程语言&#xff0c;它是作为 C 语言的增强而开发的&#xff0c;以包含面向对象的范例。它是一种命令式和编译语言。 C 是一种高级的通用编程语言&#xff0c;专为系统和应用程序编程而设计。它由贝尔实验室的 Bjarne Stroustrup 于 1983 年开发&#xff0c;作为…

去中心化 AI:赋权还是混乱?

DeepSeek 如何在 AI 去中心化方面迈出了巨大的一步&#xff0c;以及为什么这比你想象的更重要 Nadia Piet AIxDESIGN & Archival Images of AI / Better Images of AI / AI Am Over It / CC-BY 4.0 2025 年 1 月 27 日星期一&#xff0c;DeepSeek —— 一家几乎凭空冒出来…