第一篇:ORACLE培训总结
篇一:oracle培训班总结(听课笔记)oracle北京培训
第一章 oracle10g的安装与基本设置
一、数据库基础部分。
oracle数据库应用系统结构与产品。
sql语言:操作数据库,同时用于数据库管理。(通用部分)sql*plus语言:对sql的扩充,主要增加一些报表。pl/sql语言:过程化语言。数据库分区存储技术。
1、oracle数据库应用系统结构与产品
oracle数据字典有4.2万个。数据字典只记录标识。
结构方面:sql与oracle完成不同,sql可建多个库,结构与oracle明显不同。i:代表internet.c语言结构性最好,计算能力最强。指纹识别系统只能用c.2、pl:procedural language:过程化语言,条件、判断、循环。sql属非过程化语言,只关心结果,不关心过程。
3、数据库分区存储技术(一个表存到多个表空间上)数据库存储数据的最小单位:表。
逻辑空间——>表空间(在物理上与磁盘对应)1 ——>多个磁盘。
一个表可以存在多个磁盘上,但不能存到多个表空间上。集中式存储:安全性不好,i/o不平衡。
数据库的分区存储技术:range、list(oracle 11自动增加)range:可以比大小。
list:不能比大小,例如:人口住址等。
4、数据库存取权限控制。
5、oracle 10g flashback:数据闪回。恢复前提:归档和备份。(1)基于时间的恢复:从5楼到4楼。必须从5楼下到一楼,再从1楼到4楼。逻辑备份: 物理备份:常说的备份点。
不完全恢复:向回倒,不可逆转,日志自动清0,有的数据要丢失。exp、import.(1)基于时间的恢复(2)基于中止(撤消)的恢复。(3)基于事务的恢复。完全恢复。
delete from,rollback能100%恢复。drop,flashback不一定能恢复。
二、程序设计
pl/sql程序设计。存储过程(procedure),函数(function),包(package),数据库触发器(data triggers(枪栓))。
三、系统管理(dba)
1、oracle核心软件安装与产品升级。sun solaris hp ux 国税 aix 银行 tru64 电力 数据库的排序:在临时表空间中进行。8i和9i排序完不释放。10g可自动释放。640万人无人居住,不发生电费。
命令行模式运行速度快,容易发现问题的存在。
oracle占用可用内在的55-57%,所以不要建两个以上的库,oracle按表空间划分用户,sql可建多个库,结构与oracle明显不同。
2、创建主要的数据库存储结构。
划分磁盘空间。
3、数据库权限与角色管理。角色:权限的组合。
4、监视与控制用户对于数据库的操作。
5、数据库的启动与关闭。
6、数据库性能优化与调整。
7、数据库的备份与恢复。
四、基于web应用开发(会话进程)。
会话数(在线数)< 用户数< 进程数在(windows称为服务)< 操作系统核心参数 如何查看修改连接数,进程数及用户数,三者之间有什么关系? show parameter session;最大session数 show parameter process;最大进程数
select count(1)from all_users;查看已安装数据库的用户数 select * from all_users;oracle自带的用户数如何查。
默认的情况下系统中的最大session = min(session ,process * 1.1 + 5)
1、我们把它称为一次对话,或者叫会话。同样,在我们用电脑工作时,打开的一个窗口或一个web页面,我们也可以把它叫做一个“会话”,扩展到一个局域网里面,所有用户要通过防火墙上网,要打开很多个窗口或web页面(即会话),那么,这个防火墙,所能处理的最大会话数量,就是“并发连接数”。
(1)查看oracle 10g数据库会话数 select * from v$session;当前总会话数:select count(*)from v$session;可用总会话数:在sqlplus里查询,show parameter session
2、查看已安装数据库的用户数:select count(1)from all_users;sql>select * from all_users;
3、查看进程数
使用sys,以sysdba权限登录:sql> show parameter processes;
4、$ps –ef | grep oracle 进程,在windows称为服务。实例包括一个内存和进程(在windows中为服务)
按我的理解来说session就等价与一个客户端,它是用户经过用户进程到oracle事例的特定连接.它从用户连接开始一直持续到用户断开连接或退出数据库为止.进程,笼统地认为一个程序有若干进程组成,从os角度讲程序是静态的,而进程是动态的罢了.进程可以分为user process和oracle process.说穿了,进程就是用来执行程序的时候产生的,是一个动态过程.第二章 oracle安装
一、asm(automatic storage management)自动存储管理。oracle10g 新内容。镜像:oracle 10g以后才支持。磁盘组:diskmap 逻辑设备
裸设备:只做分区,不做格式化。看不到文件,在磁盘管理器中才能看到设备,u盘拷贝不了。只能用逻辑手段拷贝:exp rman.二、oltp_数据仓库_全局数据库名_(nts适配器错误_在windows中清理oracle)
1、t----->oltp(on line transaction processing)在线事务处理。网上数据传输量比较大,数据库数据改动大,数据库负荷重,oracle 会设比较大的回退段(rollback segments)和空闲率(pctfree 10%)oracle的块为:8k.它使用了所有的所谓数据的操作 crud(创建、读取、更新、删除)。当数据存储达到一定量的时候,规模就会几乎保持不变,因为可以从存储中删除过期数据。
2、数据仓库
数据仓库改动少,主要为查询速度快服务,用于存历史数据,用来构造决策支持系统。他的回退段和空闲率留的比较少。
数据仓库就完全是一种不同种类的应用程序。它并不是用来运行当前的操作,例如发送邮件。它是用来分析数据并且从现有数据中发现新的价值,主要是用来预测未来的情况。数据仓库并不是解决所有问题的通用结构。它必须集中于某一问题领域,例如航空服务、顾客收益等。数据仓库也有有趣的一面,那就是本身是稳定增长的。数据没有被删除,也不发生变更。我们不需要将冗余数据置于数据库之外(因为加入仓库中的数据经过了数据净化的过程,该过程检查了数据的正确性)来减少复杂性同时增强读取操作的性能。
为了能够对数据仓库中的数据进行分析,数据存储于一个多维结构中,叫做星型模式。如果将星型模式扩展,就会得到雪花模式。
3、全局数据库名:以字母打头,不超过8个。
数据库名不能重名,否则复制数据和同步数据时会出麻烦,数据库安装完后,数据库名不能更改,起名时要慎重。
4、oracle字符集。zh16gbk.5、nts适配器错误。
d:oracleproduct10.2.0db_1networkadminsqlnet.ora 把sqlnet.ora文件中的(nts)改为none,再重新启动oracleconfigudration and mirdatabase config.6、在windows中清理oracle。(1)删除注册表:
regedit-> local machine--> software-->oracle(2)删除oracle服务
regedit-> local machine-->system?currentcontrolset?services?ora*(3)删除oracle事件日志
(4)删除windows安装磁盘中program filesoracle目录。(5)删除oracle菜单。(6)删除oracle环境变量。
控制面板—>系统——>高级——>环境变量。总共删除2项。(7)重新启动操作系统
(8)删除oracle磁盘文件。篇二:oracle数据库学习总结 oracle数据库学习总结 时间过的还真快,不知不觉中就在这里呆了半个月了。这段时间里都在学习oracle数据库的编程,毕竟这是家软件外包公司。像我们这样的新员工也就只能接触到些curd的操作。废话不多说,赶紧来梳理下这半月来学习的知识点.在来公司之前一直都是使用sql server数据库,用sql server也开发了3个小型项目。所以对sql语句以及在数据库中扮演重要作用的存储过程,触发器,视图,主键/外键约束都很熟。但oracle是一个全新的环境,记得刚装上oracle的时候,我都不知道在哪查看自己已经建立好的表格。还好有师傅的帮忙,要不然我还真没这么快就能入门oracle。
学习东西就要学习些能改变自己思维的东西,只有这样才能让自己的眼光比别人更独到,思维比别人更深邃,oracle就是这样的东西。当然做这样的事是要很大的驱动力的呀,如果公司不是都采用oracle来写程序的话,我估计也就懒得学啦。
对于一位程序员来说并不需要完全掌握oracle的所有知识,毕竟自己不是dba。在日常开发中也用不到那些命令和工具,但是有些知识点我们还是必须得熟练的掌握它们。比如:一些基本的ddl和dml语句,存储过程,函数,视图,触发器,序列,游标,自定义类型和包。下面我就把这段时间里学习oracle获得的知识点罗列出来,一是为了方便以后查阅,二是为了和搭档交流学习经验。要适应的一些细节
从sql server转到oracle进行数据库编程,第一道门槛就是语法问题。很多很多的问题都是因为语法而产生的,现将它们统统集合起来并将它们一网打尽之。pl结构。在sql server中,采用的是批处理执行任务的方式,所以可以将多条sql语句选中批量执行,而不用顾忌要在专门的地方声明变量,在专门的地方进行逻辑编码。在oracle中采用的是pl编程方式,必须在专门的地方声明变
循环结构,要达到循环在oracle中有3种方式,各有各的好处,你懂的。它们分别如下: pl结构中的错误处理
就像c#中的try{} catch{}语句块 能捕获错误。写几个例子: helloworld级别的错误抛出例子record类型
oracle中的record类型类似于c语言中的结构体,主要用来接收select语句或游标中返回的数据,下面写个例子:ddl语句
这里的ddl语言主要是指能完成如下工作的ddl语言:创建表,创建表的主/外 键及级联效果,dml语句
select语句。oracle中的select语句的使用方法与sql server差不多,但还是有些不同之处。
篇三:oracle培训心得 oracle培训心得
2010年x月x日至x月x日,我有幸参加了工业和信息化部软件与集成电路促进中心主办的“oracle数据库高级实战培训班”学习交流。首先感谢学校领导给予了我这次学习机会。通过短暂的几天培训,我不仅对oracle知识有了部分的了解,也接受了很多最新的信息。在这次培训中,上课的老师有非常丰富dba经验,他结合他自身的dba工作经历,从oracle体系结构与网络配置、访问控制、事务处理与日志、闪回特性、数据库的备份与恢复和数据库性能监测与调整优化等几个方面对oracle进行了讲解。对课程讲解十分的详细。通过案例示范以及演示,指导我们一步步操作。
oracle主要以操作命令行为主,在学习的过程中,对老师的每一步操作都做好了记录。课堂上按照老师的要求一步步操作,课后按记录的操作步骤和命令反复多次的练习。以此到达了对oracle反复学习,熟悉掌握老师所传授的知识。
短短5天的高强度集中学习,我通过“xxxx”考试,取得了“xxxx”的认证。但是我知道依靠这几天的培训对oracle学习是不行的,还必须在实践中不断地努力,提升自身的专业技术能力。只有在不断的实践练习,才能够深刻了解它的原理和方法。在以后的工作中,我仍会继续学习各种关于oracle数据库的知识、持之以恒,在今后的工作中不断实践、总结、深入学习,全面掌握oracle知识。
第二篇:oracle培训心得
Oracle培训心得
2010年x月x日至x月x日,我有幸参加了工业和信息化部软件与集成电路促进中心主办的“ORACLE数据库高级实战培训班”学习交流。首先感谢学校领导给予了我这次学习机会。通过短暂的几天培训,我不仅对Oracle知识有了部分的了解,也接受了很多最新的信息。
在这次培训中,上课的老师有非常丰富DBA经验,他结合他自身的DBA工作经历,从Oracle体系结构与网络配置、访问控制、事务处理与日志、闪回特性、数据库的备份与恢复和数据库性能监测与调整优化等几个方面对Oracle进行了讲解。对课程讲解十分的详细。通过案例示范以及演示,指导我们一步步操作。
Oracle主要以操作命令行为主,在学习的过程中,对老师的每一步操作都做好了记录。课堂上按照老师的要求一步步操作,课后按记录的操作步骤和命令反复多次的练习。以此到达了对Oracle反复学习,熟悉掌握老师所传授的知识。
短短5天的高强度集中学习,我通过“xxxx”考试,取得了“xxxx”的认证。但是我知道依靠这几天的培训对Oracle学习是不行的,还必须在实践中不断地努力,提升自身的专业技术能力。只有在不断的实践练习,才能够深刻了解它的原理和方法。在以后的工作中,我仍会继续学习各种关于Oracle数据库的知识、持之以恒,在今后的工作中不断实践、总结、深入学习,全面掌握Oracle知识。
第三篇:oracle视图总结
oracle视图总结(转)
视图简介: 视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改。视图基于的表称为基表。视图是存储在数据字典里的一条select语句。通过创建视图可以提取数据的逻辑上的集合或组合。
视图的优点:
1.对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。2.用户通过简单的查询可以从复杂查询中得到结果。3.维护数据的独立性,试图可从多个表检索数据。4.对于相同的数据可产生不同的视图。
视图的分类:
视图分为简单视图和复杂视图。
两者区别如下:
1.简单视图只从单表里获取数据,复杂视图从多表获取数据; 2.简单视图不包含函数和数据组,复杂视图包含; 3.简单视图可以实现DML操作,复杂视图不可以。
视图的创建:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name [(alias[, alias]...)] AS subquery [WITH CHECK OPTION [CONSTRAINT constraint]] [WITH READ ONLY] 其中:
OR REPLACE:若所创建的试图已经存在,ORACLE自动重建该视图; FORCE:不管基表是否存在ORACLE都会自动创建该视图; NOFORCE:只有基表都存在ORACLE才会创建该视图: alias:为视图产生的列定义的别名;
subquery:一条完整的SELECT语句,可以在该语句中定义别名;
WITH CHECK OPTION : 插入或修改的数据行必须满足视图定义的约束; WITH READ ONLY : 该视图上不能进行任何DML操作。
例如: Sql代码
1.CREATE OR
REPLACE
VIEW dept_sum_vw
2.(name,minsal,maxsal,avgsal)
3.AS SELECT d.dname,min(e.sal),max(e.sal),avg(e.sal)
4.FROM
emp e,dept d
5.WHERE e.deptno=d.deptno
6.GROUP BY d.dname;
视图的定义原则:
1.视图的查询可以使用复杂的SELECT语法,包括连接/分组查询和子查询; 2.在没有WITH CHECK OPTION和 READ ONLY 的情况下,查询中不能使用 ORDER BY 子句;
3.如果没有为CHECK OPTION约束命名,系统会自动为之命名,形式为SYS_Cn;4.OR REPLACE选项可以不删除原视图便可更改其定义并重建,或重新授予对象权限。
查询视图:
视图创建成功后,可以从视图中检索数据,这点和从表中检索数据一样。示例:
SQL>SELECT * FROM dept_sum_vw;
修改视图:
通过OR REPLACE 重新创建同名视图即可。
删除视图:
DROP VIEW VIEW_NAME语句删除视图。删除视图的定义不影响基表中的数据。
只有视图所有者和具备DROP VIEW权限的用户可以删除视图。视图被删除后,基于被删除视图的其他视图或应用将无效。
查询视图定义:
SELECT view_name,text from user_views;其中text显示的内容为视图定义的SELECT语句,可通过DESC USER_VIEWS 得到相关信息。
视图上的DML 操作: DML操作应遵循的原则:
1.简单视图可以执行DML操作; 2.在视图包含GROUP 函数,GROUP BY子句,DISTINCT关键字时不能删除数据行; 3.在视图不出现下列情况时可通过视图修改基表数据或插入数据:
a.视图中包含GROUP 函数,GROUP BY子句,DISTINCT关键字; b.使用表达式定义的列; c.ROWNUM伪列。
d.基表中未在视图中选择的其他列定义为非空且无默认值。WITH CHECK OPTION 子句
通过视图执行的INSERTS和UPDATES操作不能创建该视图检索不到的数据行,因为它会对插入或修改的数据行执行完整性约束和数据有效性检查。(也就是说在执行INSERTS、UPDATES时,WHERE条件中除需要INSERT、UPDATE本身的限制条件之外,还需要加上视图创建时的WHERE条件。)
例如:
CREATE OR REPLACE VIEW vw_emp20 AS SELECT * FROM emp WHERE deptno=20 WITH CHECK OPTION constraint vw_emp20_ck;视图 已建立。
查询结果:
SELECT empno,ename,job FROM vw_emp20;EMPNO
ENAME
JOB---------------------
--------------
-------------7369
SMITH
CLERK 7566
JONES
MANAGER 7902
FORD
ANALYST 修改:
UPDATE vw_emp20 SET
deptno=20 WHERE empno=7902;将产生错误:
UPDATE vw_emp20 * ERROR 位于第一行:
ORA-01402:视图WITH CHECK OPTION 违反WHERE 子句
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1,Oracle是可以通过视图来修改Base table的。所谓base table就是用来构建视图的表,也就是视图的数据来源表。但是这种修改是有条件的。比如: create view v_emp as select empno,ename,job,deptno from emp where deptno=10 with check option constraint emp_cnst;如果有这个限制,那么通过视图v_emp 插入数据的deptno字段的值必须是10,否则就会报“ORA-01402: 视图 WITH CHECK OPTIDN 违反 where 子句”的异常。
2,联结视图:
create view dept1_staff as select e.ename, e.empno, e.job, d.deptno, d.dname from emp e,dept d where e.deptno in(10,30)and e.deptno = d.deptno; 将两个表的数据联结起来,看起来应该是一个内联结(Inner joint)。
对于联结视图(Joint view)的修改规则稍显复杂,设计到所谓key_preserved table的概念。通过联结视图来修改基表,只有那些key_preserved 的表才能被修改。上述创建视图语句中emp和dept通过deptno进行联结构成视图时,emp就是key_preserved 表,而dept不是。为什么?因为在dept1_staff 中empno的值唯一的而deptno不是唯一的。所以emp是key_preserved 而dept不是。因此只能通过该视图来修改emp,而不能修改dept的数据。
3,Oracle视图非常强大的功能之一在于其可以创建一个带有错误的视图。比如说视图里的字段在基表里不存在,该视图仍然可以创建成功,但是非法的且无法执行。当基表里加入了该字段,或者说某个字段修改成视图里的该字段名称,那么视图马上就可以成为合法的。这个功能很有意思。例子:
创建基表: create table v_test(name varchar2(32),age number(12));创建带错误的视图:
create force view view_test as select name,age,address from v_test;(注意加上force选项)
由于address字段在v_test里不存在,所以会报warning: View created with compilation errors的警告,而且执行select * from view_test;时会报“ORA-04063: view “SCOTT.VIEW_TEST” 有错误”的异常。但是如果在v_test里加上address字段,那么视图就会合法。对基表进行修改:
alter table v_test add(address varchar2(128));
现在再执行select * from view_test;就会执行成功了。
from:http://www.blogjava.net/jinhualee/archive/2006/07/14/58115.html
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
其他问题总结:
1、视图上是否可以创建索引?
一般视图上不用建立索引,对视图的操作最终会转化为对表的操作。一个讨论:http://www.itpub.net/viewthread.php?tid=150019&extra=&page=1
第四篇:Oracle数据库 知识点总结
1.constraint约束:
alter table [table_name] add constraint [pk_name] primary key(pkname);//添加主键
alter table [table_name] drop constraint [pk_name];//删除主键
alter table [table_name] add constraint [fk_name] foreign key(fkname)references [tablename](fkname);//添加外
键
alter table [table_name] drop constraint [fk_name];//删除外键
2.union 关键字:
A username, B username
rod
bruce
rose
marina
select username from A
union
select username from B
2、几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当
ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来 自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随
EXCEPT 一起使用时(EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随
INTERSECT 一起使用时(INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
3.复合主键一般不设外键
4.组函数也称为聚合函数。
例如:我们把学生可以分为男生和女生两个组,如果想求每组的人数,平均身高,平均年龄等,就需要用到分组函数了。
在SQL中常用的组函数有以下几个:
COUNT():求出全部的记录数
MAX():求出一组中的最大值
MIN():求出一组中的最小值
AVG():求出一组中的平均值
SUM():求和
范例:COUNT()函数
SELECT COUNT(empno)FROM emp;
我们常用COUNT(*),最好能够用字段代替*
范例:MAX()、MIN()函数,求最大最小值,一般是针对于数值的字段的,求出所有员工的的最高工资,和最底工资和平均工
资。
SELECT MAX(sal)最高工资,MIN(sal)最底工资,AVG(sal)平均工资 FROM emp;
范例:求出部门10的所有员工工资的总合
SELECT SUM(sal)工资综合 FROM emp WHERE deptno=10;
如果如下查询输出部门编号和其部门所有员工的工资总和,会产生错误。
SELECT deptno ,SUM(sal)工资综合 FROM emp WHERE deptno=10;
错误: “不是单组分组函数”
发生以上的错误信息,是因为这样的查询需要进行分组统计。
分组统计有其固定的语法格式:
SELECT {DISTINCT} *| 查询列 列别名1,查询列2 列别名2,……
FROM 表名称1 表别名1,表名称2 表别名2,……
{WHERE 条件(s)}
{ORDER BY 排序的字段1,排序的字段2 ASC|DESC}
{GROUP BY 分组字段}
所以老师写的是错的!
5.//从t_student表中删除名字重复的记录的信息
delete from t_student where sid not in(select sid from(select min(sid)sid,sname from t_student group by sname));
// delete from tablename where id not in(select max(id)from tablename group by col1,col2,...)
6.sequence
在oracle中sequence就是序号,每次取的时候它会自动增加。sequence与表没有关系。
(1)
CREATE SEQUENCE seqTest
INCREMENT BY 1--每次加几个
START WITH 1--从1开始计数
NOMAXvalue--不设置最大值
NOCYCLE--一直累加,不循环
CACHE 10;--设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为----NOCACHE(2)
定义好sequence后,你就可以用currVal,nextVal取得值。
CurrVal:返回 sequence的当前值
NextVal:增加sequence的值,然后返回 增加后sequence值
eg:
SELECT Sequence名称.CurrVal FROM DUAL;
select seqtest.currval from dual(3)
在Sql语句中可以使用sequence的地方:
-不包含子查询、snapshot、VIEW的 SELECT 语句
-INSERT语句的子查询中
-INSERT语句的values中
-UPDATE 的 SET中
如在插入语句中
insert into 表名(id,name)values(seqtest.Nextval,'sequence 插入测试');
7.范式:
所谓第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一
列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分
为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式
就是无重复的域。
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作
为实体的唯一标识。第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一
部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一
对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。例如在员工表中的身份证号码即可实现每个一员工的区分,该身份证号码即为候选键,任何
一个候选键都可以被选作主键。在找不到候选键时,可额外增加属性以实现区分,如果在员工关系中,没有对其身份证号
进行存储,而姓名可能会在数据库运行的某个时间重复,无法区分出实体时,设计辟如ID等不重复的编号以实现区分,被
添加的编号或ID选作主键。
第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门
有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简
介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有
大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性,也就是在满足2NF的基础上,任何非主属性不得传
递依赖于主属性。
第五篇:ORACLE数据库学习总结
数据库学习总结-Marlon
目录一、二、三、四、五、六、七、八、ORACLE_简介.............................................................................................................................................................1 ORACLE_简单查询.....................................................................................................................................................3 ORACLE标量函数和算数运算..................................................................................................................................5 ORACLE_多表查询.....................................................................................................................................................9 ORACLE_列函数和分组...........................................................................................................................................10 ORACLE_子查询.......................................................................................................................................................12 ORACLE_表的更新操作...........................................................................................................................................13 ORACLE_表与视图的管理.......................................................................................................................................15
一、ORACLE_简介
Oralce数据库发展 Oracle 8
Oracle 8i:i表示internet,标识着Oracle公司正式进军互联网。Oracle9i Oracle10g:g表示grid,即网络技术。Oracle11g
Oracle体系结构一 物理结构: 文件系统 控制文件 数据文件 日志文件
参数文件(不是数据库的组成成分)
Oracel体系结构三 逻辑结构: block 快 extent 盘区 segment 段
tablespace 表空间 datafile 数据文件 SQL * Plus下的常用命令
连接到SQL*PLUS sqlplus user/password[as sysdaba|sysoper] sqlplus/nolog
启动数据库
startup mount 启动实例,打开控制文件,但不打开数据文件 startup nomount 只启动实例
关闭数据库
shutdown immediate
迫使每个用户执行为当前的SQL语句,立即断开连接 shutdown transactional
迫使用户执行完当前事务时,断开连接 shutdown abort 强制关闭数据库
常用SQL命令
show user:查看当前连接的用户
connect scott/tiger: 采用scott的用户名/tiger的密码连接数据库 desc table_name:查看tableName表结构 quit|exit:退出
disconnect:断开连接
clear screen:清屏,相当于Windows下的cls命令 select * from tab:列出当前用户下的所有表 @pata 执行pata制定的脚本文件
Oracle常用基本数据类型 varchar2/varchar:变成字符串 char:定长字符串 Integer:整型
number(m,n):数字型 smallint:短整型 float:浮点数
decimal:十进制数字(小数)date:日期型
二、ORACLE_简单查询
SQL结构化查询语言(Structured Query Language)
SQL分类
1.数据定义语言(Data Definition Language,DDL):create、alter、drop。
create table 表名;alter table add 新列名 数据类型;drop table 表名;2.数据操纵语言(Data Manipulation Language,DML):insert、update、delete、select。Insert into 表名(字段1,字段2…)values(值1,值2…);update student set sage=22 where sno='200215';(将学生200215的年龄改为22岁)select distinct job from emp;去除重复行
3.数据控制语言(Data Control Language,DCL):commit work、rollback work。 查询雇员的所有信息 select * from emp; *表示所有列
查询语句的格式
select *|列名 from 表名
查询雇员的编号,姓名,工资
select * from empno,ename,sal from emp;
查询所有职位 select job from emp;select distinct job from emp;distinct: 有区别的(去除重复行)
查询工资大于1500的雇员信息,列出编号,用户名,工资 select empno,ename,sal from emp where sal>1500;
带有where条件查询语句的基本格式 select *|列名 from 表名 where 条件;
比较运算符 大于:> 小于:< 等于:= 大于等于:>= 小于等于:<= 不等于:!=或者<>
限定查询 is null 和 is not null 的使用 查询每月可以得到奖金的雇员
select empno,ename,comm from emp where comm is not null;
select empno,ename,comm from emp where comm is not null and comm>0; 查询谁没有奖金
select empno,ename from emp where comm is null;
限定查询 and 的使用
查询工资大于1500,并且可以领取奖金的雇员
SQL> select empno,ename,sal,comm from emp where comm is not null and sal>1500;
限定查询 or 的使用
查询工资大于1500和可以领取奖金的雇员
select empno,ename,sal,comm from emp where sal>1500 or comm is not null; 查询没有奖金的雇员
select empno,ename,comm from emp where comm=0 or comm is null;
限定查询 使用not对条件整体取反
查询工资不大于1500并且不能领取奖金的雇员
select empno,ename,sal,comm from emp where sal<=1500 and(comm is null or comm=0);select empno,ename,sal,comm from emp where not(sal>1500 or comm is not null);
限定查询 between...and...的使用
查询基本工资大于等于1500并且小于等于3000的雇员
select empno,ename,sal from emp where sal>=1500 and sal<=3000;select empno,ename,sal from emp where sal between 1500 and 3000; 查询1981年雇佣的所有员工
select empno,ename,hiredate from emp where hiredate between'1-1月 1981' and '31-12月 1981';注:日期格式 日-月 年,要匹配上
限定查询 字符串的比较
查询姓名是'SMITH'员工的所有信息 select * from emp where ename='SMITH';select * from emp where ename='smith';注:列值区分大小写
限定查询 in的使用
查询出编号7369,7499,7521的雇员的具体信息
select * from emp where empno=7369 or empno=7499 or empno=7521;select * from emp where empno in(7369,7499,7521);
限定查询 not in的使用
查询出雇员编号不是369,7499,7521的雇员的具体信息 select * from emp where empno not in(7369,7499,7521);
限定查询 like的使用
查询雇员的名字第二个字符是M的雇员信息 select * from emp where ename like'_M%';注:_匹配一个字符,%匹配0个多个字母(前缀或后缀的代表) 查询1982年入职的所有雇员的信息
select * from emp where hiredate like'%82'; 查询工资中包含5的雇员信息
select * from emp sal where like'%5%';
对结果排序-Oracle By 查询员工工资大于1500员工的信息,按工资排序 select * from emp where sal>1500 order by sal; 查询工资大于1500员工的信息,按工资降序,按雇佣日期升序排序 select * from emp where sal>1500 order by sal desc,hiredate asc;注:ASC升序,DESC降序,默认ASC。
ascending [ə'sendiŋ]上升的,降序排列(descend [di'send] 的缩写);
三、ORACLE标量函数和算数运算
字符函数的使用
转换为大写字母
select upper('smith')from dual;注:dual是公共表。upper ['?p?] 上面的,上部的
转换为小写字母
select lower('SMITH')from dual;注:lower 放下
每个单词的字母变成大写,其余字母小写 select initcap('hello world')from dual
串连接(concat):可以使用“||”进行串连接 select concat('HELLO','WORLD')from dual;select 'HELLO'||'WORLD' from dual;
求子串(SUBSTR)select substr(ename,1,3)from emp;注:含义为截取ename字段从第一个字符开始,总共三个字符
求长度(LENGTH)select length(ename)from emp;
串替换(REPLACE)select replace('HELLO WORLD','WOR','WEL')from dual;结果:
REPLACE('HE-----------HELLO WELLD 注:第一个逗号是原字符,第二个逗号是原字符的一部分,第三部分是替换原字符那个部分。
要求显示所有雇员的姓名和姓名的后三个字符
select ename,substr(ename,length(ename)-2)from emp;select ename,substr(ename,-3)from emp;
四舍五入(Round)select round(789.536)from dual;ROUND(789.536)--------------
790
四舍五入(Round):指定保留小数位数 select round(789.536,2)from dual;----------------
789.54
四舍五入(Round):对整数四舍五入 select round(789.536,-2)from dual;ROUND(789.536,-2)-----------------
800
截断小数位(TRUNC)select trunc(789.536)from dual;TRUNC(789.536)--------------
789
截断小数位(TRUNC):指定保留小数位 select trunc(789.536,2)from dual;TRUNC(789.536,2)----------------
789.53
截断小数位(TRUNC):对整数截断 select trunc(789.536,-2)from dual;TRUNC(789.536,-2)-----------------
700 除空格(TRIM)
SQL> SELECT TRIM(55)FROM DUAL;TRIM(55)--------55 取余数(MOD)select mod(10,3)from dual;
日期函数 运算规律:
日期+数字=日期 日期-数字=日期
日期-日期=数字(天数)
查询当前日期
select sysdate from dual;SYSDATE-------------10-3月-12
显示10部门员工进入公司的星期数
select empno,ename,round((sysdate-hiredate)/7)from emp where deptno=10;
在指定日期上加入指定的月数之后的日期(ADD_MONTHS)select add_months(sysdate,4)from dual;ADD_MONTHS(SYS--------------10-7月-12
求出给定日期范围的月数(months_between)select empno,ename,months_between(sysdate,hiredate)from emp;
下一个给定的星期是那个日期(next_day)select next_day(sysdate,'星期一')from dual;注:表示在当前时间的前提下,下个礼拜一的具体日期
求出给定日期所在月份的最后一天日期(last_day)select last_day(sysdate)from dual;
转换成字符串(to_char)查询雇员号,姓名,以及入职的年份
select empno,ename,to_char(hiredate,'yyyy')from emp;注:yyyy匹配年份,mm匹配月份,dd匹配日
使用to_char设置日期的显示格式
select empno,ename,to_char(hiredate,'yyyy-mm-dd')from emp;
使用fm去掉前导0 select empno,ename,to_char(hiredate,'fmyyyy-mm-dd')from emp;EMPNO ENAME
TO_CHAR(HI--------------------------
7369 SMITH
1980-12-17
7499 ALLEN
1981-2-20 注:正常的值是1981-02-20,02前面的0去掉,变成了1981-2-20. 通过to_char设置数值的格式
select empno,ename,to_char(sal,'99,999')from emp;说明:9代表1位数字
EMPNO ENAME
TO_CHAR---------------------------
7369 SMITH
800
7499 ALLEN
1,600
7521 WARD
1,250 注:把sal的值分成两个部分,后三位为一个部分,前两位为一个部分,用逗号隔开。
显示余额
select empno,ename,to_char(sal,'$99,999')from emp;说明:$代表美元
转换成数字(to_number)select to_number('123')+to_number('123')from dual;TO_NUMBER('123')+TO_NUMBER('123')--
246
转换成日期(to_date)select to_date('2009-07-31','yyyy-mm-dd')from dual;TO_DATE('2009---------------31-7月-09
算数运算
查询每个员工的年收入
select empno,ename,(sal+comm)*12 from emp;年收入=工资+奖金
查询每个员工的年收入
select empno,ename,(sal+comm)*12 income from emp;
查询每个员工的年收入
select empno,ename,(sal+NVL(comm,0))*12 income from emp;注:NVL(comm,0),当comm的值为null时,用0替换
ORACLE_多表查询
格式:
select 列名1 别名1,......from 表名1,表名2,......where 条件 order by 列名
查询员工的编号,姓名,部门编号,部门名称
select empno,ename,emp.deptno,dname from emp,dept where emp.deptno=dept.deptno;
关联查询-为表命别名
查询员工的编号,姓名,部门编号,部门名称
select empno,ename,e.deptno,dname from emp e,dept d where d.deptno=e.deptno;注:这里的e是emp的别名,d是dept的别名
关联查询-自连接
查询出每个雇员的姓名、工作、雇员的直接上级领导的姓名
select e.empno,e.ename,e.job,m.ename mname from emp e,emp m where e.mgr=m.empno;注:mname是m.ename的别名
关联查询-多表关联
四、 查询出每个雇员的姓名,工作,雇员的直接上级领导,以及部门名称 select e.ename,e.job,m.ename,d.dname from emp e,dept d,emp m where e.mgr=m.empno and e.deptno=d.deptno;注:当查询的字段间的关系涉及到n个表时,则n个表之间关联。
左、右外连接
查询员工编号,姓名,所在部门号,部门名称,将没有员工的部门也显示出来 select e.ename,d.deptno,d.dname from emp e,dept d where e.deptno(+)=d.deptno;注:(+)在左边,表示右连接,会列出所有右表中出现但是没有在左表中出现的行。
查询雇员的编号,姓名及其领导的编号,将没有领导的员工也列出来 select e.empno,e.ename,m.empno,m.ename from emp e,emp m where e.mgr=m.empno(+);注:(+)在右边表示左连接,会列出左表中出现但没有在右表中出现的行。
交叉连接(cross join):用来长生笛卡尔积 select * from emp cross join dept;
自然连接(nutural join):自动进行关联字段的匹配 select * from emp natural join dept;
using子句:直接指定操作关联列
select * from emp join dept using(deptno)
on子句:用户自己编写连接条件
select * from emp join dept on emp.deptno=dept.deptno;
left join:左外连接
right join:右外连接
五、ORACLE_列函数和分组
常用的列函数
sum(expression)求和 max(expression)求最大值 min(expression)求最小值 avg(expression)求平均数 count(expression)统计记录数
count(distinct colname)统计去除重复行记录数 nvl(comm,0)当comm为null时,用0替换
列函数的使用
查询员工的记录数,员工工资的总和,平均工资,最高工资,最低工资
select count(*)count_emp,sum(sal)sum_sal, max(sal)max_sal,min(sal)min_sal, avg(sal)avg_sal from emp;
列函数的使用-对null的处理
查询所有员工的年收入
select sum(sal+comm)from emp;SUM(SAL+COMM)-------------
7800 注:当comm为null时,sal+comm是没有结果值的
select sum(sal)+sum(comm)from emp;SUM(SAL)+SUM(COMM)------------------
31225
select sum(sal+nvl(comm,0))from emp;SUM(SAL+NVL(COMM,0))--------------------
31225
分组查询
语法格式
select 列名...,列函数 from 表名...where 条件...group by 列名...order by 列名... 查询每个部门的人数
select deptno,count(*)from emp group by deptno;规则:如果在select字句中,有不在列函数中的列,则该列一定要出现在group by之后。
分组查询having字句的使用
显示出平均工资大于2000的部门编号和平均工资 select deptno,avg(sal)from emp group by deptno having avg(sal)>2000;
SQL语句的书写顺序
select 列名,列函数 from 表名 where 条件 group by列名 having 条件 order by 列名
SQL语句的执行顺序
from where group by having select order by
查询20,30部门的平均工资,并将平均工资大于2000的输出,输出结果按平均工资排序 select deptno,avg(sal)from emp where deptno in(20,30)group by deptno having avg(sal)>2000 order by avg(sal);
六、ORACLE_子查询
在where子句中使用子查询
查询工资比7654雇员工资高的全部雇员信息
select * from emp where sal>(select sal from emp where empno=7654);子查询-in的使用
查询和smith或jones在同一部门,同一职位工作的员工
select ename from emp where(deptno,job)in(select deptno,job from emp where ename in('SMITH','JONES'));
子查询-any的使用
=any:与in操作符的效果一致
查询和smith或jones在同一部门,同一职位工作的员工
select ename from emp where(deptno,job)=any(select deptno,job from emp where ename in('SMITH','JONES'));
>any:只要大于子查询中的任何一个值即可 select * from emp where sal>any(select min(sal)from emp group by deptno);
select empno from emp where sal 子查询all的使用 >all:比最大的值大 select * from emp where sal>all (select min(sal)from emp group by deptno);注:select min(sal)from emp group by deptno结果为 MIN(SAL)---------- 950 800 1300 是每个部门当中的最少工资。 七、ORACLE_表的更新操作 创建表副本 create table myemp as select * from emp; 插入 到表中 insert的语法 insert into 表名(字段名1,字段名2,......)values(值1,值2......) 为myemp中增加一条记录 insert into myemp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values(7899,'张三','清洁工','7369','14-2月-2005',9000,300,40);注:给定的值要和指定的字段数一致。 1.如果全部字段都插入值的话,那字段名可以省略。即: insert into 表名 values(值1,值2,.......);2.如果只是部分字段插入值的话,字段名又想省略的话,那么,其余没有数据插入的字段用null填补。 to_date:字符型转换成日期型 批量插入记录 格式: insert into 表名 select 字段列表 from 表名 where 条件 注:insert表和select表列数等都一致 例如: create table test as select * from emp;insert into test select * from emp; 修改记录 update表名set要修改的字段=新值,要修改的字段=新值,...where条件 将雇员号为7896的雇员的奖金修改为100 update myemp set comm=100 where empno=7896;注:执行修改操作时,一定要使用where来指定修改的条件,否则会改变表中的所有记录。 删除记录 delete from 表名 where 条件 删除雇员编号为7896的雇员信息 delete from myemp where empno=7896;注:执行delete操作时,一定要使用where来指定修改的条件,否则会删除表中所有的记录。 Oralce的事务处理 commit:提交事务 rollback:回滚操作 注:操作一旦执行了commit操作,就再也不能回滚操作了。 八、ORACLE_表与视图的管理 oracle中的常见数据类型 varchar、varchar2:表示一个字符串,有长度限制,为255 number: number(n):表示一个整数,数字的长度是n,可以使用int number(n,m):表示一个小数,数字的长度为n,整数长度m-n,可以使用float date:表示日期类型,日期要按照标准格式日期存放。clob:大对象,表示大文本数据类型,可存放4G。 blob:大对象,表示二进制数据,最大可以存放4G,如电影,图片、歌曲 创建表 语法: create table 表名(字段名称1 字段类型[default 默认值], 字段名称1 字段类型[default 默认值],............字段名称1 字段类型[default 默认值],); 复制表 create table 表名 as(子查询);注:当子查询不成立时,如果1=2,则只复制表的结果,不复制表的数据。 删除表 语法: drop table 表名; 修改表结构 增加一列 alter table 表名 add(列名称 列数据类型 default 默认值) 删除列 alter table 表名 drop column 列名称; 修改列的数据类型 alter table 表名称 modify(列的名称 列的类型 default 默认值);注:1.如果是更改数据的长度,则要求更改时,长度不能小于当前表中数据所具有的最大长度。 2.如果是更改数据类型,则要求更改时,该列的所有记录值都为空。 修改表结构 为表重命名 rename 旧表名 to 新表名;注:这是oracle特有的操作 将myemp表改名为iemp SQL> rename myemp to iemp;表已重命名。 截断表 truncate table 表名;意义:清空表中的所有数据,并且立即释放资源,该操作是不可回滚。 约束-约束的分类 主键约束:表示一个唯一的标识,本身不能为空 唯一约束:列值不允许重复 检查约束:检查一个列的内容是否合法 非空约束:不能为空值,如用户不能为空(no null)外键约束:在两张表中进行约束的操作 主键约束(primary key)主键约束一般在id上使用,而且本身已经默认了不能为空,主键约束可以在建表的时候指定 create table person(pid varchar2(18)primary key, name varchar(30), age number(3), sex varchar2(2)default'男'); 使用constraint指定 constraint [kən'streint] 约束;强制 create table person(pid varchar2(18), name varchar(30), age number(3), sex varchar2(2)default'男' constraint person_pid_pk primary key(pid);); 非空约束(not null)create table person(pid varchar2(18)primary key, name varchar(30)not null, age number(3), sex varchar2(2)default'男'); 唯一约束(unique)create table person(pid varchar2(18)primary key, name varchar(30)unique not null, age number(3), sex varchar2(2)default'男'); 视图 概念:一个视图实质是封装了一条复杂的SQL语句 创建视图 语法: create view 视图名称 as 子查询 创建部门20员工的雇员信息 create view empv20 as select * from emp where deptno=20;注:当创建视图以后,可以像操作表一样操作视图。注:视图的操作会影响到表的操作。 with check option 不能更新创建视图的条件 with read only 创建只读视图 删除视图 语法: drop view 视图名称 注:当删除视图所在的表时,则视图也不能被使用 序列 创建序列语法:sequence ['si:kwəns] create sequence 序列名称;create sequence myseq;序列的操作: nextval:取得序列的下一个内容 currval:取得当前序列的内容 创建表验证序列的操作 create table testseq(next number,curr number);insert into testseq values(myseq.currval,myseq.nextval); 创建序列指定每次增长的增量 create sequence myseq increment by 2;注:每次增长2 创建序列指定开始的序列,默认的序列从1开始。create sequence myseq increment by 2 start with 10;注:序列从10开始,每次增长2 创建一个序列1,3,5,7,9.create sequence myseq maxvalue 9 increment by 2 start with 1 cache 2 cycle;注:序列从1开始,每次增长2,最大值为9,循环两次。