Oracle基础

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Oracle基础

数据库是用户存放数据、访问数据、操作数据的存储仓库用户的各种数据被存放在数据库中。


数据库的类型:网状型数据库、层次型数据库、关系型数据库


一个Oracle实例有一系列的后台进程和内存结构组成。一个数据库可以有n个实例。


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


表空间是Oracle对物理数据上相关数据文件的逻辑映射,一个数据库在逻辑上被划分为一到若干个表空间,每个表空间包含了在逻辑上相关联的一组结构。每个数据库至少有一个表空间。每个表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据文件。一个数据文件只能属于一个表空间。


用户是在表空间下建立的。用户登录只能看到和操作自己的表,ORACLE的用户与MySQL的数据库类似,每建立一个应用需要创建一个用户。

1.  -- 创建表空间
2.  create tablespace 表名称
3.  datafile '存储路径' size 100m
4.  autoextend on next 10m;
1.  -- 创建用户
2.  create user 用户名
3.  identified by 密码
4.  default tablespace 所归属的表空间名称;
二、Oracle数据类型

1.字符型

CHAR:固定长度字符类型,最多存储2000字节

VARCHAR2:可变长度的字符类型,最多存储4000字节

LONG:大文本类型,最多存储2个G

2.数值型

NUMBER:数值类型

3.日期型

DATE:日期时间型   TIMESTAMP:精确到秒小数点后9位

三、Oracle数据的导出与导入

当我们使用一个数据库时,总希望数据库内容可靠、正确。但由于计算机系统的故障影响数据库系统的操作,影响数据库中数据的正确性,甚至破坏数据库,使数据库全部或部分数据丢失。

四、Oracle数据查询

1、基于伪列的查询

在Oracle的表的使用过程中,实际表中还有一些附加的列,称为伪列。伪列就像表中的列一样,但是在表中并不存储。伪列只能查询,不能进行增删改操作。

ROWID

表中的每一行在数据文件中都有一个物理地址,ROWID伪列返回的就是该行的物理地址。使用ROWID可以快速的定位表中的某一行。ROWID值可以唯一的标识表中的一行。由于ROWID返回的是该行的物理地址,因此使用ROWID可以显示行是如何存储的。

查询语句:

select rowID,别名。* from 表名别名

也可以通过指定ROWID来查询记录

select rowID,t.* from T_AREA t where ROWID='AAAM1uAAGAAAAD8AAC';

ROWNUM

   在查询的结果集中,ROWNUM为结果集中每一行标识一个行号,第一行返回1,第二行返回2,以此内推。通过ROWNUM伪列可以限制查询结果集中返回的行数。

1.  select rownum,别名.* from 表名 别名
2.  -- 示例: select rownum,t.* from T_OWNERTYPE t where id>3

外连接

左外连接

1.  select
2.      t1.name,  
3.      t1.age, 
4.      t2.name  
5.  from
6.      表1 t1,
7.      表2 t2
8.  where 
9.      t1.表1字段 = t2.表2字段(+);

右外连接

在where条件的等号左端加(+)


2.单行函数

(1).字符函数

(2)数值函数

(3)日期函数



(4)转换函数

(5)其他函数


RANK:相同的值排名相同,排名跳跃

1.  select rank() over(order by 字段 desc ),字段,.... from 表名
2.  -- 示例: select rank() over(order by usenum desc ),usenum from T_ACCOUNT


DENSE_RANK:相同的值排名相同,排名连续

1.  select dence_rank() over(order by 字段 desc ),字段,.... from 表名
2.  -- 示例: select dence_rank() over(order by usenum desc ),usenum from T_ACCOUNT

ROW_NUMBER:返回连续的排名,无论值是否相等

1.  select row_number() over(order by 字段 desc ),字段,.... from 表名
2.  -- 示例: select row_number() over(order by usenum desc ),usenum from T_ACCOUNT
  1. 集合运算

集合运算就是将两个或者多个结果集组合成一个结果集。包括:

UNION ALL(并集):返回各个查询的所有记录,包括重复记录

1.  -- UNION ALL 并集(不去掉重复记录)
2.  select * from t_owners where id<=7 
3.  union 
4.  all select * from t_owners where id>=5

UNION(并集),返回各个查询的所有记录,不包括重复记录

1.  -- UNION 并集(去掉重复记录)
2.  select * from t_owners where id<=7 
3.  union 
4.  select * from t_owners where id>=5

INTERSECT(交集),返回两个查询共有的记录

1.  -- intersect 交集
2.  select * from t_owners where id<=7 
3.  intersect 
4.  select * from t_owners where id>=5

MINUS(差集),返回第一个查询检索出的记录减去第二个查询检索出的记录

1.  -- minus 差集
2.  select * from t_owners where id<=7
3.  minus 
4.  select * from t_owners where id>=5

五、Oracle的其他对象

物化视图


视图是一个虚拟表(也可以认为是一条语句),基于它创建时指定的查询语句返回的结果集。每次访问它都会导致这个查询语句被执行一次。为了避免每次访问都执行这个查询,可以将这个查询果集存储到一个物化视图(也叫实体化视图)。


       物化视图与普通的视图相比的区别是物化视图是建立的副本,它类似于一张表,需要占用存储空间。而对一个物化视图查询的执行效率与查询一个表是一样的。


创建物化视图的语法:

CREATE METERIALIZED VIEW view_name
[BUILD IMMEDIATE | BUILD DEFERRED ]
REFRESH [FAST|COMPLETE|FORCE] 
[ON [COMMIT |DEMAND ] | START WITH (start_time) NEXT(next_time)]
AS subquery

语句中各个参数的含义如下:


数据生成的时机


BUILD IMMEDIATE:是在创建物化视图的时候就生成数据。


BUILD DEFERRED:则在创建时不生成数据,以后根据需要再生成数据。


REFRESH(刷新的方式)指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。


FAST:刷新采用增量刷新,只刷新自上次刷新以后进行修改。


COMPLETE:刷新对整个物化视图进行完全的刷新,即先把原来的物化视图删掉,再自动使用创建物化视图语句重新创建物化视图。


FORCE: Oracle 在刷新时会去判断是否可以进行快速刷新,如果可以则采用 FAST 方式,否则采用 COMPLETE的方式。


刷新的模式有两种:ON DEMAND和ON COMMIT


ON DEMAND:指需要手动刷新物化视图


ON COMMIT:指在基表发生COMMIT操作时自动刷新


在采用FAST增量刷新前,需要先创建物化日志表,语法如下:


create materialized view log on 基表名称 with 标识;

标识:一般为基表的id,是增删改物化视图中数据的依据


创建完日志后,会生成一个物化日志表,记录相关信息;更新完物化视图后,日志表中的数据会被删除。

手动刷新物化视图的方法:

1.  begin
2.      DBMS_MVIEW.refresh('物化视图名称','C');  -- 系统内置的存储过程
3.  end;
1.  -- 方法二:在SQL命令窗口执行下列语句
2.  EXEC DBMS_MVIEW.refresh('物化视图名称','C');

若使用 BUILD DEFERRED 参数(创建物化视图时不生成数据),在第一次生成数据时需要手动刷新物化视图:

1.  begin
2.      DBMS_MVIEW.refresh('物化视图名称','C');
3.  end;

序列

序列是ORACLE提供的用于产生一系列唯一数字的、且独立于表的数据库对象。表示表,序列是序列,序列可以产生一系列唯一数字供表使用。

创建简单序列语法:

create sequence 序列名称

通过序列的伪列来访问序列的值

NEXTVAL返回序列的下一个值

CURRVAL返回序列的当前值

1.  -- 提取下一个值
2.  select 序列名称.nextval from dual
3.  -- 提取当前值
4.  select 序列名称.currval from dual

同义词

同义词简称外号,实质上是指定方案对象的一个别名。通过屏蔽对象的名称和所有者以及对分布式数据库的远程对象提供位置透明性,同义词可以提供一定程度的安全性。同时,同义词的易用性较好,降低了数据库用户的 SQL 语句复杂度。


同义词允许基对象重命名或者移动,这时,只需对同义词进行重定义,基于同义词的应用程序可以继续运行而无需修改。


创建同义词:

1.  create [public] SYNONYM 同义词名称 for object;
2.-- ,object 表示:表、视图、序列等我们要创建同义词的对象的名称

PL/SQL

PL/SQL是Oracle对sql语言的过程化扩展,指在SQL命令语言中增加了过程处理语句,使sql语言具有过程处理能力。把SQL语言的数据操作能力与过程语言的数据处理能力结合起来,使得PLSQL面向过程但比过程语言简单、高效和实用。

基本语法结构:

1.  [declare] --声明变量
2.  begin
3.   --代码逻辑 
4.  [exception] --异常处理
5.  end;

变量赋值的语法

-- 方法一:直接赋值
1.  变量名:=变量值;
2.  -- 方法二:Select into 方式赋值,结果必须是一条记录 ,有多条记录和没有记录都会报错
3.  select 列名 into 变量名 from 表名 where 条件;

存储函数

存储函数又称为自定义函数。可以接收一个或多个参数,返回一个结果。在函数中我们可以使用P/SQL进行逻辑的处理。

创建或修改存储函数的语法如下:

1.  CREATE [ OR REPLACE ] FUNCTION 函数名称(参数名称 参数类型, ...)
2.  RETURN 结果变量数据类型
3.  IS
4.       变量声明部分;
5.  BEGIN
6.       逻辑部分;
7.       RETURN 结果变量;
8.      [EXCEPTION 异常处理部分]
9.  END;

调用自定义函数:

select 函数名(参数...) from 表名;

存储过程

存储过程是被命名的PL/SQL块,存储于数据库中,是数据库对象的一种。应用程序可以调用存储过程,执行相应的逻辑。


存储过程与存储函数都可以封装一定的业务逻辑并返回结果,存在区别如下:


存储函数中有返回值,且必须返回;而存储过程没有返回值,可以通过传出参数返回多个值。

存储函数可以在select语句中直接使用,而存储过程不能。过程多数是被应用程序所调用。

存储函数一般都是封装一个查询结果,而存储过程一般都封装一段事务代码。

创建或修改存储过程的语法如下:

  CREATE [ OR REPLACE ] PROCEDURE 存储过程名称(参数名 in/out/inout 类型, ...)
1.  IS|AS
2.       变量声明部分;
3.  BEGIN
4.       逻辑部分
5.      [EXCEPTION 异常处理部分]
6.  END;

过程参数的三种模式:

IN 传入参数(默认)


OUT 传出参数,主要用于返回程序运行结果


IN OUT 传入传出参数


触发器

数据库触发器是一个与表相关联的、存储的PL/SQL程序。每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle自动地执行触发器中定义的语句序列。

触发器可用于


数据确认

实施复杂的安全性检查

做审计,跟踪表上所做的数据操作等

数据的备份和同步

触发器分类:


前置触发器  后置触发器

创建触发器的语句:

CREATE [or REPLACE] TRIGGER 触发器名
     BEFORE | AFTER
     [DELETE]  [[or] INSERT]  [[or]UPDATE [OF 列名]]
     ON 表名
     [FOR EACH ROW ][WHEN(条件) ]
declare
     ……
begin
     PLSQL 块
End ;

FOR EACH ROW作用是标注此触发器是行级触发器,即每影响一行数据就就会触发一次触发器。与之相对应的是语句级触发器,即每执行一条语句就会触发一次触发器。

在触发器中触发语句与伪记录变量的值:

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
SQL 关系型数据库 MySQL
彻底搞懂 MySQL 事务的隔离级别
MySQL的事务隔离级别一共有四个,分别是读未提交、读已提交、可重复读以及可串行化。
68058 12
彻底搞懂 MySQL 事务的隔离级别
|
NoSQL Redis UED
揭秘!Flask如何携手Celery,让异步任务处理不再是难题,打造极速响应的Web应用新纪元!
【8月更文挑战第31天】在Web开发中,Flask与Celery的结合为异步任务处理提供了强大支持。Flask作为轻量级Web框架,以其简洁灵活著称;而Celery则是一个分布式任务队列系统,擅长处理耗时任务。二者结合,Flask专注于处理Web请求,Celery则在后台异步执行复杂任务,如发送邮件或调用外部API。这种方式不仅提升了应用性能和响应速度,还优化了用户体验。下面的示例展示了如何在Flask应用中集成Celery以实现异步任务处理。
546 0
|
JSON 算法 Java
Hutool包常用工具类的使用
Hutool包常用工具类的使用
|
Arthas 运维 Kubernetes
nacos常见问题之2.2.4版本带密钥单机启动 -k不识别如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
217 3
|
监控 关系型数据库 分布式数据库
PolarDB 读写分离的最佳实践
【8月更文第27天】PolarDB 是阿里云推出的一款高度兼容 MySQL、PostgreSQL 和 Oracle 的云原生数据库服务。它支持读写分离,能够显著提高应用的性能和响应速度。本文将详细介绍如何在 PolarDB 中实施读写分离策略,并通过示例代码演示具体的配置步骤。
444 1
|
存储 数据管理 API
Docker技术概论(3):Docker 中的基本概念
Docker技术概论(3):Docker 中的基本概念
412 12
Mac每次都要执行source ~/.bash_profile配置的环境变量才生效
Mac每次都要执行source ~/.bash_profile配置的环境变量才生效
450 2
|
XML 数据格式
Flowable获取ProcessEngine的三种方式
Flowable获取ProcessEngine的三种方式
269 1
|
存储 机器学习/深度学习 人工智能
【LangChain系列】第八篇:文档问答简介及实践
【5月更文挑战第22天】本文探讨了如何使用大型语言模型(LLM)进行文档问答,通过结合LLM与外部数据源提高灵活性。 LangChain库被介绍为简化这一过程的工具,它涵盖了嵌入、向量存储和不同类型的检索问答链,如Stuff、Map-reduce、Refine和Map-rerank。文章通过示例展示了如何使用LLM从CSV文件中提取信息并以Markdown格式展示
614 2
|
安全 网络安全 数据安全/隐私保护
警惕Mallox勒索病毒的最新变种mallox,您需要知道的预防和恢复方法。
在这个数字时代,恶意软件不再是仅限于技术领域的威胁,而是每个人都可能面临的潜在风险。其中,.mallox勒索病毒崭露头角,它不仅能够以不可思议的方式加密您的数据,还能要求您支付赎金以获取解密密钥。本文将深入探讨.mallox勒索病毒,如何解锁被其加密的数据,以及我们应该如何未雨绸缪,以免受到未来威胁的影响
594 1
警惕Mallox勒索病毒的最新变种mallox,您需要知道的预防和恢复方法。