Oracle DML

DML

Data Manipulation Language,数据操纵语言;简单的说就是SQL中的增、删、改 等语句。

INSERT

INSERT语句

  1. INSERT INTO table [(column [, column...])]
  2. VALUES (value [, value...]);

方式一:写出表名+列名

注意:在“列”中,对于不允许为NULL的列,必须写出来;对于允许为NULL的列,可以不写出来 在Value中,对于列中未写出来的列,默认赋予NULL值

  1. INSERT INTO departments (department_id, department_name )
  2. VALUES (30, 'Purchasing' );

方式二:仅写出表名

注意:在Value中必须对应写出每个列的值,即是是允许NULL的字段,也必须显式的给出 NULL

  1. INSERT INTO departments (department_id, department_name )
  2. VALUES (30, 'Purchasing' );

方式三:从另一个表中 Copy 一行

语法:

  1. INSERT INTO table [ column (, column) ] subquery;

注意:在这种方式下,不要使用VALUES 关键字

方式四:使用子查询作为插入目标

  1. INSERT INTO
  2. (SELECT employee_id, last_name,
  3. email, hire_date, job_id, salary, department_id
  4. FROM employees
  5. WHERE department_id = 50)
  6. VALUES (99999, 'Taylor', 'DTAYLOR', TO_DATE('07-JUN-99', 'DD-MON-RR'),
  7. 'ST_CLERK', 5000, 50);

WITH CHECK OPTION 可以检查要插入的内容,是否符合目标子查询的Where条件

  1. INSERT INTO (SELECT employee_id, last_name, email,
  2. hire_date, job_id, salary
  3. FROM employees
  4. WHERE department_id = 50 WITH CHECK OPTION)
  5. VALUES (99998, 'Smith', 'JSMITH',
  6. TO_DATE('07-JUN-99', 'DD-MON-RR'),
  7. 'ST_CLERK', 5000);
  8. INSERT INTO
  9. *
  10. ERROR at line 1:
  11. ORA-01402: view WITH CHECK OPTION where-clause violation

INSERT增强

一个来源插入多个目标表(有条件,首次匹配即跳到下一条)

  1. INSERT FIRST
  2. WHEN SAL > 25000 THEN
  3. INTO special_sal VALUES(DEPTID, SAL)
  4. WHEN HIREDATE like ('%00%') THEN
  5. INTO hiredate_history_00 VALUES(DEPTID,HIREDATE)
  6. WHEN HIREDATE like ('%99%') THEN
  7. INTO hiredate_history_99 VALUES(DEPTID, HIREDATE)
  8. ELSE
  9. INTO hiredate_history VALUES(DEPTID, HIREDATE)
  10. SELECT department_id DEPTID, SUM(salary) SAL,
  11. MAX(hire_date) HIREDATE
  12. FROM employees
  13. GROUP BY department_id;

列转行(一行变多行,交叉报表的反操作)

  1. INSERT ALL
  2. INTO sales_info VALUES (employee_id,week_id,sales_MON)
  3. INTO sales_info VALUES (employee_id,week_id,sales_TUE)
  4. INTO sales_info VALUES (employee_id,week_id,sales_WED)
  5. INTO sales_info VALUES (employee_id,week_id,sales_THUR)
  6. INTO sales_info VALUES (employee_id,week_id, sales_FRI)
  7. SELECT EMPLOYEE_ID, week_id, sales_MON, sales_TUE,
  8. sales_WED, sales_THUR,sales_FRI
  9. FROM sales_source_data;

UPDATE

UPDATE 语句

  1. UPDATE table
  2. SET column = value [, column = value, ...]
  3. [WHERE condition];

方式一:更新符合条件的行中某些列为具体的值

  1. UPDATE employees SET department_id = 70
  2. WHERE employee_id = 113;

方式二:使用子查询的结果作为更新后的值

  1. UPDATE employees
  2. SET job_id = (SELECT job_id
  3. FROM employees
  4. WHERE employee_id = 205),
  5. salary = (SELECT salary
  6. FROM employees
  7. WHERE employee_id = 205)
  8. WHERE employee_id = 114;

注意:当存在约束的时候,某些更新可能会失败

DELETE

DELETE语句

  1. DELETE [FROM] table
  2. [WHERE condition];

举例一:删除某些符合条件的记录

  1. DELETE FROM departments
  2. WHERE department_name = 'Finance';

举例二:删除一张表中的所有记录

  1. DELETE FROM copy_emp;

如果遇到这种需求,也可以使用TRUNCATE 语句,TRUNCATE TABLE copy_emp ,但要注意,TRUNCATE 语句无法回滚,因此除非是单独执行,并非常确认,否则慎用。 :::tips 注意:当存在约束的时候,某些删除操作可能会失败 :::

MERGE 语句:比较整合语句

语法

  1. MERGE INTO table_name table_alias
  2. USING (table|view|sub_query) alias
  3. ON (join condition)
  4. WHEN MATCHED THEN
  5. UPDATE SET
  6. col1 = col_val1,
  7. col2 = col2_val
  8. WHEN NOT MATCHED THEN
  9. INSERT (column_list)
  10. VALUES (column_values);
  1. MERGE INTO copy_emp c
  2. USING employees e
  3. ON (c.employee_id = e.employee_id)
  4. WHEN MATCHED THEN
  5. UPDATE SET
  6. c.first_name = e.first_name,
  7. c.last_name = e.last_name,
  8. ...
  9. c.department_id = e.department_id
  10. WHEN NOT MATCHED THEN
  11. INSERT VALUES(e.employee_id, e.first_name, e.last_name,
  12. e.email, e.phone_number, e.hire_date, e.job_id,
  13. e.salary, e.commission_pct, e.manager_id,
  14. e.department_id);

事务控制

事务过程

ORACLE事务的过程
image.png
隐式的事务提交或回滚动作:
Commit,rollback 是显式的提交和回滚语句,还有一些隐式的提交和回滚是大家需要知道并引起注意的: 当如下事件发生是,会隐式的执行Commit动作:
1、数据定义语句被执行的时候,比如新建一张表:Create Table …
2、数据控制语句被执行的时候,比如赋权 GRANT …( 或者 DENY)
3、正常退出 iSQLPlus 或者PLSQL DEVELOPER,而没有显式的执行 COMMIT 或者 ROLLBACK 语句 。
当如下事件发生时,会隐式执行Rollback 动作:
1、非正常退出 iSQL
Plus,PLSQL DEVELOPER,或者发生系统错误。
在Commit 或者 Rollback前后数据的状态:
1、在数据已经被更改,但没有Commit前 ,被更改记录处于被锁定状态,其他用户无法进行更改;
2、在数据已经被更改,但没有Commit前 ,只有当前Session的用户可以看到这种变更 ,其他Session的用户 看不到数据的变化。
3、在数据已经被更改,并且被Commit后,被更改记录自动解锁,其他用户可以进行更改;
4、在数据已经被更改,并且被Commit后,其他Session的用户再次访问这些数据时,看到的是变化后的数据。 那么同理可知Rollback前后数据的状态及锁的变化。
读一致性: 用户对数据库的访问无非是两种情况
1、读数据 : Select 语句
2、写数据 : Insert 、Delete、Update 如果A用户要读的数据,B用户正在改,那么是否要等B改完再读出来呢? 如何保证在及其相近的时间内,让 多个用户读到一致的数据呢?(假设有用户正在改这一批数据的过程中,尚未提交。) Oracle的“读一致性”概念是指:
1、在任何时候,确保提供数据的一致性视图。
2、一个用户对数据的更改不会影响另一个用户对数据的更改。
3、“读一致性” 确保在同一时刻:

  • 3.1 读数据的人不需要等待写数据的人
  • 3.2 写数据的人不需要等待读数据的人 而“读一致性”的通俗理解就是: 对于有人正在修改过程中的一批数据,在其位提交前,其他用户读到的是 一致的内容。