首页 > 代码库 > 数据库编程3 Oracle 子查询 insert update delete 事务 回收站 字段操作 企业级项目案例

数据库编程3 Oracle 子查询 insert update delete 事务 回收站 字段操作 企业级项目案例

本文谢绝转载原文来自http://990487026.blog.51cto.com


<大纲>


数据库编程3 Oracle 子查询 insert update delete 事务 回收站 字段操作 企业级项目案例
	实验所用数据表
	子查询,解决一步不能求解
		查询工资比scott高的员工信息:	
		子查询知识体系搭建:	
		解释3,查询部门是sales的员工信息:	
			方法1:子查询
			[方法2]:多表:
			优化考虑:
		解释4[select],只能放单行子查询	
		解释4[from] 考题:显示员工姓名,薪水	
		解释4[where] 多行子查询in;	
		解释4[where] 多行子查询all返回最大值	
		解释4[where]查询不是经理的员工信息:	
		解释6,子查询遇见null ,not in 与in 的逻辑关系:	
		[难点:]习题1 rownum[分页]
		rownum知识点:
		[更难:]查找员工表中,薪水大于本部门平均薪水的员工:	
			方法1:
			方法2:相关子查询:
	DML	
	insert
		插入一条完整的记录:
		[插入日期]
		插入部分数据:
		数据插入脚本,取地址符:
		select 也可以使用取地址符:
		批量插入数据:把20号部门的员工信息一次性拷到一个表中
			1,创建一个与emp类型一样的表:
			OK那么就插入吧:
	update
			[全部更新]
			选择性更新
	delete
		删除一行:
		删除表的全部数据,但表结构还在:
		drop emp10 ;把整个表删除,结构也不存在了;
		truncate,删除表和结构再重新建表:
	关闭/打开 回显	
	[实验]比较delete与truncate的速度:	
		
		
	事务隔离性实验:Oracle默认打开事务
	事务的生命周期:		
	控制事务	
	事务隔离级别,SQL99标准:	
		
	创建表和管理表:	
		
		创建表的条件:
	创建并复制表:
	oracle 数据类型:
	
	表相关操作	
	超级用户查看scott用户的表:
	回收站 
	删除表[Oracle 有回收站]	
	查看回收站:

	往表中加入一字段
	修改字段的类型:	
	删除一个表的字段:	
		
	[Oracle]企业级项目案例	
		

[说明]本文实验基于以下数据表: dept表; emp表; salgrade表;

_______________________________ ________________
SQL> select * from dept;

    DEPTNO DNAME                        LOC
---------- ---------------------------- --------------------------
        10 ACCOUNTING                   NEW YORK
        20 RESEARCH                     DALLAS
        30 SALES                        CHICAGO
        40 OPERATIONS                   BOSTON
______________________ ____________________

SQL> select * from emp;

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
      7369 SMITH                CLERK                    7902 17-12月-80            800                 20
      7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300      30
      7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500      30
      7566 JONES                MANAGER                  7839 02-4月 -81           2975                 20
      7654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400      30
      7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                 30
      7782 CLARK                MANAGER                  7839 09-6月 -81           2450                 10
      7788 SCOTT                ANALYST                  7566 19-4月 -87           3000                 20
      7839 KING                 PRESIDENT                     17-11月-81           5000                 10
      7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0      30
      7876 ADAMS                CLERK                    7788 23-5月 -87           1100                 20
      7900 JAMES                CLERK                    7698 03-12月-81            950                 30
      7902 FORD                 ANALYST                  7566 03-12月-81           3000                 20
      7934 MILLER               CLERK                    7782 23-1月 -82           1300                 10
         1 tom_abc                                                                 8000                    10

已选择15行。
_____________________ ________________

SQL> select * from salgrade;

     GRADE      LOSAL      HISAL
---------- ---------- ----------
         1        700       1200
         2       1201       1400
         3       1401       2000
         4       2001       3000
         5       3001       9999






子查询,解决一步不能求解

查询工资比scott高的员工信息:

SQL> select * from emp where sal > (select sal from emp where ename=‘SCOTT‘);

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
      7839 KING                 PRESIDENT                     17-11月-81           5000                 10
         1 tom_abc                                                                 8000                    10

子查询知识体系搭建:

1,合理的书写风格;

2,()不能丢;

3,子查询与主查询可以是一张表,也可以不是一张表;

4,在什么地方放子查询;

select 后面可以放子查询,仅限单行子查询(返回一条数据 )

from 可以放子查询[重点]

where 可以放子查询

group by 不可以放子查询

having 可以放子查询

order by 不可以放子查询

5,子查询的分类;

单行操作符对应单行子查询,多行操作符对应多行子查询。

按照子查询返回的条目数,分为: 单行子查询和多行子查询

单行子查询只能使用单行比较操作符( = > >= < <= <>),  --ppt上的例子

多行子查询只能使用多行比较操作符(in any all)

--eg 单行例子ppt例子

--eg 查询部门名称是*(不是)SALES 和 ACCOUNTING 的员工信息  2种方法

--eg 查询薪水 比30号部门 任意一个员工薪高的员工信息

-eg 查询薪水 比30号部门 所有员工 高的员工信息

子查询按照执行的顺序

一般性子查询   相关子查询

6,子查询遇见null;



解释3,查询部门是sales的员工信息:

方法1:子查询

select * 
from  emp
where deptno=(select deptno from dept where dname=‘SALES‘);
EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
----- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
 7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300      30
 7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500      30
 7654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400      30
 7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                 30
 7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0      30
 7900 JAMES                CLERK                    7698 03-12月-81            950                 30


[方法2]:多表:


select e.*
from emp e,dept d
where e.deptno=d.deptno
and d.dname = ‘SALES‘;
EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
----- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
 7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0      30
 7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300      30
 7900 JAMES                CLERK                    7698 03-12月-81            950                 30
 7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500      30
 7654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400      30
 7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                 30


优化考虑:

子查询需要查询两次

多表查询,一次搞定,效率高.


解释4[select],只能放单行子查询

SQL> select  ename,empno,(select deptno from emp where empno=7369) from emp;

ENAME                     EMPNO (SELECTDEPTNOFROMEMPWHEREEMPNO=7369)
-------------------- ---------- ------------------------------------
SMITH                      7369                                   20
ALLEN                      7499                                   20
WARD                       7521                                   20
JONES                      7566                                   20
MARTIN                     7654                                   20
BLAKE                      7698                                   20
CLARK                      7782                                   20
SCOTT                      7788                                   20
KING                       7839                                   20
TURNER                     7844                                   20
ADAMS                      7876                                   20
JAMES                      7900                                   20
FORD                       7902                                   20
MILLER                     7934                                   20
tom_abc                       1                                   20



解释4[from] 考题:显示员工姓名,薪水

select *
--------------------自己填空
SQL> select * from (select ename,sal from emp);

ENAME                       SAL
-------------------- ----------
SMITH                       800
ALLEN                      1600
WARD                       1250
JONES                      2975
MARTIN                     1250
BLAKE                      2850
CLARK                      2450
SCOTT                      3000
KING                       5000
TURNER                     1500
ADAMS                      1100
JAMES                       950
FORD                       3000
MILLER                     1300
tom_abc                    8000



解释4[where] 多行子查询in;

查询 属于SALES部门 或运维部门的员工信息:

SQL> select  * from emp where deptno in (select deptno from dept where dname=‘SALES‘ or dname=‘OPERATIONS‘);

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
      7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0      30
      7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300      30
      7900 JAMES                CLERK                    7698 03-12月-81            950                 30
      7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500      30
      7654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400      30
      7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                 30



解释4[where] 多行子查询all返回最大值

SQL> select *
  2  from emp
  3  where sal >any(select sal from emp where deptno =30) order by ename;

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
      7876 ADAMS                CLERK                    7788 23-5月 -87           1100                 20
      7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300      30
      7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                 30
      7782 CLARK                MANAGER                  7839 09-6月 -81           2450                 10
      7902 FORD                 ANALYST                  7566 03-12月-81           3000                 20
      7566 JONES                MANAGER                  7839 02-4月 -81           2975                 20
      7839 KING                 PRESIDENT                     17-11月-81           5000                 10
      7654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400      30
      7934 MILLER               CLERK                    7782 23-1月 -82           1300                 10
      7788 SCOTT                ANALYST                  7566 19-4月 -87           3000                 20
      7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0      30
      7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500      30
         1 tom_abc                                                                 8000                    10
	 
	 
可以看出这是一样的:	 
SQL> select *
  2  from emp
  3  where sal > (select min(sal) from emp where deptno =30) order by ename;

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
      7876 ADAMS                CLERK                    7788 23-5月 -87           1100                 20
      7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300      30
      7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                 30
      7782 CLARK                MANAGER                  7839 09-6月 -81           2450                 10
      7902 FORD                 ANALYST                  7566 03-12月-81           3000                 20
      7566 JONES                MANAGER                  7839 02-4月 -81           2975                 20
      7839 KING                 PRESIDENT                     17-11月-81           5000                 10
      7654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400      30
      7934 MILLER               CLERK                    7782 23-1月 -82           1300                 10
      7788 SCOTT                ANALYST                  7566 19-4月 -87           3000                 20
      7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0      30
      7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500      30
         1 tom_abc                                                                 8000                    10


解释4[where]查询不是经理的员工信息:


是经理:

SQL> select * from emp where empno in (select mgr from emp );

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
      7566 JONES                MANAGER                  7839 02-4月 -81           2975                 20
      7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                 30
      7782 CLARK                MANAGER                  7839 09-6月 -81           2450                 10
      7788 SCOTT                ANALYST                  7566 19-4月 -87           3000                 20
      7839 KING                 PRESIDENT                     17-11月-81           5000                 10
      7902 FORD                 ANALYST                  7566 03-12月-81           3000                 20


不是经理的员工: 

SQL> select * from emp where empno not in (select mgr from emp where mgr is not null);

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
         1 tom_abc                                                                 8000                    10
      7369 SMITH                CLERK                    7902 17-12月-80            800                 20
      7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300      30
      7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500      30
      7654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400      30
      7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0      30
      7876 ADAMS                CLERK                    7788 23-5月 -87           1100                 20
      7900 JAMES                CLERK                    7698 03-12月-81            950                 30
      7934 MILLER               CLERK                    7782 23-1月 -82           1300                 10


解释6,子查询遇见null ,not in 与in 的逻辑关系:

select a,b,c
from table1
where deptno in (10,20,null);--只要有一个条件成立即可返回,OK

select a,b,c
from table1
where deptno not in (10,20,null);--全部不成立才能返回,不存在这样的集合--err


[难点:]习题1 rownum[分页]

求工资最高的前三名:

select empno,ename,sal
from
(
	select rownum r,empno,ename,sal
	from
	(
		select empno,ename,sal
		from emp
		order by sal desc
	)
	where rownum <=8
)	
where r <=3

三层:
最内层,排序好
中层,显示rownum
外层,过滤

rownum知识点:


1,rownum按照Oracle的默认机制上生成.

2,rownum只能使用<=,< 号,不能使用>,>=号.

rownum返回的结果集行号

(是一个固定的属性,固化到一行中,不会你因为你的排序而发生改变)


[更难:]查找员工表中,薪水大于本部门平均薪水的员工:

方法1:

select e.empno, e.ename, e.sal, d.avgsal
from emp e,
(
	select deptno,avg(sal) avgsal
	from emp
	group by deptno 
) d
where e.deptno=d.deptno and e.sal > d.avgsal;

内层:求各个部门的平均工资:
外层:连接,过滤


EMPNO ENAME                       SAL     AVGSAL
----- -------------------- ---------- ----------
 7499 ALLEN                      1600 1566.66667
 7566 JONES                      2975       2175
 7698 BLAKE                      2850 1566.66667
 7788 SCOTT                      3000       2175
 7839 KING                       5000     4187.5
 7902 FORD                       3000       2175
    1 tom_abc                    8000     4187.5


方法2:相关子查询:

1,主查询参数让子查询用,通过别名技术
2,自查询的结果被主查询使用

select empno, ename, sal, 
(
	select avg(sal) 
	from emp 
	where deptno = e.deptno
) avgsal
from emp e
where sal > 
(
	select avg(sal) 
	from emp
	where deptno = e.deptno
)
EMPNO ENAME                       SAL     AVGSAL
----- -------------------- ---------- ----------
 7499 ALLEN                      1600 1566.66667
 7566 JONES                      2975       2175
 7698 BLAKE                      2850 1566.66667
 7788 SCOTT                      3000       2175
 7839 KING                       5000     4187.5
 7902 FORD                       3000       2175
    1 tom_abc                    8000     4187.5



insert into


插入一条完整的记录:

SQL> select * from emp;

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
      7369 SMITH                CLERK                    7902 17-12月-80            800                 20
      7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300      30
      7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500      30
      7566 JONES                MANAGER                  7839 02-4月 -81           2975                 20
      7654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400      30
      7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                 30
      7782 CLARK                MANAGER                  7839 09-6月 -81           2450                 10
      7788 SCOTT                ANALYST                  7566 19-4月 -87           3000                 20
      7839 KING                 PRESIDENT                     17-11月-81           5000                 10
      7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0      30
      7876 ADAMS                CLERK                    7788 23-5月 -87           1100                 20
      7900 JAMES                CLERK                    7698 03-12月-81            950                 30
      7902 FORD                 ANALYST                  7566 03-12月-81           3000                 20
      7934 MILLER               CLERK                    7782 23-1月 -82           1300                 10
         1 tom_abc                                                                 8000                    10

已选择15行。

SQL> insert into emp values (2,‘aaa‘,‘clerk‘,7092,‘17-12月-80‘,8000,NULL,20);

已创建 1 行。

[插入日期]

SQL> insert into emp values(4,‘aaa‘,‘clerk‘,7092,sysdate,8000,NULL,20);

已创建 1 行。

SQL> select * from emp;

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
      7369 SMITH                CLERK                    7902 17-12月-80            800                 20
      7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300      30
      7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500      30
      7566 JONES                MANAGER                  7839 02-4月 -81           2975                 20
      7654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400      30
      7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                 30
      7782 CLARK                MANAGER                  7839 09-6月 -81           2450                 10
      7788 SCOTT                ANALYST                  7566 19-4月 -87           3000                 20
      7839 KING                 PRESIDENT                     17-11月-81           5000                 10
      7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0      30
      7876 ADAMS                CLERK                    7788 23-5月 -87           1100                 20
      7900 JAMES                CLERK                    7698 03-12月-81            950                 30
      7902 FORD                 ANALYST                  7566 03-12月-81           3000                 20
      7934 MILLER               CLERK                    7782 23-1月 -82           1300                 10
         1 tom_abc                                                                 8000                    10
         2 aaa                  clerk                    7092 17-12月-80           8000                    20
         3 abc                                                                                             20
         4 aaa                  clerk                    7092 26-8月 -16           8000                    20

已选择18行。

插入部分数据:

SQL> insert into emp(empno,ename,deptno) values (3,‘abc‘,20);

已创建 1 行。

SQL> select * from emp;

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
      7369 SMITH                CLERK                    7902 17-12月-80            800                 20
      7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300      30
      7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500      30
      7566 JONES                MANAGER                  7839 02-4月 -81           2975                 20
      7654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400      30
      7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                 30
      7782 CLARK                MANAGER                  7839 09-6月 -81           2450                 10
      7788 SCOTT                ANALYST                  7566 19-4月 -87           3000                 20
      7839 KING                 PRESIDENT                     17-11月-81           5000                 10
      7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0      30
      7876 ADAMS                CLERK                    7788 23-5月 -87           1100                 20
      7900 JAMES                CLERK                    7698 03-12月-81            950                 30
      7902 FORD                 ANALYST                  7566 03-12月-81           3000                 20
      7934 MILLER               CLERK                    7782 23-1月 -82           1300                 10
         1 tom_abc                                                                 8000                    10
         2 aaa                  clerk                    7092 17-12月-80           8000                    20
         3 abc                                                                                             20

数据插入脚本,取地址符:

SQL> insert into emp(empno,ename,deptno) values (&empno,&ename,20);
输入 empno 的值:  5
输入 ename 的值:  ‘chunli‘
原值    1: insert into emp(empno,ename,deptno) values (&empno,&ename,20)
新值    1: insert into emp(empno,ename,deptno) values (5,‘chunli‘,20)

已创建 1 行。

SQL> select * from emp;

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
      7369 SMITH                CLERK                    7902 17-12月-80            800                 20
      7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300      30
      7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500      30
      7566 JONES                MANAGER                  7839 02-4月 -81           2975                 20
      7654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400      30
      7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                 30
      7782 CLARK                MANAGER                  7839 09-6月 -81           2450                 10
      7788 SCOTT                ANALYST                  7566 19-4月 -87           3000                 20
      7839 KING                 PRESIDENT                     17-11月-81           5000                 10
      7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0      30
      7876 ADAMS                CLERK                    7788 23-5月 -87           1100                 20
      7900 JAMES                CLERK                    7698 03-12月-81            950                 30
      7902 FORD                 ANALYST                  7566 03-12月-81           3000                 20
      7934 MILLER               CLERK                    7782 23-1月 -82           1300                 10
         1 tom_abc                                                                 8000                    10
         2 aaa                  clerk                    7092 17-12月-80           8000                    20
         3 abc                                                                                             20
         4 aaa                  clerk                    7092 26-8月 -16           8000                    20
         5 chunli                                                                                          20

已选择19行。

select 也可以使用取地址符:

SQL> select &列1,&列2 from emp;
输入 列1 的值:  ename
输入 列2 的值:  sal
原值    1: select &列1,&列2 from emp
新值    1: select ename,sal from emp

ENAME                       SAL
-------------------- ----------
SMITH                       800
ALLEN                      1600
WARD                       1250
JONES                      2975
MARTIN                     1250
BLAKE                      2850
CLARK                      2450
SCOTT                      3000
KING                       5000
TURNER                     1500
ADAMS                      1100
JAMES                       950
FORD                       3000
MILLER                     1300
tom_abc                    8000
aaa                        8000
abc
aaa                        8000
chunli

已选择19行。


批量插入数据:把20号部门的员工信息一次性拷到一个表中

1,创建一个与emp类型一样的表:
SQL> desc emp;
 名称                                                     是否为空? 类型
 ------------------------------------------------------ --------- -------- ----------
 EMPNO                                                    NOT NULL NUMBER(4)
 ENAME                                                             VARCHAR2(10)
 JOB                                                               VARCHAR2(9)
 MGR                                                               NUMBER(4)
 HIREDATE                                                          DATE
 SAL                                                               NUMBER(7,2)
 COMM                                                              NUMBER(7,2)
 DEPTNO                                                            NUMBER(2)
______________________________________________________________________________
SQL> create table emp10 as select * from emp where 1=2; 
表已创建。                                              
______________________________________________________________________________                                                        
SQL> desc emp10;                                        
 名称                                                     是否为空? 类型
 ------------------------------------------------------ --------- -------- ----------
 EMPNO                                                             NUMBER(4)
 ENAME                                                             VARCHAR2(10)
 JOB                                                               VARCHAR2(9)
 MGR                                                               NUMBER(4)
 HIREDATE                                                          DATE
 SAL                                                               NUMBER(7,2)
 COMM                                                              NUMBER(7,2)
 DEPTNO                                                            NUMBER(2)
=================================================
OK那么就插入吧:
SQL> insert into emp10 select * from emp where deptno=10;

已创建4行。

SQL> select * from emp10;

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
      7782 CLARK                MANAGER                  7839 09-6月 -81           2450                 10
      7839 KING                 PRESIDENT                     17-11月-81           5000                 10
      7934 MILLER               CLERK                    7782 23-1月 -82           1300                 10
         1 tom_abc                                                                 8000                    10











update

[全部更新]

SQL> select * from emp10;

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
      7782 CLARK                MANAGER                  7839 09-6月 -81           2450                 10
      7839 KING                 PRESIDENT                     17-11月-81           5000                 10
      7934 MILLER               CLERK                    7782 23-1月 -82           1300                 10
         1 tom_abc                                                                 8000                    10
SQL> update emp10 set deptno=20;
已更新4行。
SQL> select * from emp10;
     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
      7782 CLARK                MANAGER                  7839 09-6月 -81           2450                 20
      7839 KING                 PRESIDENT                     17-11月-81           5000                 20
      7934 MILLER               CLERK                    7782 23-1月 -82           1300                 20
         1 tom_abc                                                                 8000                    20




选择性更新

SQL> update emp10 set deptno=50 where ename=‘KING‘ ;
SQL> select * from emp10;

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
      7782 CLARK                MANAGER                  7839 09-6月 -81           2450                 20
      7839 KING                 PRESIDENT                     17-11月-81           5000                 50
      7934 MILLER               CLERK                    7782 23-1月 -82           1300                 20
         1 tom_abc                                                                 8000                    20



delete 

删除一行:

SQL> delete from emp10 where empno=7782;
SQL> select * from emp10;
     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
      7839 KING                 PRESIDENT                     17-11月-81           5000                 50
      7934 MILLER               CLERK                    7782 23-1月 -82           1300                 20
         1 tom_abc                                                                 8000                    20


删除表的全部数据,但表结构还在:

SQL> delete from emp10 ;
已删除3行。
SQL> select * from emp10;
SQL> desc emp10;
 名称           是否为空? 类型
 ---------------------- -------- ----------
 EMPNO                   NUMBER(4)
 ENAME                   VARCHAR2(10)
 JOB                     VARCHAR2(9)
 MGR                     NUMBER(4)
 HIREDATE                DATE
 SAL                     NUMBER(7,2)
 COMM                    NUMBER(7,2)
 DEPTNO                  NUMBER(2)




drop emp10 ;把整个表删除,结构也不存在了;

truncate,删除表和结构再重新建表:




关闭/打开 回显

SQL> set feedback off;关闭

SQL> set feedback on;打开

SQL> set timing on;时间打开

SQL> set timing off;时间关闭




[实验]比较delete与truncate的速度:

SQL> drop table testdelete purge;
SQL> set feedback off;
SQL> set timing on;

SQL> @c:\Sql.sql;执行脚本
SQL> select count(*) from testdelete;
      5000

开始删表:
SQL> delete from testdelete;
已用时间:  00: 00: 00.04

测试完毕清掉这个表:
SQL> drop table testdelete purge;



SQL> @c:\Sql.sql;
SQL> truncate table testdelete;
已用时间:  00: 00: 00.09

在Oracle下,delete比truncate快!



事务


事务隔离性实验:Oracle默认打开事务

窗口1:
SQL> set feedback on;
SQL> set timing off;
SQL> create table t1(tid int,tname varchar2(20));
表已创建。
SQL> insert into t1(tid ,tname) values(1,‘zhang_san‘);
已创建 1 行。
SQL> select * from t1;
       TID TNAME
---------- ----------------------------------------
         1 zhang_san
已选择 1 行。
__________________________________
窗口2:竟然看不到刚才窗口1插入的数据:
SQL> select * from t1;
未选定行
SQL>
__________________________________
窗口1,提交事务:
SQL> commit;
提交完成。
__________________________________
窗口2,数据显示出来了
SQL> select * from t1;
       TID TNAME
---------- -------------
         1 zhang_san



事务的生命周期:

执行DDL语句能隐式的提交事务,

正常退出,也能提交事务


回滚:

显式:rollback

隐式:掉电/宕机/非正常退出 == 系统出错了



控制事务

SQL> create table t3(tid int,tname varchar2(20));
表已创建。
SQL> insert into t3(tid,tname) values(1,‘zhang_san‘);
SQL> insert into t3(tid,tname) values(2,‘song_jiang‘);
SQL> select * from t3;
         1 zhang_san
         2 song_jiang

建立保存点:
SQL> savepoint a;
SQL> insert into t3(tid,tname) values(3,‘li_kui‘);
SQL> select * from t3;
         1 zhang_san
         2 song_jiang
         3 li_kui
回滚:
SQL> rollback to savepoint a;
SQL> select * from t3;
         1 zhang_san
         2 song_jiang
提交吧:
SQL> commit;
	


事务隔离级别,SQL99标准:


1,读未提交的数据

2,读已提交的数据

3,可重复读

4,串行化,只允许单个进程在某个时间操作这个数据库,非常不实用


MySQL支持4种事务级别:


Oracle 只支持两种标准:

读已提交的数据

串行化

比标准多一个:ReadOnly 多个进程同时读



oracle 数据类型:


CHAR:一个定长字符串,当位数不足自动用空格填充来达到其最大长度。如非NULL的CHAR(12)总是包含12字节信息。CHAR字段最多可以存储2,000字节的信息。

VARCHAR2:目前这也是VARCHAR 的同义词。这是一个变长字符串,与CHAR 类型不同,它不会用空格填充至最大长度。VARCHAR2(12)可能包含0~12字节的信息。VARCHAR2最多可以存储4,000 字节的信息。

CHAR和VARCHAR2的比较

CHAR(4) “A“ 实际在数据库中存储为"A “

“ABCDE”超长报错

VARCHAR2(4) “A” 存储的还是“A”

“ABCDE”超长报错

汉字:每个汉字占多少字节,要看具体的编码方式,如UTF-8(1-3字节)、

GB2312(2字节)、GBK(2字节)、GB18030(1、2、4字节)


2、数字类型

NUMBER:该数据类型能存储精度最多达38位的数字。每个数存储在一个变长字段中,其长度在0~22字节之间。Oracle的NUMBER类型精度很高, 远远高于许多编程语言中常规的FLOAT和DOUBLE类型。

NUMBER( p,s ) p表示精度(总长度) s表示小数位置且四舍五入

NUMBER(10,3) 10是总长度,3是小数位数的长度

123.456

123.4567 :将存储为123.457

12345679.899 :精度超长了,10是总长度,3是小数位, 整数位为10-3=7位


3、日期类型

DATE:一个7字节的定宽日期/时间数据类型。其中总包含7个属性,包括:世纪、世纪中哪一年、月份、月中的哪一天、小时、分钟和秒。

TIMESTAMP:一个7 字节或12.字节的定宽日期/时间数据类型。它与DATE 数据类型不同,因为TIMESTAMP 可以包含小数秒(fractional second);带小数秒的TIMESTAMP 在小数点右边最多可以保留9位。


4、二进制及大文本数据

BLOB: (binary large object)在Oracle9i及以前的版本中, 这种数据类型允许存储最多4GB的数据, 在Oracle 10g及以后的版本中允许存储最多(4GB)×(数据库块大小)字节的数据。BLOB包含不需要进行字符集转换的“二进制“数据,如果要存储电子表格、字处理文档、图像文件等就很适合采用

CLOB:(Character Large Object)在Oracle9i及以前的版本中, 这种数据类型允许存储最多4GB的数据, 在Oracle 10g及以后的版本中允许存储最多(4GB)×(数据库块大小)字节的数据。CLOB包含要进行字符集转换的信息。这种数据类型很适合存储纯文本信息。



创建并复制表:

SQL> create table t4  as select * from emp;

表已创建。

SQL> select * from t4;

     EMPNO ENAME                JOB                       MGR HIREDATE              SAL       COMM     DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
      7369 SMITH                CLERK                    7902 17-12月-80            800                 20
      7499 ALLEN                SALESMAN                 7698 20-2月 -81           1600        300      30
      7521 WARD                 SALESMAN                 7698 22-2月 -81           1250        500      30
      7566 JONES                MANAGER                  7839 02-4月 -81           2975                 20
      7654 MARTIN               SALESMAN                 7698 28-9月 -81           1250       1400      30
      7698 BLAKE                MANAGER                  7839 01-5月 -81           2850                 30
      7782 CLARK                MANAGER                  7839 09-6月 -81           2450                 10
      7788 SCOTT                ANALYST                  7566 19-4月 -87           3000                 20
      7839 KING                 PRESIDENT                     17-11月-81           5000                 10
      7844 TURNER               SALESMAN                 7698 08-9月 -81           1500          0      30
      7876 ADAMS                CLERK                    7788 23-5月 -87           1100                 20
      7900 JAMES                CLERK                    7698 03-12月-81            950                 30
      7902 FORD                 ANALYST                  7566 03-12月-81           3000                 20
      7934 MILLER               CLERK                    7782 23-1月 -82           1300                 10
         1 tom_abc                                                                 8000                    10
         2 aaa                  clerk                    7092 17-12月-80           8000                    20
         3 abc                                                                                             20
         4 aaa                  clerk                    7092 26-8月 -16           8000                    20
         5 chunli                                                                                          20

已选择19行。





表相关操作


超级用户查看scott用户的表:

SQL> connect /as sysdba;
SQL> select * from scott.emp;



往表中加入一列

修改字段的类型:

删除一个表的字段:

SQL> alter table t1 add mynum number;
SQL> desc t1;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- -------------------
 TID                                                NUMBER(38)
 TNAME                                              VARCHAR2(20)
 MYNUM                                              NUMBER
 
 
 
 SQL> alter table t1 modify mynum varchar2(20);
SQL> desc t1;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- -----------------
 TID                                                NUMBER(38)
 TNAME                                              VARCHAR2(20)
 MYNUM                                              VARCHAR2(20)
 
 
 
 
 SQL> alter table t1 drop column  mynum;
SQL> desc t1;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- --------------------------
 TID                                                NUMBER(38)
 TNAME                                              VARCHAR2(20)



回收站:

SQL> set linesize 199;
SQL> set pagesize 199;
SQL> select * from tab;

TNAME                                                        TABTYPE         CLUSTERID
------------------------------------------------------------ -------------- ----------
BIN$YPFw8QgkRGii8WjMDZfVHQ==$0                               TABLE


查看回收站:
SQL> select * from "BIN$YPFw8QgkRGii8WjMDZfVHQ==$0";
       TID TNAME
---------- ----------------------------------------
         1 zhang_san
=================================================
清空回收站:purge recyclebin



[Oracle]企业级项目案例

-- 01 创建表空间
-- 注意表空间的路径 根据实际安装环境进行调整
CREATE TABLESPACE ts_myscott 
    LOGGING 
    DATAFILE ‘/home/oracle_11/app/oradata/orcl/ts_myscott.dbf‘ SIZE 10M 
    EXTENT MANAGEMENT LOCAL;
    
CREATE TABLESPACE ts_myscott2 
    LOGGING 
    DATAFILE ‘/home/oracle_11/app/oradata/orcl/ts_myscott2.dbf‘ SIZE 20M
    EXTENT MANAGEMENT LOCAL;
    
ALTER DATABASE DATAFILE ‘/home/oracle_11/app/oradata/orcl/ts_myscott.dbf‘ AUTOEXTEND ON NEXT  10M MAXSIZE UNLIMITED;
ALTER DATABASE DATAFILE ‘/home/oracle_11/app/oradata/orcl/ts_myscott2.dbf‘ AUTOEXTEND ON NEXT  20M MAXSIZE UNLIMITED; 

commit;

-- 02 创建方案 (创建用户)
CREATE USER MYSCOTT  PROFILE DEFAULT 
    IDENTIFIED BY MYSCOTT DEFAULT TABLESPACE USERS 
    ACCOUNT UNLOCK;

-- 资源和登录权限
GRANT RESOURCE TO MYSCOTT;
GRANT create session TO MYSCOTT;


-- 03 创建表
-- 创建部门表 并赋值
CREATE TABLE MYSCOTT.DEPT(
	DEPTNO     	NUMBER(2) PRIMARY KEY,
 	DNAME       VARCHAR2(14) NOT NULL,
 	LOC        	VARCHAR2(13)
)TABLESPACE ts_myscott;

INSERT INTO MYSCOTT.dept VALUES(10, ‘ACCOUNTING‘, ‘NEW YORK‘);
INSERT INTO MYSCOTT.dept VALUES(20, ‘RESEARCH‘, ‘DALLAS‘);
INSERT INTO MYSCOTT.dept VALUES(30, ‘SALES‘, ‘CHICAGO‘);
INSERT INTO MYSCOTT.dept VALUES(40, ‘OPERATIONS‘, ‘BOSTON‘);

commit;

-- 创建员工表 并赋值
CREATE TABLE MYSCOTT.EMP(
	EMPNO           NUMBER(4) constraint emp_empno_pk PRIMARY KEY,
	ENAME          	VARCHAR2(10) constraint emp_ename_notnull NOT NULL,
	JOB            	VARCHAR2(9),
	MGR            	NUMBER(4),
	HIREDATE       	DATE,
	SAL            	NUMBER(7,2) constraint emp_sal_check check (SAL>0),
	COMM           	NUMBER(7,2),
	DEPTNO        	NUMBER(2) constraint emp_deptno_fk references MYSCOTT.dept(deptno) 
)TABLESPACE ts_myscott;

--创建索引 在新的表空间上
CREATE  INDEX MYSCOTT.IX_CAtbAuditOperInfo_OT ON MYSCOTT.EMP(ENAME) TABLESPACE ts_myscott2;


INSERT INTO MYSCOTT.EMP VALUES(7369, ‘SMITH‘, ‘CLERK‘, 7902, ‘17-12月-80‘, 800, NULL, 20);
INSERT INTO MYSCOTT.EMP VALUES(7499, ‘ALLEN‘, ‘SALESMAN‘, 7698, ‘20-2月 -81‘, 1600, 300, 30);
INSERT INTO MYSCOTT.EMP VALUES(7521, ‘WARD‘, ‘SALESMAN‘, 7698, ‘22-2月 -81‘, 1250, 500, 30);

INSERT INTO MYSCOTT.EMP VALUES(7566, ‘JONES‘, ‘MANAGER‘, 7839, ‘02-4月 -81‘, 2975, NULL, 20);
INSERT INTO MYSCOTT.EMP VALUES(7654, ‘MARTIN‘, ‘SALESMAN‘, 7698, ‘28-9月 -81‘, 1250, 1400, 30);
INSERT INTO MYSCOTT.EMP VALUES(7698, ‘BLAKE‘, ‘MANAGER‘, 7839, ‘01-5月 -81‘, 2850, NULL, 30);

INSERT INTO MYSCOTT.EMP VALUES(7782, ‘CLARK‘, ‘MANAGER‘, 7839, ‘09-6月 -81‘, 2450, NULL, 10);
INSERT INTO MYSCOTT.EMP VALUES(7788, ‘SCOTT‘, ‘ANALYST‘, 7566, ‘19-4月 -87‘, 3000, NULL, 20);
INSERT INTO MYSCOTT.EMP VALUES(7839, ‘KING‘, ‘PRESIDENT‘, NULL, ‘17-11月-81‘, 5000, NULL, 10);

INSERT INTO MYSCOTT.EMP VALUES(7844, ‘TURNER‘, ‘SALESMAN‘, 7698, ‘08-9月 -81‘, 1500, 0, 30);
INSERT INTO MYSCOTT.EMP VALUES(7876, ‘ADAMS‘, ‘CLERK‘, 7788, ‘23-5月 -87‘, 1100, NULL, 20);
INSERT INTO MYSCOTT.EMP VALUES(7900, ‘JAMES‘, ‘CLERK‘, 7698, ‘03-12月-81‘, 950, NULL, 30);

INSERT INTO MYSCOTT.EMP VALUES(7902, ‘FORD‘, ‘ANALYST‘, 7566, ‘03-12月-81‘, 3000, NULL, 20);
INSERT INTO MYSCOTT.EMP VALUES(7934, ‘MILLER‘, ‘CLERK‘, 7782, ‘23-1月 -82‘, 1300, NULL, 10);

commit;

-- 创建工资级别表 并赋值
CREATE TABLE MYSCOTT.SALGRADE(
 	GRADE        	NUMBER,
 	LOSAL           NUMBER,
 	HISAL           NUMBER
)TABLESPACE ts_myscott;

INSERT INTO MYSCOTT.SALGRADE VALUES(1, 700, 1200);
INSERT INTO MYSCOTT.SALGRADE VALUES(2, 1201, 1400);
INSERT INTO MYSCOTT.SALGRADE VALUES(3, 1401, 2000);
INSERT INTO MYSCOTT.SALGRADE VALUES(4, 2001, 3000);
INSERT INTO MYSCOTT.SALGRADE VALUES(5, 3001, 9999);
commit;

--创建奖金表
CREATE TABLE MYSCOTT.BONUS(
	ENAME      VARCHAR2(10),
 	JOB       VARCHAR2(9),
 	SAL      	NUMBER,
 	COMM      NUMBER
)TABLESPACE ts_myscott;

------停止-----
-- 04创建新用户方案 	通过MYSCOTTUSER1来访问数据库, 权限配置演示  
CREATE USER "MYSCOTTUSER1"  PROFILE "DEFAULT" IDENTIFIED BY "123456" DEFAULT TABLESPACE "USERS" ACCOUNT UNLOCK;
GRANT "CONNECT" TO "MYSCOTTUSER1";
GRANT SELECT ANY TABLE TO "MYSCOTTUSER1";

GRANT DELETE ON MYSCOTT.DEPT TO "MYSCOTTUSER1";
GRANT INSERT ON MYSCOTT.DEPT TO "MYSCOTTUSER1";
GRANT UPDATE ON MYSCOTT.DEPT TO "MYSCOTTUSER1";

GRANT DELETE ON MYSCOTT.EMP TO "MYSCOTTUSER1";
GRANT INSERT ON MYSCOTT.EMP TO "MYSCOTTUSER1";
GRANT UPDATE ON MYSCOTT.EMP TO "MYSCOTTUSER1";

commit;



本文出自 “魂斗罗” 博客,谢绝转载!

数据库编程3 Oracle 子查询 insert update delete 事务 回收站 字段操作 企业级项目案例