Oracle从新手到高手
上QQ阅读APP看书,第一时间看更新

4.4 操作数据

SQL语句除了可以查询数据外,还可以完成插入、更新和删除数据等操作。在Oracle中创建表后,只有在表中插入数据之后,该表才有意义。如果表中的数据不合适,还可以对那些不合适的数据进行更新。如果某些数据已经不再需要,则可以删除这些数据。在操作数据的过程中,Oracle是通过各种事务来进行管理的。

4.4.1 插入数据

插入数据就是将数据放置到已经创建的表中,Oracle数据库通过INSERT语句来实现插入数据。一般情况下,使用INSERT语句可以一次插入一行数据。

与SELECT语句相比,INSERT语句的使用方式要简单得多。在INSERT语句的使用方式中,最为常用的形式是在INSERT INTO子句中指定添加数据的列,并在VALUES子句中为各个列提供一个值。

下面的语句将向SCOTT模式中的EMP表添加一条记录。

在向表中所有列添加数据时,可以省略INSERT INTO子句后的列表清单。使用这种方法时,必须根据表中定义的列的顺序,为所有的列提供数据,用户可以使用DESC命令查看表中定义列的顺序。下面的INSERT语句在向EMP表添加记录时省略了列清单。

在插入操作过程中,用户也可以根据实际情况只为部分列提供数据,而省略某些列的数据。注意这些列必须允许空值、有默认值或系统可以自动生成值等。例如,在EMP表中,除EMPNO列不允许空值外,其他列都可以为空值。

如果某个列不允许NULL值存在,而用户没有为该列提供数据,则会因为违反相应的约束而插入失败。事实上,在定义表的时候为了数据的完整性,经常会为表添加许多约束。例如,在EMP表中为了保证表中每条记录的唯一性,在表的EMPNO列上定义了主键约束。如果用户试图为表中的EMPNO列添加一个重复值,则会因为违反主键约束而失败。

      SQL> insert into emp(empno,ename,job)
        2  values(7782,'KING','CLERK');
      insert into emp(empno,ename,job)
      *
      第1行出现错误:
      ORA-00001: 违反唯一约束条件 (SCOTT.PK_EMP)

关于为表定义完整性约束,将在后面的章节中介绍,这里需要记住的是在向表添加记录时,添加的数据必须符合为表定义的所有完整性约束。

INSERT语句还有一种用法,可以实现一次向表中添加一组数据。即使用SELECT语句替换VALUES子句,这样由SELECT语句提供添加的数值。例如,下面的示例从EMP表提取属于某一部门的雇员信息并保存到另外一个表中。

      SQL> create table accounting_employees(
         2  empno number(4),
         3  ename varchar2(10),
         4  job varchar2(20),
         5  hiredate date,
         6  sal number(6,2));

      表已创建。

      SQL> insert into accounting_employees
         2  select empno,ename,job,hiredate,sal
         3  from emp
         4  where deptno=10;

      已创建5行。

从上面的语句执行结果可以看出,通过使用INSERT和SELECT语句的组合,一次性为新创建的表添加了5行数据。

提示:

在使用INSERT和SELECT语句的组合成批添加数据时,INSERT INTO子句后所指定的列名可以与SELECT子句指定的列名不同,但是其数据类型必须相匹配,即SELECT语句返回的数据必须满足表中的约束。

4.4.2 更新数据

如果表中的数据不合适,则需要对其修改或更新。在SQL中,用户可以使用UPDATE语句完成数据的更新操作。

在更新数据时,既可以一次更新一列,也可以一次更新多列。如果在UPDATE语句中使用了WHERE条件表达式,那么只有符合条件的记录才会被更新;如果没有使用WHERE条件表达式,那么更新表中所有行的数据。

在更新表中的数据时,这些更新操作不能违反表中的完整性约束。例如,在EMP表中,主键列EMPNO的数据不允许重复,因此如果更新后的数据与现存数据相同,则会因为违反主键约束而失败。如下所示。

      SQL> update emp
         2  set empno=7876
         3  where ename='CLARK';
      update emp
      *
      第1行出现错误:
      ORA-00001: 违反唯一约束条件 (SCOTT.PK_EMP)

提示:

在更新数据时,如果没有使用WHERE条件表达式,那么系统将会更新表中所有的数据。因此,在使用没有条件表达式的更新操作时一定要谨慎。

4.4.3 删除数据

如果表中的数据不再需要,那么就可以删除表中的数据。在删除表中的数据时,最常用的SQL语句是DELETE语句。

在删除操作中,既可以一次删除一行数据,也可以一次删除多行数据,更可以删除表中的所有数据。在DELETE语句中,如果没有使用WHERE条件表达式,那么将会删除表中的所有数据。例如,下面语句将删除EMP表中的ENAME列为ATG的记录行。

      SQL> delete from emp
         2  where ename='ATG';
      已删除1行。

在Oracle系统中,除了DELETE语句外,还可以使用TRUNCATE TABLE语句删除表中的所有数据。相比之下,使用TRUNCATE语句删除数据时,通常要比DELETE语句快得多。这是因为使用TRUNCATE TABLE语句删除数据时,它不会产生回退信息,因此执行TRUNCATE操作也不能撤销。例如,下面的语句将删除ACCOUNTING_EMPLOYEES表中所有的记录。

      SQL> truncate table accounting_employees;
      表被截断。

在用TRUNCATE语句删除数据时,还可以使用关键字REUSE STORAGE,表示删除记录后仍然保存记录占用的空间;与此相反,也可以使用DROP STORACE关键字,表示删除记录后立即回收记录占用的空间,默认在TRUNCATE TABLE语句中使用DROP STORAGE关键字。使用关键字REUSE STORAGE保留删除记录后的空间的TRUNCATE语句如下。

      SQL> truncate table accounting_employees reuse storage;
      表被截断。