Oracle是甲骨文公司推出的一款大型数据库管理系统。甲骨文公司成立于1977年,总部位于美国加利福尼亚州的红木滩。1989年,Oracle正式进入中国市场;2013年,甲骨文超越 IBM ,成为继 Microsoft 后全球第二大软件公司。
Oracle的版本从8i开始完全支持Java。Oracle是一种大型关系数据库,关系数据库支持的SQL语言包括:
DDL(Data Define Language)数据定义语言,如create,alter,drop,truncate等
DML (Data Manipulation Language)数据操纵语言,如insert,delete,update,select等
DCL (Data Control Language)数据控制语言,如grant,revoke等
我们在电脑上安装了Oracle数据库后,以Win7为例,可以先在电脑的“服务和应用程序”里将所有Oracle服务设置为“手动”开启方式,在需要使用Oracle时进行手动开启,从而避免电脑内存被占用过高。
在需要使用Oracle时,我们可以打开DOS窗口,在里面开启Oracle和相应的监听服务。举例来说,我们在安装Oracle时,将Oracle服务命名为orcl,那么服务启动如下:
net start oracleserviceorcl 开启oracle服务
lsnrctl start 开启监听
在需要关闭Oracle时,则操作如下:
net stop oracleserviceorcl 关闭Oracle服务
lsnrctl 关闭监听
接下来我们可以打开Oracle的SQL Plus窗口,在提示的输入用户名和密码里,分别输入scott和tiger,然后以scott用户的权限登录进Oracle进行操作;我们还可以在电脑上安装PL/SQL来操作Oracle。scott用户默认提供了几个表可以作为演示,如下所示:
select * from dept;
select * from emp;
select * from bonus;
select * from salgrade;
我们一般通过SQL来操作Oracle。
一般来说,Sql可以分为初中高三级。
Sql初级主要包括增删改查、内外连接、子查询等;
Sql中级主要包括事务、函数、序列、同义词、视图等;
Sql高级主要包括PL/Sql、存储过程、自定义函数、触发器等。
另外,对索引的灵活运用是一个实用技巧。
基本表的定义格式如下所示:
create table 表名(
列名 数据类型 [default 缺省值] [not null]
[,列名 数据类型 [default 缺省值] [not null]]
……
[,primary key(列名 [,列名] …)]
[,foreign key (列名 [,列名] …)
references 表名 (列名 [,列名] …)]
[,unique(列名 [,列名] …)]
[,check(条件)])
在Sql初级的基本操作里,我们主要看下having与where的区别。Having用来筛选聚合之后的结果集,Where用来筛选表中的记录。如下例所示:
select deptno,sum(sal) from emp group by deptno having sum(sal)<10000;
select deptno,sum(sal) from emp where sal>2000 group by deptno;
总的来说,Where 在聚合前执行条件筛选,having在 聚合后执行。Having可以使用聚合函数,Where 则不可以。
另外,我们在删除表中的记录时,truncate是移除表中所有的数据行,并释放表中的存储空间,在执行truncate语句后,不能对该操作回滚rollback;可以用delete语句来做相同的操作,delete不会立即释放表空间,因而可以回滚。相对而言,truncate速度更快,而且不写入日志。
在sql中级里,sql中的dml语句可以通过设置事务的提交方式(自动提交或手动提交)来选择手动提交或自动提交,而DDL语句则不用设置提交,系统会自动提交。换言之,在Oracle中,只有对数据记录的增删改查 是手动提交,其他是自动提交。
提及事务,我再次重复下曾经在《数据库简述(以MySQL为例)》文章里说过的事务4大特性,即原子性、一致性、隔离性、持久性。
其中,原子性:事务中的操作是不可分割的逻辑单元;
一致性:事务前后的业务逻辑要一致;
隔离性:事务之间的操作相对独立,不受影响;
持久性:事务一旦发生就持久有效。
事务的命令包含的关键词主要有commit(提交),rollback(回滚),savepoint(保存点)等关键词。
另外,视图是一个虚拟的表,视图本身并没有存储任何数据,使用视图我们可以限定用户只访问表的一部分数据;通过利用with,check,option选项,我们可以限制用户对视图的更改和插入记录在我们指定的值域中。视图演示如下:
#简单的视图
Create view myview as select * from emp where job=‘MANAGER’;
#带有聚合函数的视图
Create view myviewa as select deptno,sum(sal) totsal from emp group by deptno;
#从多张表连接形成的视图
Create view myviewb as select ename,job,dname,loc from emp e,dept d where e.deptno=d.deptno;
#对视图的更改实际上是对表的更改
Update myview set sal=sal+20;
#删除视图
drop view myview;
在数据库设计中,我们通常需要设计实体关系模型。在这方面,E-R图为我们从现实世界到数据模型提供了一个中间工具,它包括了实体、属性和联系三个要求。示意图如下:
E-R图在具体表示中,用矩形表示实体,用椭圆表示属性,用菱形表示联系。 实体间的联系,以及属性和实体间、实体和联系间用线段连接。实体与实体之间的关系包含三种,分别是一对一(如一个身份证号对应一个人),一对多(一个人可以有多个朋友),多对多(一个老师可以对应多个学生,一个学生也可以对应多个老师)。
一般来说,设计E-R图的原则是:首先, 针对特定用户的应用,确定实体、属性和实体间的联系,设计该用户视图的局部E-R图 ;其次,综合各个用户的局部E-R图,产生反映数据库整体概念的总体E-R图。
一个系统的E-R图不是唯一的。 现实世界的复杂性导致实体联系的复杂性,E-R图将实体联系模型转化为关系数据模型的规则有:一是E-R图中每个实体类型转化为一个关系模式, 实体类型中实体的属性转化为该关系模式的属性;实体标识符(实体键)转化为该关系模式的关键字; 每一个实体转化为该关系模式对应关系的一个元组。二是E-R图中的联系,根据联系方式的不同,采取不同手段以使被它联系的实体所对应的关系彼此有某种联系。
在此,我再申明下数据库设计中的三范式 :第一,表中的列不可再分;第二,表中的列必须完全依赖于全主键而不能部分依赖;第三,不能出现依赖传递。
我们再来看Oracle中的数据字典。Oracle数据字典中的对象名称以三种前缀开头:”User”,”All”,”DBA”(只有在个别情况下例外)。
其中,“User”域中的记录通常显示有关执行查询的帐户所拥有的对象的信息 ;“All”域中的记录包括“User”记录以及有关已授予用户其特权的对象的信息; “DBA”域包含所有数据库对象,而不管其所有者是谁。对于大多数数据库对象而言,“User”,”All”和“DBA”域都是可用的。
常用的数据字典有:
User_Tables
User_Views
User_Constraints
User_Triggers