ORACLE_OCP之SQL_使用DML(数据处理语句)语句管理表

ORACLE_OCP之SQL_使用DML(数据处理语句)语句管理表

  • 在oracle数据库中,插入数据后要使用commit语句进行修改的提交,而在mysql数据库中,则不需要commit因为,mysql数据库默认的是自动提交。
  • 在oracle数据库中,插入数据后发现数据有问题或者有错误的时候,我们可以使用rollback语句撤销刚才的插入,但是有个前提,一定是在这条语句未发生commit之前,并且无论是oracle数据库还是mysql数据库插入数据时,都需要去关注,数据库表中该列是否有约束条件,比如说:主键约束、唯一键约束,非空约束等。
  • 撤销刚才的插入时,如果当插入时使用了sequence序列,那么在执行rollback之后,序列的值不会回滚。
  • 事务由构成逻辑工作单元的DML语句的集合组成

目录

  • 向表中添加新行:INSERT
  • 修改表中的现有行:UPDATE
  • 向表中添加新行
  • 从表中删除现有行:DELETE、TRUNCATE
  • 数据库的事务
  • 数据库事务:开始和结束
  • COMMIT和ROLLBACK的优点
  • 回滚标记:SAVEPOINT
  • COMMIT之前或ROLLBACK之前的数据状态
  • COMMIT之后的数据状态
  • ROLLBACK之后的数据状态
  • 回滚级别
  • 读取一致性
  • FOR UPDATE 。。。SELECT 语句

一、 向表中添加新行

INSERT 语句语法:

  • 通过使用INTSERT语句将新行添加到表中:

    INSERT INTO table [(column [, column…])]
    VALUES (value [, value…]);

    //栗子
    //departments 的表结构:
    名称 空值? 类型
    .--------------- -------- ------------
    DEPARTMENT_ID NOT NULL NUMBER(4)
    DEPARTMENT_NAME NOT NULL VARCHAR2(30)
    MANAGER_ID NUMBER(6)
    LOCATION_ID NUMBER(4)
    //使用INSERT语句向deparments表中插入一条数据,注意数据类型和插入关系
    INSERT INTO departments(department_id, department_name, manager_id, location_id)
    VALUES (70, ‘Public Relations’, 100, 1700);
    //简写:(插入全数据)
    INSERT INTO departments
    VALUES (70, ‘Public Relations’, 100, 1700);

    //从另一个表中查询,插入到当前表中(子查询的方式)
    //注意:大前提为必须已经建立好了sales_repos这张表,并且表中所有列的数据类型必须与查询语句找到的数据类型保持一致才可以。
    INSERT INTO sales_reps(id, name, salary, commission_pct)
    SELECT employee_id, last_name, salary, commission_pct
    FROM employees
    WHERE job_id LIKE ‘%REP%’;

    • 使用这种语法,一次只能插入一行
    • 插入一个新行,其中包含每一列的值。
    • 以表中列的默认顺序列出值并对应插入。
    • (可选)列出INSERT子句中的列。

二、修改表中的现有行

UPDATE 语句语法:

  • 使用UPDATE语句修改表中存在的数据:

    UPDATE table
    SET column = value [, column = value, …]
    [WHERE condition];

    • 一次更新多个行(如果需要的话)
    • 如果指定WHERE子句,则将修改一个或多个特定行的值:

    UPDATE employees
    SET department_id = 50
    WHERE employee_id = 113;

    • 如果省略WHERE子句,则会修改表中所有行的值:

    UPDATE copy_emp
    SET department_id = 110;

    • 指定SET column_name = NULL将列值更新为NULL

    • 使用子查询更新两列:

      • 更新103号员工的工作和工资以匹配205号员工的工作和工资

      UPDATE employees
      SET (job_id,salary) = (SELECT job_id,salary
      FROM employees
      WHERE employee_id = 205)
      WHERE employee_id = 103;

    • 使用UPDATE语句中的子查询可基于另一个表中的值更新表中的行值:

    UPDATE copy_emp
    SET department_id = (SELECT department_id
    FROM employees
    WHERE employee_id = 100)
    WHERE job_id = (SELECT job_id
    FROM employees
    WHERE employee_id = 200);

三、 向表中添加新行

四、从表中删除现有行

DELETE 语句

  • 可以使用DELETE语句从表中删除现有行

DELETE [FROM] table
[WHERE condition];

  • 如果指定WHERE子句,则删除特定的行

DELETE FROM departments
WHERE department_name = ‘Finance’;

  • 如果省略WHERE子句,则删除表中的所有行

DELETE FROM copy_emp;
DELETE copy_emp;

  • 使用DELETE语句中的子查询根据另一个表中的值从表中删除行

DELETE FROM employees
WHERE department_id IN
(SELECT department_id
FROM departments
WHERE department_name
LIKE ‘%Public%’);

TRUNCATE 语句

  • 从表中删除所有行,使表为空,并保持表结构完整
  • 是数据定义语言(DDL)语句而不是DML语句; 不能轻易撤消
  • 语法:

TRUNCATE TABLE table_name;

  • 栗子:

TRUNCATE TABLE copy_emp;

DELETE和TRUNCATE的区别:

  • TRUNCATE语句删除数据时是物理删除,DELETE语句是逻辑删除,TRUNCATE语句删除后无法使用ROLLBACK语句进行回退,而DELETE语句删除后可以回退,并且在删除大表数据的时候TRUNCATE语句速度要比DELETE语句速度快。

五、数据库事务控制使用COMMIT, ROLLBACK, and SAVEPOINT

  • 数据库事务由以下之一组成:
    • DML构成对数据的一致更改
    • 一个DDL语句
    • 一种数据控制语言(DCL)语句
  • 在数据库中三种语言是产生事务的:
    • DML语句产生事务:
      • INSERT、UPDATE、DELETE、MERGE、SELECT…FOR UPDATE
    • DDL语句产生事务:
      • CREATE、ALTER、DROP、TRUNCATE
    • DCL语句产生事务:
      • GRANT、REVOKE
    • TCL语句产生事务:
      • COMMIT、ROLLBACK
      • 虽然他自身是控制事务的,但是在执行者两条语句的时候,在数据库底层也发生相应的底层事务。

六、数据库事务:开始和结束

  • 从第一个DML SQL语句执行 开始
  • 以下列事件之一 结束
    • 发出COMMIT或ROLLBACK语句。
    • DDL或DCL语句执行(自动提交)。
    • 用户退出SQL Developer或SQL * Plus。
    • 系统崩溃。

七、COMMIT和ROLLBACK的优点

  • 使用COMMIT和ROLLBACK语句,可以:
    • 确保数据一致性
    • 在永久更改之前预览数据更改
    • 分组逻辑相关的操作

八、将更改回滚到标记

  • 使用SAVEPOINT语句在当前事务中创建一个标记。
  • 使用ROLLBACK TO SAVEPOINT语句回滚到该标记。

UPDATE…
SAVEPOINT update_done;
INSERT…
ROLLBACK TO update_done;

九、隐式事务处理

  • 在以下情况下会发生自动提交:
    • 发出的DDL语句
    • 发出的DCL语句
    • 从SQL Developer或SQL * Plus正常退出,而无需显式发出COMMIT或ROLLBACK语句
  • 当SQL Developer或SQL * Plus异常终止或系统故障时,将发生自动回滚。

十、 COMMIT之前或ROLLBACK之前的数据状态

  • 可以恢复数据的先前状态。
  • 当前会话可以通过使用SELECT语句查看DML操作的结果。
  • 其他会话无法查看当前会话发出的DML语句的结果。
  • 受影响的行被锁定; 其他会话无法更改受影响的行中的数据。

十一、COMMIT之后的数据状态

  • 数据更改保存在数据库中。
  • 数据的先前状态将被覆盖。
  • 所有会话都可以查看结果。
  • 受影响行上的锁被释放; 这些行可供其他会话操纵。
  • 所有保存点被删除。

十二、ROLLBACK之后的数据状态

  • 使用ROLLBACK语句丢弃所有未决的更改:
    • 数据更改被撤消。
    • 恢复数据的先前状态。
    • 受影响行上的锁已释放。

十三、回滚级别

  • 如果单个DML语句在执行期间失败,则仅回退该语句。
  • Oracle服务器实现隐式保存点。
  • 保留所有其他更改。
  • 用户应通过执行COMMIT或ROLLBACK语句显式终止事务。

十四、读取一致性

  • 读取一致性可确保始终保持一致的数据视图。
  • 一个用户所做的更改不会与另一用户所做的更改冲突。
  • 读取一致性可确保在相同数据上:
    • Readers do not wait for writers 读不等写
    • Writers do not wait for readers 写不等读
    • Writers wait for writers 写只等写

十五、FOR UPDATE 。。。SELECT 语句

  • 锁定EMPLOYEES表中的行,其中job_id为SA_REP

SELECT employee_id, salary, commission_pct, job_id
FROM employees
WHERE job_id = ‘SA_REP’
FOR UPDATE
ORDER BY employee_id;

  • 仅当您发出ROLLBACK或COMMIT时才释放锁定.
  • 如果SELECT语句尝试锁定被另一个用户锁定的行,则数据库将等待直到该行可用为止,然后返回 SELECT语句的结果.
  • 如果锁定行无数据,那么FOR UPDATE锁定将会自动撤销(失效)

总结

ORACLE_OCP之SQL_使用DML(数据处理语句)语句管理表_第1张图片

你可能感兴趣的:(ocp,oracle,数据库,sql)