Oracle基础学习和安装过程

Oracle简介

Oracle19c的安装配置教程

什么是Oracle

ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。
ORACLE通常应用于大型系统的数据库产品。
ORACLE 数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通
用的数据库系统,它具有完整的数据管理功能;作为一个关系数据库,它是一个完备关系的产品;作为分布式数据库它实现了分布式处理功能。

ORACLE 数据库具有以下特点:

(1)支持多用户、大事务量的事务处理
(2)数据安全性和完整性控制
(3)支持分布式数据处理
(4)可移植性

ORACLE体系结构
1、数据库

Oracle数据库是数据的物理存储。这就包括(数据文件ORA或者DBF、控制文件、联机日志、参数文件)。其实Oracle数据库的概念和其它数据库不一样,这里的数据库是一个操作系统只有一个库。可以看作是Oracle就只有一个大数据库

2、实例

一个Oracle实例Oracle Instance有一系列的后台进程(Backguound Processes)和内存结构(Memory Structures)组成。一个数据库可以有n个实例。

3、数据文件(dbf)

表空间只是一个逻辑单位,真正存放文件的地方叫数据文件
数据文件是数据库的物理存储单位。数据库的数据是存储在表空间中的,真正是在某一个或者多个数据文件中.而一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间。一旦数据文件被加入到某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属于的表空间才
行.

4、表空间

表空间是Oracle对物理数据库上相关数据文件(ORA或者DBF文件)的逻辑映射。一个数据库在逻辑上被划分成一到若干个表空间,每个表空间包含了在逻辑上相关联的一组结构。每个数据库至少有一个表空间(称之为system表空间)。
每个表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据文件(datafile)。一个数据文件只能属于一个表空间。
在这里插入图片描述
注︰表的数据,是有用户放入某一个表空间的,而这个表空间会随机把这些表数据放到一个或者多个数据文件中。
由于oracle的数据库不是普通的概念,oracle是有用户和表空间对数据进行管理和存放的。但是表不是有表空间去查询的,而是由用户去查的。因为不同用户可以在同一个表空间建立同一个名字的表!这里区分就是用户了!
在这里插入图片描述

5、用户

用户是在表空间下建立的。用户登陆后只能看到和操作自己的表,ORACLE
的用户与MYSQL的数据库类似,每建立一个应用需要创建一个用户。
在这里插入图片描述

Oracle基本操作

创建表空间创建用户以及用户授权

表空间? Oracle数据库的逻辑单元。数据库—>表空间 一个表空间可以与多个数据文件(物理结构)关联
一个数据库下可以建立多个表空间,一个表空间可以建立多个用户,一个用户下可以建立多个表
zgdaren 为表空间名称
datafile 指定表空间对应的数据文件
size定义的是表空间的初始大小
autoextend on 自动增长,当表空间存储都占满时,自动增长
next 指定的是一次自动增长的大小

--创建表空间
create tablespace zgdaren
datafile 'D:\sql\oracle\zgdaren01.dbf'
size 100m
autoextend on 
next 10m;

--删除表空间
drop tablespace zgdaren;

--创建用户
CREATE USER zgdaren
IDENTIFIED by zgdaren
DEFAULT TABLESPACE zgdaren;

--oracle数据库中管理表的基本单位是用户,每个用户登录后看到表的数量是不一样的,所以必须给用户授权否则无法登录

--给用户授权
--Oracle中常用角色
--connect连接角色,基本角色
--resource开发者角色
--dba超级管理员角色
--给zgdaren用户授予dba角色
grant dba to zgdaren;



数据类型介绍和表的创建
Oracle数据类型
NO数据类型描述
1Varchar,varchar2表示一个字符串
2NUMBERNUMBER(n)表示一个整数,长度是n
2NUMBERNUMBER(m,n)表示一个小数,总长度是m,小数是n,整数是m-n(例如:m为4,n为2则最大可表示99.99)
3DATA表示日期类型
4CLOB大对象,表示大文本数据类型,可存4G
(字段)
5BLOB大对象,表示二进制数据,可存4G (视频等)
表的创建
--创建一个person表
create table person(
		pid number(20),
		pname varchar2(10)
);

在这里插入图片描述

表结构的修改
--修改表结构
--添加一列就写一行,如果多列即可使用括号将其包裹并使用逗号隔开
alter table person add gender number(1);
--修改列类型
alter table person modify gender char(1);
--修改列名称
alter table person rename COLUMN gender to sex;
--删除一列
alter table person drop COLUMN sex;

在这里插入图片描述

数据的增删改

oracle中DDL为默认提交事务,DML不会默认提交事务

--查询表中记录
select * from person;
--添加一条记录
insert into person(pid,pname) VALUES (1,'小明');
commit;
--修改一条记录
update person set pname = '小马' where pid = 1;

--三个删除
--删除表中全部记录
delete from person;
--删除表结构
drop table person;
--先删除表,再次创建表。效果等同于删除表中全部记录
--在数据量大的情况下,尤其在表中带有索引的情况下,该操作效率高
--索引可以提高查询效率,但是会影响增删改效率
truncate table person;

序列的使用
--序列不真的属于任何一张表,但是可以逻辑和表做绑定
--序列:默认从1开始,一次递增,主要用来给主键赋值使用
--dual:虚表,只是为了补全语法,没有任何意义
create sequence s_person;
SELECT s_person.nextval from dual;--下一个值
SELECT s_person.currval from dual;--当前值
--添加一条记录
insert into person(pid,pname) VALUES (s_person.nextval,'小明');
commit;

oracle的查询

scott用户
--scott用户,密码为tiger
--解锁scott用户,
alter user scott account unlock;
--解锁scott用户的密码,此剧也可用来重置密码
alter user scott IDENTIFIED by tiger;
--切换到scott用户下

在这里插入图片描述

单行函数
-- 字符函数
select UPPER('yes') from dual;-- YES 小写变大写
select LOWER('YES') from dual;-- yes 大写变小写

-- 数值函数
select ROUND(29.17) from dual;-- 29 四舍五入
select ROUND(28.78, 1) from dual;-- 28.8 逗号的1表示小数点后保留一位小数
select ROUND(28.78, -1) from dual;-- 28.8 逗号的1表示小数点前保留一位小数
select TRUNC(57.9, 1) from dual;-- 57.9 直接截取,不在看后面位数的数字是否大于5
select MOD(10, 3) from dual;-- 1 求余数

-- 日期函数
-- 查询出emp表中所有员工入职距离现在几天,日期可以直接加减,最后时间是天
select SYSDATE-e.hiredate from emp e;
-- 计算明天的此刻
select sysdate+1 from dual;--  2021-12-12 10:29:38
-- 查询出emp表中所有员工入职距离现在几月
select months_between(SYSDATE,e.hiredate) from emp e;
-- 查询出emp表中所有员工入职距离现在几年
select months_between(SYSDATE,e.hiredate)/12 from emp e;
-- 查询出emp表中所有员工入职距离现在几周,并且四舍五入不要小数
select round((SYSDATE-e.hiredate)/7) from emp e;

--  转换函数(日期转字符串)
select to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual; --  2021-12-11 10:37:17
select to_char(sysdate,' fm yyyy-mm-dd hh:mi:ss') from dual; -- fm的作用是可以将前面的0去掉
select to_char(sysdate,' fm yyyy-mm-dd hh24:mi:ss') from dual; -- hh24表示为使用24小时制显示时间
--  转换函数(字符串转日期)
select to_date ('2021-12-11 10:37:17','yyyy-mm-dd hh:mi:ss') from dual;

-- 通用函数
-- 算出emp表中所有员工的年薪
select e.sal*12+e.comm from emp e;-- 有null值的全为null
--  奖金里面有null值,如果null值和任意数字做算术运算,结果都是null,所以需要使用到nvl函数
select e.sal*12+nvl(e.comm,0) from emp e;

条件表达式
-- 条件表达式
-- 条件表达式的通用写法,mysql和oracle通用
-- 给emp表中员工起中文名
select e.ename,
				case e.ename
					when 'SMITH' then '曹贼'
						when 'ALLEN' then '大耳贼'
							when 'WARD' then '诸葛小儿'
								else '无名'
									end
from emp e;

-- 判断emp表中员工工资,如果高于3000显示高收入,如果高于1500低于3000显示中收入,其余显示低收入
select e.sal,
				case 
					when e.sal>3000 then '高收入'
						when e.sal>1500 then '中等收入'
								else '低收入'
									end
from emp e;

--  条件表达式(oracle专用)
--  oracle中除了起别名可不用加任何符号,也可加双引号、剩下的都用单引号
select e.ename,
				decode(e.ename,
					 'SMITH' , '曹贼',
						 'ALLEN' , '大耳贼',
							 'WARD' , '诸葛小儿',
								 '无名') 中文名
from emp e;


多行函数
-- 多行函数【聚合函数】:作用于多行,返回一个值
select count(1) from emp;-- 查询总数量
select sum(sal) from emp;--  工资总和
select max(sal) from emp;-- 最大工资
select min(sal) from emp;--  最低工资
select avg(sal) from emp;--  平均工资
分组查询
-- 分组查询
--  查询出每个部分的平均工资
-- 分组查询中,出现在group by 后面的原始列,才能出现在select后面
--  没有出现在group by 后面的列,想在select后面,必须加上集合函数
--  聚合函数有一个特性,可以把多行记录变成一个值
select e.deptno,AVG(e.sal)
from emp e
GROUP BY e.deptno

--  查询出平均工资高于2000的部门信息
select e.deptno,AVG(e.sal) asal
from emp e
GROUP BY e.deptno
having AVG(e.sal)>2000;
--  多有聚合函数的条件都不能使用别名来判断
--  因为在查询的时候是先看条件在来查询的,所以当查询时并没有别名的字段可提供查询
select * from emp wnere sal>1500;

--  查询出每个部门工资高于800员工的平均工资
select e.deptno,AVG(e.sal) asal
from emp e
where e.sal>800
GROUP BY e.deptno
--  where是过滤分组前的数据,GROUP BY 是过滤分组后的数据
--  表现形式:where必须在group by之前,having是在GROUP BY 之后

--  查询出每个部门工资高于800员工的平均工资,再查询出平均工资高于2000的部门
select e.deptno,AVG(e.sal) asal
from emp e
where e.sal>800
GROUP BY e.deptno
having AVG(e.sal)>2000;

多表查询中的外连接
-- 多表查询中的一些概念
--  迪卡尔积
select *
from emp e,dept d;
--  等值连接
select *
from emp e,dept d
where e.deptno = d.deptno;
--  内连接
select *
from emp e inner join dept d
on e.deptno = d.deptno;
-- 查询出所有部门,以及部门下的员工信息【外连接】
select *
from emp e right join dept d
on e.deptno = d.deptno;
-- 查询所有员工信息,以及员工所属部门
select *
from emp e left join dept d
on e.deptno = d.deptno;
--  oracle中专用外连接
-- 查询出所有部门,以及部门下的员工信息
select *
from emp e,dept d
where e.deptno(+) = d.deptno;
-- 查询所有员工信息,以及员工所属部门
select *
from emp e,dept d
where e.deptno = d.deptno(+);
自连接概念和练习
-- 自连接:就是站在不同的角度把一张表看成多张表
-- 查询出员工姓名,员工领导姓名
select e1.ename,e2.ename
from emp e1,emp e2
WHERE e1.mgr = e2.empno
--  查询出员工姓名,员工部门名称,员工领导姓名,员工领导部分名称
select e1.ename,d1.dname,e2.ename,d2.dname
from emp e1,emp e2,dept d1,dept d2
WHERE e1.mgr = e2.empno
and e1.deptno=d1.deptno
and e2.deptno=d2.deptno;

子查询
-- 子查询
-- 子查询返回一个值
--  查询出工资和WARD一样的员工信息
select * from emp where sal = 
(select sal from emp where ename = 'WARD')
-- 上面的语句可以将=换成in可以防止ename为空或重复,若ename为非空的主键=可以放心写

-- 子查询返回一个集合
-- 查询出工资和10号部门任意员工一样的员工信息
--  先查询出10号部门所有员工工资的集合
select * from emp where sal in
(select sal from emp where deptno = 10);
--  子查询返回一张表
--  查询出每个部门最低工资,和最低工资员工姓名,和该员工所在部门名称
-- 先查询出每个部门最低工资
select deptno,min(sal) msal
from emp
group by deptno

select t.deptno,t.msal,e.ename,d.dname
from (select deptno,min(sal) msal
			from emp
			group by deptno) t,emp e,dept d
where t.deptno = e.deptno
and t.msal = e.sal
and e.deptno = d.deptno;
oracle中的分页
-- oracle中的分页
-- rownum行号:当我们做selecet操作的时候,每查询一行记录,就会在该行上加一个行号,行号从1开始,依次递增,不能跳着走

-- 排序操作会影响rownum的顺序
select rownum,e.* from emp e ORDER BY e.sal desc
-- 如果涉及到排序,但还是要使用rownum的时候,可以再次嵌套查询
select rownum,t.* from(
select rownum,e.* from emp e ORDER BY e.sal desc) t;

-- emp表工资倒叙排列后,每页五条记录,查询第二页
--  rownum行号不能写上大于一个整数
select * from(
select  rownum rn,e.* from(
select * from emp ORDER BY sal desc
) e where rownum<11 
) where rn >5

Oracle对象

oracle视图

视图:视图就是提供一个查询的窗口,所有数据来自原表

--  视图
-- 查询语句创建表(可以跨用户查询)
create table emp as select * from scott.emp;
select * from emp;
-- 创建视图【必须有dba权限】
create view v_emp as select ename,job from emp;
-- 查询视图
select * from v_emp;
--  修改视图【不推荐修改视图】
update v_emp set job='CLERK' where ename='ALLEN';
commit;--  修改了视图表中的数据也会相应改变,因为视图中根本就没有存放数据,数据都存放于表中
--  创建只读视图
create view v_emp as select ename,job from emp with read only;
--  视图作用
-- 1、视图可以屏蔽掉一些敏感字段
-- 2、保证总部和分部数据及时统一

索引

索引:在表的列上构建一个二叉树,达到大幅度提高查询效率的目的,但是索引会影响增删改的效率

--  索引:在表的列上构建一个二叉树,达到大幅度提高查询效率的目的,但是索引会影响增删改的效率

--  单列索引
--  创建一个单列索引
create index idx_ename on emp(ename);
-- 单列索引出发规则,条件必须是索引列中的原始值
-- 单行函数,模糊查询,都会影响索引的触发
select * from emp where ename='ALLEN'
--  复合索引
--  创建符合索引
create index idx_enamejob on emp(ename,job);
--  符合索引中,第一列为优先检索列,如果要触发符合索引,必须包含有优先检索列中的原始值
select * from emp where ename='ALLEN' and job='xx'--  触发复合索引
select * from emp where ename='ALLEN' or job='xx'
-- or表示为两个查询与语句,所以一个触发一个不触发所以最终就是不会触发索引
select * from emp where ename='ALLEN' -- 触发单列索引

Oracle编程

pl/sql编程语言
pl/sql编程语言是对SQL语言的扩展,使得sql语言具有过程化编程的特性,是面向过程的编程语言,比一般的过程化编程语言更加灵活高效。
pl/sql编程语言主要用来编写存储过程和存储函数等
编程代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zgDaren

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值