• SQL:四 数据更新


    数据的插入

    什么是INSERT

    CREATE TABLE 语句创建出来的表,可以被认为是一个空空如也的箱子。 只有把数据装入到这个箱子后,它才能称为数据库。用来装入数据的 SQL 就是 INSERT

    INSERT语句的基本语法

    • 将列名和值用逗号隔开,分别括在()内,这种形式称为清单
    • 原则上,执行一次INSERT语句会插入一行数据
    INSERT INTO <表名> (列1, 列2, 列3, ……) 
    VALUES (值1, 值2, 值3, ……);
    
    -- 向表中插入一行数据 
    INSERT INTO ProductIns (product_id, product_name, product_type, sale_price, purchase_price, regist_date) 
    VALUES ('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20');

    列清单的省略

    • 对表进行全列 INSERT 时,可以省略表名后的列清单
    -- 包含列清单 
    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');

    插入NULL

    • INSERT 语句中想给某一列赋予 NULL 值时,可以直接在 VALUES 子句的值清单中写入 NULL
    • 想要插入 NULL 的列一定不能设置 NOT NULL 约束
    -- 向purchase_price列中插入NULL 
    INSERT INTO ProductIns (product_id, product_name, product_type, sale_price, purchase_price, regist_date) 
    VALUES ('0006', '叉子', '厨房用具', 500, NULL, '2009-09-20');

    插入默认值

    • 通过在创建表的 CREATE TABLE 语句中设置 DEFAULT 约束来设定默认值

    • 通过“DEFAULT < 默认值 >”的形式来设定默认值

    • 通过显式方法插入默认值 

      • 在 VALUES 子句中指定 DEFAULT 关键字
      • -- 通过显式方法设定默认值 
        INSERT INTO ProductIns (product_id, product_name, product_type, sale_price, purchase_price, regist_date) 
        VALUES ('0007','擦菜板', '厨房用具', DEFAULT, 790, '2009-04-28');
    • 通过隐式方法插入默认值 

      • 插入默认值时也可以不使用DEFAULT 关键字,只要在列清单和 VALUES 中省略设定了默认值的列就可以
      • 省略INSERT语句中的列名,就会自动设定为该列的默认值(没有默认值时会设定 为NULL)。
      • -- 通过隐式方法设定默认值 
        INSERT INTO ProductIns (product_id, product_name, product_type, purchase_price, regist_date) 
        VALUES ('0007', '擦菜板', '厨房用具',790, '2009-04-28');
        -- 省略 sale_price 列和值
        
        -- 未设定默认值的情况 
        -- 省略purchase_price列(无约束):会赋予“NULL” 
        INSERT INTO ProductIns (product_id, product_name, product_type, sale_price, regist_date) 
        VALUES ('0008', '圆珠笔', '办公用品',100, '2009-11-11');
        
        -- 省略product_name列(设置了NOT NULL约束):错误! 
        INSERT INTO ProductIns (product_id, product_type, sale_price, purchase_price, regist_date) 
        VALUES ('0009', '办公用品', 1000, 500, '2009-12-12');

    从其他表中复制数据

    • INSERT … SELECT 语句可以在需要进行数据备份时使用
    • INSERT语句的SELECT语句中,可以使用WHERE子句或者GROUP BY子句等任 何SQL语法 (但使用ORDER BY子句并不会产生任何效果)。
    -- INSERT ... SELECT语句 
    -- 将 Product 中的数据复制到 ProductCopy 中 
    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;
    
    -- 插入其他表中数据合计值的INSERT ... SELECT语句 
    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;

    数据的删除

    DROP TABLE语句和DELETE语句

    • DROP TABLE 语句可以将表完全删除 
    • DELETE 语句会留下表(容器),而删除表中的全部数据

    DELETE语句的基本语法

    • DELETE FROM <表名>;
    • DELETE语句的删除对象并不是表或者列,而是记录(行)。

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

    • 想要删除部分数据行时,可以像SELECT 语句那样使用WHERE 子句指定删除条件。这种指定了删除对象的DELETE 语句称为搜索型 DELETE
    • DELETE FROM <表名> WHERE <条件>;
    • DELETE 语句中不能使用 GROUP BY、 HAVING和ORDER BY三类子句,而只能使用WHERE子句
    -- 删除销售单价(sale_price)大于等于4000日元的数据 
    DELETE FROM Product 
    WHERE sale_price >= 4000;

    舍弃 TRUNCATE

    • TRUNCATE 只能删除表中的全部数据,而不能通过 WHERE 子句指定条件来删除部分数据
    • 处理速度比DELETE 要快得多

     

    数据的更新

    UPDATE语句的基本语法

    • 使用 UPDATE 语句可以改变表中的数据
    • UPDATE <表名> SET <列名> = <表达式>;
    -- 将登记日期全部更新为“2009-10-10” 
    UPDATE Product 
    SET regist_date = '2009-10-10';

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

    -- 更新部分数据行的搜索型UPDATE
    UPDATE <表名>
    SET <列名> = <表达式> 
    WHERE <条件>;
    
    -- 将商品种类为厨房用具的记录的销售单价更新为原来的10倍 
    UPDATE Product   
    SET sale_price = sale_price * 10 
    WHERE product_type = '厨房用具';

    使用NULL进行更新

    • 使用UPDATE 也可以将列更新为NULL(该更新俗称为NULL 清 空)
    • 只有未设置NOT NULL 约束和主键约束的列才可以清空为 NULL
    -- 将商品编号为0008的数据(圆珠笔)的登记日期更新为NULL 
    UPDATE Product   
    SET regist_date = NULL 
    WHERE product_id = '0008';

    多列更新

    • UPDATE 语句的 SET 子句支持同时将多个列作为更新对象
    -- 一条UPDATE语句只更新一列 
    UPDATE Product   
    SET sale_price = sale_price * 10 
    WHERE product_type = '厨房用具';
    
    UPDATE Product   
    SET purchase_price = purchase_price / 2 
    WHERE product_type = '厨房用具';
    
    -- 合并为一条 UPDATE 语句来处理。合并的方法有两种
    -- 方法一
    -- 使用逗号对列进行分隔排列
    UPDATE Product   
    SET sale_price = sale_price * 10,purchase_price = purchase_price / 2 
    WHERE product_type = '厨房用具';
    
    -- 方法二
    -- 将列用()括起来的清单形式 
    UPDATE Product   
    SET (sale_price, purchase_price) = (sale_price * 10,purchase_price / 2) 
    WHERE product_type = '厨房用具';

    事务

    什么是事务

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

    创建事务

    • 事务开始语句; 
      
      DML语句①; 
      DML语句②; 
      DML语句③; 
      . . . 
      
      事务结束语句(COMMIT或者ROLLBACK);
    • 使用事务开始语句和事务结束语句,将一系列 DML 语句(INSERT/ UPDATE/DELETE 语句)括起来,就实现了一个事务处理

      • 事务的开始语句 

        • SQL Server、PostgreSQL:BEGIN TRANSACTION
        • MySQL:START TRANSACTION
        • Oracle、DB2:无
    • COMMIT——提交处理 

      • COMMIT 是提交事务包含的全部更新处理的结束指令,相当 于文件处理中的覆盖保存
    • ROLLBACK——取消处理 

      • ROLLBACK 是取消事务包含的全部更新处理的结束指令, 相当于文件处理中的放弃保存
    • 事务处理何时开始 

      • 实际上,几乎所有的数据库产品的事务都无需开始指令

      • 不使用指令而悄悄开始事务的情况下,应该如何区分各个事务

        • A. 每条SQL语句就是一个事务(自动提交模式) 
        • B. 直到用户执行COMMIT或者ROLLBACK为止算作一个事务

    ACID特性

    DBMS 的事务都遵循四种特性,将这四种特性的首字母结合起来统 称为 ACID 特性。这是所有 DBMS 都必须遵守的规则。

    • 原子性(Atomicity) 

      • 原子性是指在事务结束时,其中所包含的更新处理要么全部执行,要么完全不执行,也就是要么占有一切要么一无所有
    • 一致性(Consistency)

      • 一致性指的是事务中包含的处理要满足数据库提前设置的约束,如主键约束或者 NOT NULL 约束等
      • 不合法的SQL会被取消,不会执行
      • 一致性也称为完整性
    • 隔离性(Isolation)

      • 隔离性指的是保证不同事务之间互不干扰的特性。该特性保证了事务之间不会互相嵌套
    • 持久性(Durability)

      • 持久性也可以称为耐久性,指的是在事务(不论是提交还是回滚)结束后,DBMS 能够保证该时间点的数据状态会被保存的特性
      • 保证持久性的方法根据实现的不同而不同,其中最常见的就是将事务 的执行记录保存到硬盘等存储介质中(该执行记录称为日志)
  • 相关阅读:
    php 信号量
    .net 反射初体验
    IEnumerable,IQueryable之前世今生
    [SQL]511+512+534+550+569
    [SQL]183+184+185+196+197
    [SQL]3.26--175+176+177+178+180+181+182
    [剑指offer]10.斐波那契数列+青蛙跳台阶问题
    [剑指offer]14-1.剪绳子
    [剑指offer]62.圆圈中最后剩下的数字
    [剑指offer]52.两个链表的第一个公共节点
  • 原文地址:https://www.cnblogs.com/dc2019/p/13775995.html
Copyright © 2020-2023  润新知