Oracle数据库从入门到运维实战
上QQ阅读APP看书,第一时间看更新

2.2 DML语句

DML是(Data Manipulation Language,数据操纵语言)的缩写。如果说SELECT语句对数据进行的是读操作,那么DML语句对数据进行的是写操作。DML语句的操作对象是表中的行,这样的语句一次可以影响一行或多行数据。DML语句包括3种操作:插入(INSERT)、删除(DELETE)、修改(UPDATE)。

2.2.1 INSERT语句(插入操作)

INSERT语句的作用是在表中插入一行,它的语法格式为:

INSERT INTO表(列1,列2,…)VALUES(表达式1,表达式2,…);

在向表中插入一行时,INSERT语句将表达式的值作为对应列的值,列的排列顺序、数据类型和数量应该与表达式一致,否则可能会出错。如果没有指定某个列,那么在插入数据时这个列的值将为空。在表达式中,字符串类型数据的大小写是敏感的,日期型数据的格式在不同系统中是有区别的。例如,要往dept表中插入一行,部门号为50,部门名称为NETWORK,部门地址为BEIJING,相应的INSERT语句为:

SQL>INSERT INTO dept(deptno,dname,loc)VALUES(50,'NETWORK','BEIJING');  [00093]

在INSERT语句中如果指定了列名,那么它们的顺序可以随意,只要与VALUES子句中的表达式一一对应即可。如果要为所有的列都提供数据,则可以省略列名,但是VALUES子句中表达式的顺序、数据类型和数量必须与表中列的定义一致。例如,上面的INSERT语句为所有的3个列都提供了数据,所以可以简写为:

SQL>INSERT INTO dept VALUES(50,'NETWORK','BEIJING');  [00094]

在INSERT语句中为各列指定数据时,可以指定一个常量,或者指定一个表达式,如函数、算术运算表达式等。例如,当公司新来一名员工时,可以将当前时间作为它的受聘日期,作为表emp中列hiredate的值:

SQL>INSERT INTO emp(empno,ename,deptno,sal,hiredate)VALUES(9999,'Hello',30,1000,SYSDATE);  [00095]

利用INSERT语句中还可以从另一个表中复制数据,这时要在INSERT语句中使用子查询,对应的语法格式为:

INSERT INTO表1(列l,列2,…)SELECT列1,列2,… FROM表2 WHERE条件表达式

这里的SELECT子句实际上是一个子查询。执行这样的语句时,首先执行SELECT子句,将返回的查询结果作为指定列的值,插入表1中。用这种方法可以一次向表中插入多行,但是需要注意的是,表1的指定各列要与SELECT子句中的各列在排列顺序、数据类型和数量上保持一致。例如,假设有一个表empl,它的结构与emp相同,现在希望从表emp中将部门10和部门20的员工数据复制到表empl中,相应的SELECT语句为:

SQL>INSERT INTO empl(empno,ename,deptno,sal,hiredate)SELECT empno,ename,deptno,sal,hiredate FROM emp WHERE deptno=10 or deptno=20;  [00096]

2.2.2 DELETE语句(删除操作)

DELETE语句用来从表中删除指定的行,它一次可以删除一行,也可以删除多行。DELETE语句的语法格式为:

DELETE FROM表名WHERE条件

在默认情况下,DELETE语句可以不使用WHERE子句,这时将删除表中的所有行。例如,下面的DELETE语句将删除表emp中的所有行:

SQL>DELETE FROM emp;  [00097]

如果希望只删除表中的一部分数据,需要通过WHERE指定条件。例如,要从表emp中删除部门30的工资低于1000元的员工数据,相应的DELETE语句为:

SQL>DELETE FROM emp WHERE deptno=30 AND sal<1000;  [00098]

在DELETE语句的WHERE子句中也可以使用子查询,子查询与SELECT语句中的子查询用法相同。例如,要从表dept中删除这样的部门数据,它在表emp中没有所属的员工,即空部门,相应的DELETE语句为:

DELETE FROM dept WHERE deptno NOT in(SELECT distinct deptno FROM emp);[00099]

2.2.3 UPDATE语句(修改操作)

UPDATE语句的作用是对表中已经存在的数据进行修改。它可以一次修改一行,也可以修改多行。这条语句的语法格式为:

UPDATE语句通过SET子句为指定列指定新值,将列值修改为指定的表达式。在SET子句中指定所有需要修改的列。在默认情况下,UPDATE语句不需要WHERE子句,这时UPDATE语句将修改表中的所有行。例如,下面的UPDATE语句将emp表中所有员工的工资增加10%,奖金增加100元:

SQL>UPDATE emp SET sal=sal*l.l,comm=nvl(comm,0)+100;  [000100]

如果通过WHERE子句指定了条件,那么UPDATE语句只修改满足条件的行。例如,如果要为部门10和20中工资高于2000元的员工增加工资和奖金,增加幅度与上一条UPDATE语句相同。相应的UPDATE语句为:

SQL>UPDATE emp SET sal=sal*l.l,comm=nvl(commr,0)+100 WHERE deptno=l0 OR deptno=20 AND sal>2000;  [000101]

在UPDATE语句的WHERE子句中,也可以使用子查询。这时的条件并不是一个确定的条件,而是依赖于对另一个表的查询。例如,要对与员工BLAKE同在一个部门的员工增加工资和奖金,增加幅度与上一条UPDATE语句相同。相应的UPDATE语句为:

SQL>UPDATE emp SET sal=sal*l.l,comm=nvl(comm,0)+100 WHERE deptno=(SELECT deptno FROM emp WHERE ename='BLAKET');  [000102]