暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle PL/SQL 基础教程(10)数据操纵语句(下)

SQL干货分享 2021-12-29
552

(CSDN博主:写代码也要符合基本法)
马瘦毛长蹄子胖,老两口子睡热炕
老头儿要睡炕头上,老婆子就还偏不让
老头儿拿起顶门棍儿,老太太抄起擀面杖
这二位,乒登乓当打到了天亮
热炕晾个冰凉,一宿谁也没睡上

各位看官老爷早上好,转眼又到了周三我们交流 PL/SQL 基础的日子。上上上上*N周我们分享了数据操纵语句(DML)中的插入语句 INSERT,今天我们把剩下的更新(UPDATE)和删除(DELETE)语句一起分享一下
UPDATE 语句用于更新表中已有的数据,可以精确到字段;DELETE 语句用于移除表中已有的行,是记录级的操作

UPDATE
如其词义,UPDATE 用于更改表中的已有数据。执行一次更改允许发生在一行或多行,也允许不发生在任何行;执行一次更改,允许变更一列或多列的值;UPDATE 语句只在影响的各行上,执行指定的列值变更,决不影响语句未提及的列的值
UPDATE 语句的一般语法格式为:
UPDATE table_name SET column1 = expr1[, column2 = expr2...] [WHERE conditions]

UPDATE 语句中的 WHERE 部分是可选的,它用以圈定语句执行变更的行范围:表中只有满足 WHERE 指示条件的行,才会受到语句的影响。如果省略 WHERE 部分,则表示在表中所有的行上执行更新

SET 部分是指示受变更的列范围的,在这里要挑明更新哪些列,以及将列值更新成什么,以“列名 = 值”的形式表现,注意值必须符合列的规定(如数据类型、约束条件等)。多个列-值对表达式间以逗号相隔
例1:
UPDATE emp e
SET e.mgr = '7698', e.sal = e.sal * 1.5, e.hiredate = to_date('2021-07-01', 'yyyy-mm-dd')
WHERE e.empno = '6666';
结果:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 6666 YUSUF      ANALYST    7698 2021/7/1      4500.00               10

上例表示更新 EMP 表中 EMPNO 值为 6666 的行,更新细则为将 MGR 列更新作 7698,将 SAL 更新作原来的 1.5 倍,HIREDATE 列更新作 TO_DATE 函数返回的日期数据

这里我们能观察到,UPDATE 语句中支持使用表别名;更新值既可以直接写明,也可以使用表达式(表达式支持引用表本身的列,取出的是更新前的值),还允许使用标量函数
例2:
UPDATE emp e
SET e.mgr = '7698'
,(e.sal, e.hiredate) =
(SELECT t.sal, t.hiredate FROM emp_temp t WHERE t.empno = e.empno)
WHERE e.empno = '6666';
结果:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
6666 YUSUF ANALYST 7698 10

上例表示更新 EMP 表中 EMPNO 值为 6666 的行,更新细则为将 MGR 列更新作 7698,SAL 和 HIREDATE 列分别更新作子查询返回的值

这也是一种常见的 UPDATE 语句格式,更新值除了支持使用标量函数,标量子查询也是允许的,这个子查询和要更新的表可以是相关的,也可以是不相关的。要求是子查询返回的列与更新表的列必须一一对应,返回数据也必须符合列的规定,当使用子查询更新表的一列时,表列可以不括括号

还有一点值得注意的是,我们对 UPDATE 语句执行时更新过程的理解。关于 SET 部分里面涉及的表达式、函数、子查询等的运算,实际上它们的运算处理在受影响的行与行之间,同一行里被更新的列与列之间,都是有先后次序的。但是,把这些运算结果(连同那些语句里直接写明的值)写入到对应列这一动作,是在同一时间进行的。所以即便一直是在同一会话中,由于每个表达式、函数、子查询等依次运行期间,表还没开始用新值覆盖原值,进而如果是引用了更新表自己的一些列,从它们中取出的值也都是语句执行开始时各自的数据,不会发生一个UPDATE语句里列值的“内部传递”
例3:
SQL> SELECT col1, col2 FROM demo_update;


COL1 COL2
---------- ----------
10 20
10 20
10 20


SQL> -- 表更新结果不会在列之间传递
SQL> UPDATE demo_update SET col1 = col2, col2 = col1;


3 rows updated


SQL> SELECT col1, col2 FROM demo_update;


COL1 COL2
---------- ----------
20 10
20 10
20 10


SQL> -- 表更新结果不会在行之间传递
SQL> UPDATE demo_update
2 SET col1 =
3 (SELECT MAX(col1) + 10 FROM demo_update);


3 rows updated


SQL> SELECT col1, col2 FROM demo_update;


COL1 COL2
---------- ----------
30 10
30 10
        30         10
DELETE
DELETE 语句用于从表中删除行数据,注意是整行删除,而不是只清除某几个字段里的值。语法为:
DELETE FROM table_name [WHERE conditions];


例如:
DELETE FROM emp e WHERE e.empno = '6666';


DELETE FROM emp e
WHERE EXISTS (SELECT 1 FROM emp_temp t WHERE t.empno = e.empno);
结果:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980/12/17 800.00 20
7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30
7566 JONES MANAGER 7839 1981/4/2 2975.00 20
7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30
7782 CLARK MANAGER 7839 1981/6/9 2450.00 10
7788 SCOTT ANALYST 7566 1982/12/9 3000.00 20
7839 KING PRESIDENT 1981/11/17 5000.00 10
7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30
7876 ADAMS CLERK 7788 1983/1/12 1100.00 20
7900 JAMES CLERK 7698 1981/12/3 950.00 30
7902 FORD ANALYST 7566 1981/12/3 3000.00 20
7934 MILLER CLERK 7782 1982/1/23 1300.00 10

请注意,如果不声明 WHERE 条件的话,DELETE 语句将删除表中所有的行

文章转载自SQL干货分享,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论