【本文谢绝转载原文来自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;