Oracle
一、课程目标
【了解】Oracle基本概念
【理解】Oracle的安装与卸载
【掌握】Oracle的基本使用
二、概述
ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。ORACLE数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能;作为一个关系数据库,它是一个完备关系的产品;作为分布式数据库它实现了分布式处理功能。但它的所有知识,只要在一种机型上学习了ORACLE知识,便能在各种类型的机器上使用它。
2.1 Oracle发展史
•1978年,Oracle 2诞生了,它是使用汇编语言开发的,但它的出现并没有引起太多的关注
•1982年,Oracle公司推出了Oracle 3,这是第一个能够运行在大型和小型机上的关系型数据库
•1997年, Oracle公司又推出了基于Java语言的Oracle 8
•1999年,Oracle正式提供世界上第一个Internet数据库Oracle8i
•2001年6月,Oracle公司发布了Oracle 9i
•2007年7月12日,Oracle公司推出Oracle 11g,Oracle 11g中的“g”代表“网络”
2.2 Oracle 数据库系统的特点
•支持大数据库、多用户、高性能的事务处理
•安全性好
•提供了新的分布式数据库能力
•具有可移植性、可兼容性
2.3 Oracle数据库存储结构
数据块(Data Block)
数据块是最小的数据管理单位,即Oracle中所有的I/O操作都以块为单位。数据块的大小是操作系统块大小的整数倍,常见大小为2KB或4KB
数据区间(Data Extent)
数据区间由物理上连续存放的块所构成,它是Oracle存储分配的最小单位,一个或多个块组成一个数据区间
数据段(Data Segment)
若干个数据区间构成数据段
表空间(Table Space)
为了提高数据库服务器管理和运行的效率,Oracle 11g使用“表空间”这个虚拟的概念来管理逻辑对象,用户可以将不同性质的逻辑对象存放在不同的表空间下
在Windows操作系统中,使用文件夹来分类管理各种文件,表空间相当于Oracle数据库的文件夹。
每个表空间由一个或多个数据文件组成,一个数据文件只能与一个表空间相联系
账号、表空间、表之间的关系
一个账号可以拥有多个表空间的使用权限,一个表空间可以存储多个表,一个表只能属于一个表空间
三、Oracle的卸载与安装
3.1 Oracle的卸载
1)关闭正在运行的Oracle所有服务
2)删除对应注册表信息
删除oracle注册表信息.运行regedit,删除注册表项
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle
删除oracle服务.oracle服务在注册表中的位置是:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Service
删除所有以oracle字符打头的服务.
删除事件日志.注册表中的位置是
HKEY_LOCAL_MACHINE\SYSTEM\CurrentContrilSet\Services\Eventlog\Application
删除所有以oracle字符打头的键.
3)删除环境变量中oracle的环境变量
删除ORACLE环境变量,如"JSERV"变量和Path变量中的oracle路径
4)删除oracle相关菜单以及目录
- 删除oracle菜单.
- 删除"program files\oracle"目录
- 重启WINDOWS.
- 删除oracle主目录.
3.2 Oracle的安装
1)将安装包解压到指定文件(如果是官网下载的安装包,那么需要将两个压缩文件解压到一起)
下面截图中没有的步骤截图就直接下一步就可以
2)点击setup.exe进行安装
3)根据提示完成oracle的配置与安装
取消勾选安全更新提示
选择安装服务器类应用
选择高级安装进行详细配置
选择oracle管理软件安装位置,之后的详细位置会自动生成
修改数据库存储数据默认字符集
为默认账号设置密码口令(可以设置统一也可以分别设置)
4)解锁账号修改密码
默认很多账号都是锁定状态不能使用,需要解锁后才能使用
5)使用 sqlplus测试是否可以连接数据库
用户输入 sys as sysdba 输入密码
3.3 PLSQL Developer图形化工具安装
1)解压到指定文件夹
2)配置连接当前oracle数据的配置
进入指定文件夹修改.ora文件
将ip修改为oracle数据库所在ip
在DOS命令中输入ipconfig查看本机IP
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.50.6.110 )(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
四、Oracle的基本使用
4.1 DCL语句
4.1.1 表空间的创建
表空间的作用
可以使用表空间限制数据库文件的大小
利用表空间将数据文件存放到不同的磁盘上,提高IO性能,利于数据的备份和恢复
创建表空间语法:
CREATE TABLESPACE tablespacename
DATAFILE ‘filename’ [SIZE integer [K|M]]
[AUTOEXTEND [OFF|ON]];
create tablespace myspace
datafile
'e:/my01.dbf' size 5 M,
'd:/my02.dbf' size 10 M
-- 创建表时,为表指定表空间
create table person
(
pid number ,
pname varchar2(20) ,
page number(3),
birthday date,
address varchar2(20) default '不详'
)tablespace myspace;
4.1.2 账号的创建
同一数据库中可以同时有多个用户,每个用户管理自己的数据库对象.比如数据库表、索引、视图等。。
Oracle中的CREATE USER命令用于创建新用户。每个用户都有一个默认表空间和一个临时表空间。如果没有指定,Oracle就将SYSTEM设为默认表空间,将TEMP设为临时表空间。
CREATE USER ahx
IDENTIFIED BY 123456
DEFAULT TABLESPACE myspace;
新创建的账号默认为锁定状态并且没有连接权限,需要解锁并授权
将指定用户解锁
alter user ahx account unlock;
4.1.3 角色权限认证
Oracle中的常用系统预定义角色如下。
CONNECT:临时用户,特别是那些不需要创建表的用户,通常赋予该角色。
RESOURCE:更为可靠和正式的数据库用户可以授予该角色,可以创建表、触发器、过程等。
DBA:数据库管理员角色,拥有管理数据库的最高权限。一个具有DBA角色的用户可以撤销任何别的用户甚至别的DBA权限,这是很危险的,所以不要把该角色轻易授予一些不是很重要的用户。
给用户分配权限或角色
GRANT命令用于为用户分配权限或角色,而REVOKE命令用于为用户撤销权限和角色
授权
分配权限或角色语法:GRANT [<权限> | <角色>] TO <用户>;
将指定用户授权
grant connect,dba,resource to ahx
grant create session,create table to ahx;--为用户分配权限
grant connect to ahx;--为用户分配角色
grant resource to ahx;
--grant connect,resource to ahx;--为用户分配角色
--为ahx分配查询scott账号下的emp表的权限
-- grant select|insert|update|delete on 表 to 用户
grant select on scott.emp to ahx
--以xiaoming账号登录查询
select * from scott.emp
在进行权限赋权时可以为指定账号单独赋予权限,也可以赋予角色,直接拥有角色所拥有的权限
取消授权
撤销权限和角色语法:REVOKE [<权限> | <角色>] FROM <用户>;
4.2 DDL语句
由于oracle没有库的概念,所以创建表空间就是建库语句,oracle的ddl语句经常指的是创建表或对表的列进行修改的语句
4.2.1 CREATE TABLE 语句
除数据类型外与mysql建表语句语法相同,并且oracle允许检查约束(一般交由服务器处理)
---创建表: create table 表名(列名1 数据类型 [约束])
create table dept
(
deptno number(6) primary key,
deptname varchar2(50) not null,
deptnum number(5) check (deptnum>=0),
loc varchar(100) default '郑州'
)
create table employee
(
empId number(10) primary key,
empName varchar2(50) not null,
empAge number(3) check(empAge>=18 and empAge<=60),
deptno number(6) references dept(deptno)
)
Oracle没有主键自增的概念,如果需要主键自增可以通过序列解决
4.2.2 ALTER TABLE语句
对已有表的列进行操作
增加
语法: alter table tableName add columnName dataType;
alter table employee add empTel varchar2(11);
修改
语法: alter table tableName modify columnName dataType;
alter table employee modify empTel varchar2(14);
删除
语法: alter table tableName drop column columnName;
alter table employee drop column empTel;
对列添加约束
语法:alter table tableName add constraint constraintName constraintType(columnName)
alter table dept add constraint un_deptname unique(deptname);
从视图USER_CONS_COLUMNS中查看约束
select constraint_name,column_name from user_cons_columns
4.2.3 序列
序列(SEQUENCE)是一个命名的顺序编号生成器,它能以串行的方式生成一系列顺序整数
序列的主要用途:
- 主键、外键值应用需求
- 流水号应用需求
- 序列的生成与定义的内容
序列语法:
CREATE SEQUENCE sequnce_name
[START WITH n1] //指定要生成的第一个序列号 (从n1 开始)
[INCREMENT BY n2] //用于指定序列号之间的间隔,默认值为1
[{MAXVALUE n3 | NOMAXVALUE}] //指定序列可以生成的最大值
[{MINVALUE n4 | NOMINVALUE}] //指定序列可以生成的最小值
[{CACHE n5 | NOCACHE}] //用于指定在高速缓存中可以预分配的序列号个数,默认为20
[{CYCLE | NOCYCLE}] //用于指定在达到序列的最大值或最小值后是否循环
[ORDER]; //用于指定按顺序生成序列号 ,确保序列唯一和有序
create sequence ms
start with 1
increment by 1
maxvalue 5
minvalue 1
nocycle
cache 10;
使用
通过nextval获取下一个序列的值
select ms.nextval from dual;
通过currval获取当前序列的值
select ms.currval from dual;
序列的使用
--创建序列
create sequence ms
start with 1 --从1开始
increment by 1 --序列的间隔(每次变化的数值)
maxvalue 10000000 --最大值
minvalue 1 --最小值
nocycle --不循环
cache 10
select * from dual
select my_seq.nextval from dual
select my_seq.currval from dual
select * from employee
--Oracle中没有主键自增的概念,但可以通过自定义序列来实现
insert into employee(empId,empName,empAge,deptno) values(ms.nextval,'zhangsan',20,10)
修改序列
#更改序列
ALTER SEQUENCE ms MAXVALUE 5000 CYCLE;
#删除序列
DROP SEQUENCE ms;
4.3 DML语句
oracle基本语句使用的还是sql所以与mysql学习时使用的dml语句基本保持一致
4.3.1 insert 增加
insert into 表名(列名1,列名2,列名3…)values(值1, 值2 ,值3…)
由于没有主键自增所以在添加时使用序列进行数据的id生成
4.3.2 update 修改
update 表名 set 列名1=值1, 列名2=值2 … [where 条件]
4.3.3 delete删除
delete from 表名 [where 条件]
基本查询语句练习
--使用scott账号练习基本查询语句
--1 查询当前用户下的所有表
select * from tab;
--2 查询雇员表中所有信息
select * from emp;
--3 查询雇员编号,姓名,工作,工资
select empno,ename,job,sal from emp
--4 查询雇员编号,姓名,工作,工资,并显示中文(为列起别名)
select empno as 编号,ename as 姓名,job as 工作,sal as 工资 from emp
--5 消除重复列,查询雇员工作种类
select distinct job from emp
--6 字符串连接操作(||)
--查询雇员编号,姓名,工作.按以下格工显示:编号:7369,姓名:Smith,工作:Clerk
select '编号:'||empno,'姓名:'||ename,'工作:'||job from emp
--7 查询列支持四则运算(年薪=(工资+奖金)*12)
--查询雇员编号,姓名,工作,年薪
select empno,ename,job,(sal+nvl(comm,0))*12 from emp
nvl(comm,0)==>如果comm值为空,取值0
--8 Where条件查询
-- 查询工资大于1500的所有雇员
select * from emp where sal>1500
--查询可以得到奖金的所有雇员
select * from emp where comm is not null
--查询工资大于1500或可以得到奖金的雇员
select * from emp where sal>1500 or comm is not null
--查询工资大于1500并且可以领取奖金的雇员
select * from emp where sal>1500 and comm is not null
--查询工资不大于1500或者不可以领取奖金的雇员
select * from emp where sal<=1500 or comm is null
--查询工资在1500到3000的所有雇员信息
select * from emp where sal>=1500 and sal<=3000
select * from emp where sal between 1500 and 3000
--查询在1981年雇用的员工信息
select * from emp where hiredate like '%81%'
--查询雇员姓名中第二个字母为"M"的雇员
select * from emp where ename like '_M%'
--查询雇员工资中带8这个数字的
select * from emp where sal like '%8%'
--查询编号是7369,7499,7521,7799的雇员信息
select * from emp where empno=7369 or empno=7499 or empno=7521 or empno=7799
select * from emp where empno in(7369,7499,7521,7799)
--查询雇员编号不是7369,7499,7521,7799的所有雇员信息
select * from emp where empno not in(7369,7499,7521,7799)
--查询雇员编号为7369的雇员信息
select * from emp where empno =7369
--查询雇员编号不为7369的雇员信息
select * from emp where empno !=7369
select * from emp where empno <>7369
--查询雇员信息,按工资由低到高排序
select * from emp order by sal asc
--查询雇员信息,按工资由高到低排序
select * from emp order by sal desc
--操作集合:
--union:将两个记录合并,去掉重复项
select distinct deptno from emp union select deptno from dept;
--union:将两个记录合并,不去掉重复项
select distinct deptno from emp union all select deptno from dept;
--intersect:取两个集合的交集
select distinct deptno from emp intersect select deptno from dept;
--minus:去掉交集(集合A-(集合A和集合B的交集))
select deptno from dept minus select distinct deptno from emp ;