📜  使用数据

📅  最后修改于: 2020-12-29 04:23:53             🧑  作者: Mango


Oracle提供了数据操作语言命令来执行数据库中的数据操作。数据操作可以在需要时用应用程序或业务数据填充数据库表,修改数据以及从数据库中删除数据。除了数据操作外,还有用于控制这些操作的命令集。这些命令被分组为事务控制语言。

逻辑SQL事务中涉及三种DML语句,即插入,更新,删除和合并。事务是数据库会话中DML操作的逻辑集合。

INSERT语句

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);

否则,可以使用下面的INSERT语句将完整的员工数据插入EMPLOYEES表中,而无需指定列列表-前提是这些值是预先已知的,并且必须符合表中列的数据类型和位置。

INSERT INTO employees
VALUES (130, 'KEMP','GARNER', 'kemp.garner@xxx.com', '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语句

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子句限制了DELETE操作的范围,因此可以通过省略WHERE子句轻松地删除表中的所有行。

下面的DELETE语句将从EMP表中删除EDWIN的详细信息。

DELETE employees
WHERE UPPER (ENAME) = 'EDWIN'

1 row deleted.

注意:DELETE [TABLE NAME]和DELETE FROM [TABLE NAME]具有相同的含义。

条件delete语句中的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-提交通过将数据更改永久应用到数据库表中来结束当前活动事务。 COMMIT是一个TCL命令,用于显式结束事务。但是,DDL和DCL命令隐式提交事务。

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”和“ 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提供读取一致性的策略的关键。

代表读者生成读取一致视图的起点

控制何时可以通过数据库的其他事务查看修改的数据以进行读取或更新