使用操作数据
使用操作数据
Oracle 提供数据操作语言命令来执行数据库中的数据操作。数据操作可以在需要时使用应用程序或业务数据填充数据库表、修改数据和从数据库中删除数据。除了数据操作之外,还有一组用于控制这些操作的命令。这些命令被归类为事务控制语言。
逻辑 SQL 事务中涉及三种类型的 DML 语句,即插入、更新、删除和合并。事务是数据库会话中 DML 操作的逻辑集合。
插入语句
INSERT 命令用于将数据存储在表中。INSERT 命令通常在 Visual Basic.NET 或 C++ 等高级编程语言中用作嵌入式 SQL 命令;但是,该命令也可以在命令模式下在 SQL*PLUS 提示符下执行。 INSERT 命令有两种不同的形式。如果新行将在该行的每一列中插入一个值,则使用第一种形式。INSERT 命令的第二种形式用于插入某些列数据未知或默认来自其他业务逻辑的行。这种形式的 INSERT 命令要求您指定要为其存储数据的列名。
句法:
如果表中所有列的值都是明确且已知的,则可以遵循以下语法。
INSERT INTO table VALUES (column1 value, column2 value, ...);
如果只需要用值填充表中的几列,则可以使用以下语法。其余的列可以将它们的值推导出为 NULL 或从不同的业务逻辑中推导出来。
INSERT INTO table (column1 name, column2 name, . . .) VALUES (column1 value, column2 value, . . .);
下面的 INSERT 语句在 EMPLOYEES 表中创建一个新员工记录。请注意,它会插入主列 EMPLOYEE_ID、FIRST_NAME、SALARY 和 DEPARTMENT_ID 的值。
INSERT INTO employees (EMPLOYEE_ID, FIRST_NAME, SALARY, DEPARTMENT_ID) VALUES (130, 'KEMP', 3800, 10);
否则,可以在 EMPLOYEES 表中插入完整的员工数据,而无需使用以下 INSERT 语句指定列列表 – 前提是这些值是事先已知的,并且必须符合表中列的数据类型和位置。
INSERT INTO employees VALUES (130, 'KEMP','GARNER', '[email protected]', '48309290',TO_DATE ('01-JAN-2012'), 'SALES', 3800, 0, 110, 10);
要插入的值必须与列的数据类型兼容。文字、固定值和特殊值(如函数、SYSDATE、CURRENT_DATE、SEQ.CURRVAL (NEXTVAL) 或 USER)可用作列值。指定的值必须遵循通用规则。字符串文字和日期值必须用引号括起来。日期值可以以 DD-MON-RR 或 D-MON-YYYY 格式提供,但首选 YYYY,因为它明确指定了世纪,并且不依赖于内部 RR 世纪计算逻辑。
INSERT-AS-SELECT (IAS) 语句
可以使用 INSERT..AS..SELECT (IAS) 操作将数据从源表填充到目标表中。它是一种直接路径读取操作。它是一种创建从一个表到另一个表的数据副本或创建源表操作在线的表的备份副本的简单方法。
例如,可以将数据从 EMPLOYEES 表复制到 EMP_HISTORY 表。
INSERT INTO EMP_HISTORY SELECT EMPLOYEE_ID, EMPLOYEE_NAME, SALARY, DEPARTMENT_ID FROM employees;
更新语句
UPDATE 命令修改存储在列中的数据。它可以根据 WHERE 子句中指定的条件过滤的结果集一次更新单行或多行。请注意,更新列与更改列不同。在本章前面,您学习了 ALTER 命令。ALTER 命令更改表结构,但不影响表数据。UPDATE 命令更改表中的数据,而不是表结构。
句法:
UPDATE table SET column = value [, column = value ...] [WHERE condition]
从语法上看,
SET column = 表达式可以是将更新指定列名中数据的字符、公式或函数的任意组合。WHERE 子句是可选的,但如果包含它,它指定将更新哪些行。只有一个表可以使用 UPDATE 命令一次更新。
下面的 UPDATE 语句将员工 JOHN 的工资更新为 5000。
UPDATE employees SET salary = 5000 WHERE UPPER (first_name) = 'JOHN';
虽然 WHERE 谓词是可选的,但必须在逻辑上附加,以便仅修改表中所需的行。下面的 UPDATE 语句更新表中所有员工的工资。
UPDATE employees SET salary = 5000;
多列也可以通过在 SET 子句中指定多列来更新,以逗号分隔。例如,如果 JOHN 的薪水和工作角色必须分别更改为 5000 和 SALES,则 UPDATE 语句如下所示,
UPDATE employees SET SALARY = 5000, JOB_ID = 'SALES' WHERE UPPER (first_name) = 'JOHN'; 1 row updated.
另一种更新同一行多列的方式展示了子查询的用法。
UPDATE employees SET (SALARY, JOB_ID) = (SELECT 5000, 'SALES' FROM DUAL) WHERE UPPER (ENAME) = 'JOHN'
删除语句
DELETE 命令是最简单的 SQL 语句之一。它从表中删除一行或多行。SQL 中不允许多个表删除操作。DELETE 命令的语法如下。
DELETE FROM table_name [WHERE condition];
DELETE 命令删除表中满足可选 WHERE 子句中条件的所有行。由于 WHERE 子句是可选的,因此可以通过省略 WHERE 子句轻松删除表中的所有行,因为 WHERE 子句限制了 DELETE 操作的范围。
下面的 DELETE 语句将从 EMP 表中删除 EDWIN 的详细信息。
DELETE employees WHERE UPPER (ENAME) = 'EDWIN' 1 row deleted.
注意:DELETE [TABLE NAME] 和 DELETE FROM [TABLE NAME] 具有相同的含义。
条件删除语句中的 WHERE 条件可以使用子查询,如下所示。
DELETE FROM employees WHERE DEPARTMENT_ID IN (SELECT DEPARTMENT_ID FROM LOCATIONS WHERE LOCATION_CODE = 'SFO')
截短
Truncate 是一个 DDL 命令,用于从表中清除所有记录但保留表结构。它不支持 WHERE 条件来删除选定的记录。
句法:
TRUNCATE [table name]
它是自动提交,即它提交会话中的当前活动事务。截断表不会删除相关索引、触发器或表约束。如果表 A 是数据库中表 B 的引用约束的父表,则无法截断表 A。
交易
事务是在数据库中完成的逻辑工作单元。它可以包含 –
-
多个以 TCL 命令结尾的 DML 命令,即 COMMIT 或 ROLLBACK
-
一个 DDL 命令
-
一个 DCL 命令
事务的开始用第一个 DML 命令标记。它以 TCL、DDL 或 DCL 命令结束。TCL 命令,即 COMMIT 或 ROLLBACK 是明确发出以结束活动事务的。根据它们的基本行为,如果在数据库会话中执行了任何 DDL 或 DCL 命令,则提交会话中正在进行的活动事务。如果数据库实例异常崩溃,则停止事务。
COMMIT、ROLLBACK 和 SAVEPOINT 是事务控制语言。COMMIT 将数据更改永久应用到数据库中,而 ROLLBACK 执行反提交操作。SAVEPOINT 通过在不同的事务阶段设置标记来控制事务的序列。用户可以将当前事务回滚到之前设置的所需保存点。
提交– 提交通过将数据更改永久应用到数据库表中来结束当前活动事务。COMMIT 是一个 TCL 命令,它明确地结束事务。但是,DDL 和 DCL 命令隐式提交事务。
SAVEPOINT – Savepoint 用于标记会话中当前事务中的特定点。由于它是事务中的逻辑标记,因此无法在数据字典中查询保存点。
ROLLBACK – ROLLBACK 命令用于通过丢弃数据更改来结束整个事务。如果事务包含标记的保存点,则 ROLLBACK TO SAVEPOINT [name] 可用于仅将事务回滚到指定的保存点。因此,直到指定保存点的所有数据更改都将被丢弃。
示范
考虑 EMPLOYEES 表,该表在每年第一季度填充了新雇用的员工详细信息。文员为每个员工详细信息附加一个保存点,以便在数据馈送活动期间随时回滚任何错误数据。请注意,他保持保存点名称与员工名称相同。
INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id) VALUES (105, 'Allen',TO_DATE ('15-JAN-2013','SALES',10000,10); SAVEPOINT Allen; INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id) VALUES (106, 'Kate',TO_DATE ('15-JAN-2013','PROD',10000,20); SAVEPOINT Kate; INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id) VALUES (107, 'McMan',TO_DATE ('15-JAN-2013','ADMIN',12000,30); SAVEPOINT McMan;
假设,数据馈送操作员意识到他错误地输入了“凯特”和“麦克曼”的工资。他将活动事务回滚到保存点 Kate 并重新输入 Kate 和 McMan 的员工详细信息。
ROLLBACK TO SAVEPOINT Kate; INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id) VALUES (106, 'Kate',TO_DATE ('15-JAN-2013','PROD',12500,20); SAVEPOINT Kate; INSERT INTO employees (employee_id, first_name, hire_date, job_id, salary, department_id) VALUES (107, 'McMan',TO_DATE ('15-JAN-2013','ADMIN',13200,30); SAVEPOINT McMan;
一旦他完成了数据输入,他就可以通过在当前会话中发出 COMMIT 来提交整个事务。
读取一致性
Oracle 在数据访问和读/写操作方面保持每个会话中用户之间的一致性。
当表上发生 DML 时,该操作更改的原始数据值会记录在数据库的撤消记录中。只要事务没有提交到数据库中,其他会话中的任何用户在以后查询修改后的数据时都会查看原始数据值。Oracle 使用系统全局区域中的当前信息和撤消记录中的信息为查询构建表数据的读一致性视图。只有在提交事务时,事务的更改才会永久生效。事务是 Oracle 提供读取一致性策略的关键。
读取一致性视图的起点是代表读者生成的
控制修改的数据何时可以被数据库的其他事务看到以进行读取或更新