关闭

【oracle学习】4.处理数据

303人阅读 评论(0) 收藏 举报
分类:
还是先介绍一下我们要用到的两张表以及数据:
员工信息表
create table EMP(
    EMPNO NUMBER,
    ENAME VARCHAR2(10),
    JOB VARCHAR2(9),
    MGR NUMBER,
    HIREDATE DATE,
    SAL BINARY_DOUBLE,
    COMM BINARY_DOUBLE,
    DEPTNO NUMBER
);
其中job是职位,mgr是该员工的上司的id,sal是工资,comm是提成,deptno是所属部门。

SQL> select * from emp;
          EMPNO ENAME                JOB                            MGR HIREDATE         SAL  COMM          DEPTNO
--------------- -------------------- ------------------ --------------- -------------- ----- ----- ---------------
           1110 张三                 主管                          1110 12-3月 -14      5200     0          20
           1111 李四                 销售                          1116 03-11月-15      3400   500          30
           1112 王五                 销售                          1116 25-4月 -12      4400   800          30
           1113 赵二                 后勤                          1110 30-5月 -11      3450     0          40
           1114 李磊磊               会计                          1110 22-12月-15      2500     0          50
           1115 张少丽               销售                          1110 11-3月 -16      2400  1400          30
           1116 林建国               主管                          1116 22-1月 -16      5700     0          20
           1117 马富邦               后勤                          1116 22-7月 -13      2800     0          40
           1118 沈倩                 会计                          1116 06-5月 -10      2100     0          50

部门表
create table dept(
    DEPTNO NUMBER,
    DNAME VARCHAR2(50)
);
SQL> select * from dept t;

DEPTNO    DNAME
--------  --------
20        管理部门
30        销售部门
40        后勤部门
50        金融部门

SQL语句分为三种语句:
1. DML语句(Data Manipulation Language 数据操作语言): insert update delete select
2. DDL语句(Data Definition Language 数据定义语言): create/alter/drop/truncate table
                                                   create/drop view,create/drop index(sequence,synonym)
3. DCL语句(Data Control Language 数据控制语言): commit rollback

这次主要探讨DML语句的数据处理。

(1)地址符

首先看一下我们员工信息表emp的表结构
desc emp
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 EMPNO                                              NUMBER
 ENAME                                              VARCHAR2(10)
 JOB                                                VARCHAR2(9)
 MGR                                                NUMBER
 HIREDATE                                           DATE
 SAL                                                BINARY_DOUBLE
 COMM                                               BINARY_DOUBLE
 DEPTNO                                             NUMBER

如果我们插入员工,可以使用:
insert into emp(empno,ename,job,sal,hiredate,deptno)
values(1119,'汪强','主管',2300,sysdate,20);

还有一种动态的插入方法,就是使用地址符“&”的插入方法:
我们在控制台连接数据库之后,输入以下语句
SQL> insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno);

接下来控制台就会输出语句,让你填写相应的值,最终拼接到原来的语句上
输入 empno 的值:  1120
输入 ename 的值:  '刘丽丽'
输入 sal 的值:  3400
输入 deptno 的值:  50
原值    1: insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno)
新值    1: insert into emp(empno,ename,sal,deptno) values(1120,'刘丽丽',3400,50)

当我们执行完一次之后,只需要输入“/”,就可以再次使用刚刚那个语句,进行插入:
SQL> /
输入 empno 的值:  1121
输入 ename 的值:  '马德华'
输入 sal 的值:  2800
输入 deptno 的值:  40
原值    1: insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno)
新值    1: insert into emp(empno,ename,sal,deptno) values(1121,'马德华',2800,40)

已创建 1 行。

我们注意到,我们输入的ename是一个字符串,每次填写都需要写一对单引号(''),我们可以在定义
语句的时候提前将单引号定义在含有地址符的那个参数上,那么我们输入数据的时候就不需要输入单引号了。
SQL> insert into emp(empno,ename,sal,deptno) values(&empno,'&ename',&sal,&deptno);
输入 empno 的值:  1122
输入 ename 的值:  朱丽洁
输入 sal 的值:  4000
输入 deptno 的值:  20
原值    1: insert into emp(empno,ename,sal,deptno) values(&empno,'&ename',&sal,&deptno)
新值    1: insert into emp(empno,ename,sal,deptno) values(1122,'朱丽洁',4000,20)

已创建 1 行。

当然,我们也可以在select语句中使用它:
SQL> select empno,ename,&a from emp;
输入 a 的值:  sal
原值    1: select empno,ename,&a from emp
新值    1: select empno,ename,sal from emp

     EMPNO ENAME                  SAL
---------- -------------------- -----
      1119 汪强                  2300
      1120 刘丽丽                3400
      1121 马德华                2800
      1122 朱丽洁                4000
      1110 张三                  5200
      1111 李四                  3400
      1112 王五                  4400
      1113 赵二                  3450
      1114 李磊磊                2500
      1115 张少丽                2400
      1116 林建国                5700

     EMPNO ENAME                  SAL
---------- -------------------- -----
      1117 马富邦                2800
      1118 沈倩                  2100

已选择13行。

可以把a参数换成job
输入 a 的值:  job
原值    1: select empno,ename,&a from emp
新值    1: select empno,ename,job from emp

     EMPNO ENAME                JOB
---------- -------------------- ------------------
      1119 汪强                 主管
      1120 刘丽丽
      1121 马德华
      1122 朱丽洁
      1110 张三                 主管
      1111 李四                 销售
      1112 王五                 销售
      1113 赵二                 后勤
      1114 李磊磊               会计
      1115 张少丽               销售
      1116 林建国               主管

     EMPNO ENAME                JOB
---------- -------------------- ------------------
      1117 马富邦               后勤
      1118 沈倩                 会计

已选择13行。

还可以动态指定从哪张表取数据:
SQL> select * from &a;
输入 a 的值:  emp
原值    1: select * from &a
新值    1: select * from emp

上面是从emp,然后也可以指定取dept表的数据
SQL> /
输入 a 的值:  dept
原值    1: select * from &a
新值    1: select * from dept
DEPTNO    DNAME
--------  --------
20        管理部门
30        销售部门
40        后勤部门
50        金融部门


(2)插入数据的各种方式

①借鉴老表,创建新表。只插入表结构,不拷贝数据
SQL> create table emp02 as select * from emp where 1=2;

表已创建。

SQL> desc emp
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 EMPNO                                              NUMBER
 ENAME                                              VARCHAR2(10)
 JOB                                                VARCHAR2(9)
 MGR                                                NUMBER
 HIREDATE                                           DATE
 SAL                                                BINARY_DOUBLE
 COMM                                               BINARY_DOUBLE
 DEPTNO                                             NUMBER

②从其他表向目标表导入数据
一次性将emp中所有20号部门的员工插入到emp02表
SQL> insert into emp02 select * from emp where deptno=20;

已创建4行

SQL> commit;

提交完成。

查看一下结果:
SQL> select * from emp02;

     EMPNO ENAME                JOB                       MGR HIREDATE         SAL  COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ----- ----- ----------
      1119 汪强                 主管                          26-8月 -16      2300               20
      1122 朱丽洁                                                             4000               20
      1110 张三                 主管                     1110 12-3月 -14      5200     0         20
      1116 林建国               主管                     1116 22-1月 -16      5700     0         20

(3)删除表

删除方法一:
truncate table emp20;

删除方法二:
delete from emp20;

delete和truncate table的区别
1. delete是DML,truncate是DDL (DML可以rollback,DDL不可以)
2. delete逐条删除;truncate先摧毁,再重建
3. delet会产生碎片;truncate不会
4. delete不会释放空间;truncate会

当删除的数据比较多的时候,如果数据不重要,没有回滚的可能性,那就使用truncate。
因为truncate比delete的删除速度快很多,因为它不需要考虑数据,是直接摧毁表然后再建立一个新表。


(4)保存点
保存点是用来标记目前的操作进程,当下一次rollback回滚的时候,可以设置从自己
设置的某个保存点开始回滚。
SQL> create table testsavepoint
  2  (tid number,tname varchar2(20));

表已创建。

SQL> insert into testsavepoint values(1,'Tom');

已创建 1 行。

SQL> insert into testsavepoint values(2,'Mary');

已创建 1 行。

然后我们创建一个保存点
SQL> savepoint a;

保存点已创建。

SQL> insert into testsavepoint values(3,'jack');

已创建 1 行。

SQL> rollback to savepoint a;

回退已完成。

然后看一下我们的数据
SQL> select * from testsavepoint;

       TID TNAME
---------- ----------------------------------------
         1 Tom
         2 Mary

我们的数据,还是和之前创建保存点之前一样,所以我们的回滚,是发生在保存点之后。

转载请注明出处:http://blog.csdn.net/acmman/article/details/52350259

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:979464次
    • 积分:17888
    • 等级:
    • 排名:第527名
    • 原创:815篇
    • 转载:18篇
    • 译文:0篇
    • 评论:468条
    关于我
    就职:上海远成物流信息部
    职位:中级Java开发工程师
    负责:物流系统开发与维护
    院校:河南理工大学
    专业:软件工程12级
    邮箱:jackZhuCoder@126.com
    Q Q :10101000101001010111
    1101111010
    博客专栏
    最新评论