Products
GG网络技术分享 2025-03-18 16:14 4
应用场景是这样,我有一个接口需要前端传过来的字符串,值分别为 男,女,其他。只能是这三个值,不能有空格和其他特殊的字符串,现在需要一个正则表达式来进行验证,这个表达式应该怎么写?
^[男,女,其他]{1}$
枚举不香嘛
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串中是否含有符合该模式的子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
oracle中有个5个函数支持正则表达式,学习之前我们先看看一些最基本的匹配符,又称之为:元字符
值 | 描述 | 输入方式 |
^ | 匹配某类子串的开始。 | shift键+数字6 |
$ | 匹配字符串的结尾。 | shift键+数字4 |
* | 匹配零个或多个。 | shift键+数字8 |
+ | 匹配一个或多个出现。 | |
? | 匹配零次或一次出现。 | |
. | 匹配任何字符,除了空。 '' | |
| | 用“OR”来指定多个选项。 | |
[] | 用于指定一个匹配列表,您尝试匹配列表中的任何一个字符。 | |
[^] | 用于指定一个不匹配的列表,您尝试匹配除列表中的字符以外的任何字符。 |
例如:
模式运算符 | 匹配规则 | 描述的字符窜 | 备注 |
xy? | 匹配x或者xy | x, xy | ?此处表示匹配0个或者1个y |
x|y | 匹配x或者y | x, y | | 是或者的意思 |
x* | 匹配0个或者任意多个x | '' ,x,xx,xxx... | |
x+ | 匹配1个或者任意多个x | x,xx,xxx... | |
‘\\w’ | 匹配数字,字母或者下划线 | ||
\\. | 匹配一个点号 | . | 因为点号”.”是特殊符号,所以需要使用转移符\\ 转义为普通字符 |
..
名称:regexp_substr(p1 , pattern , start_position , target_position)
功能:截取字符窜中满足模式的子窜
参数: p1: 目标字符窜, pattern: 匹配模式, start_position : 正整数,从第几个满足条件的子窜开始截取 ,target_position : 返回第几个满足条件的子窜
返回值: 字符窜
数据准备:
CREATE TABLE REG_EXP_TEST(ID VARCHAR2(50)); |
INSERT INTO REG_EXP_TEST (ID)VALUES('GGG5454 45HHH46,454?4545FDSFD@#@#@!#GHG');INSERT INTO REG_EXP_TEST (ID)VALUES('Joe Smith, 10045 Berry Lane, San Joseph, CA 91234');INSERT INTO REG_EXP_TEST (ID)VALUES('Joe Smith');INSERT INTO REG_EXP_TEST (ID)VALUES('10045 91234');INSERT INTO REG_EXP_TEST (ID)VALUES('15888 646455');INSERT INTO REG_EXP_TEST (ID)VALUES('asdfasdf fgfgfgfgf');COMMIT; |
例题:查询REG_EXP_TEST 表中ID列中的第3次出现的数字组( 相邻的数字看成一组)
SELECT REGEXP_SUBSTR(R.ID,'[0-9]+',1,3)FROM REG_EXP_TEST R; |
例题:查询REG_EXP_TEST 表中ID列中的第3次出现的字母组( 相邻的字母看成一组)
模式: [a-zA-Z]
SELECT R.ID, REGEXP_SUBSTR(R.ID,'[a-zA-Z]+',1,3)FROM REG_EXP_TEST R; |
课堂练习:查询REG_EXP_TEST 表中ID列中的第3次出现的字母数字组( 相邻的字母数字看成一组)
模式: [a-zA-Z]
SELECT R.ID, REGEXP_SUBSTR(R.ID,'[a-zA-Z0-9]+',1,3)FROM REG_EXP_TEST R; |
名称:regexp_instr(p1 , pattern , start_position , target_position)
功能:这个函数返回一个模式的起始位置,因此它的功能非常类似于 INSTR 函数。新的 REGEXP_INSTR 函数的语法在表 6 中给出。这两个函数之间的主要区别是,REGEXP_INSTR 让您指定一种模式,而不是一个特定的搜索字符串
参数: p1: 目标字符窜, pattern: 匹配模式, start_position : 正整数,从第几个满足条件的子窜开始搜索 ,target_position : 返回第几个满足条件的子窜的位置
末尾五位数字91234,首字母9的位置是7
末尾的五位数是46455,首字母4的位置是8
返回值: 整数
例题:查询REG_EXP_TEST 表中ID列中出现在字符窜末尾的5位数字(有一串字符串必须是五位数字结尾, 超过五位也可以,四位就不行)
‘[[:alpha:]]’统计字符的个数 ‘[[:digit:]]’统计数字的个数
SELECT R.ID, REGEXP_INSTR(R.ID,'[[:digit:]]{5}$',1,1)as digiFROM REG_EXP_TEST RSELECT R.ID, REGEXP_INSTR(R.ID,'[0-9]{5}$',1,1)as digiFROM REG_EXP_TEST R |
名称:regexp_like(p1 , pattern )
功能: 判断某个字符窜中是否包括特定模式的子窜, 有则返回true ,否则flase
参数: p1: 目标字符窜, pattern: 匹配模式
返回值: 布尔值
例题:查询REG_EXP_TEST 表中ID列中包括5位数字的记录
SELECT R.ID ,REGEXP_SUBSTR(R.ID,'[[:digit:]]{5}')FROM REG_EXP_TEST R WHERE REGEXP_LIKE(R.ID,'[[:digit:]]{5}')SELECT R.ID ,REGEXP_SUBSTR(R.ID,'[0-9]{5}')FROM REG_EXP_TEST R WHERE REGEXP_LIKE(R.ID,'[0-9]{5}'); |
名称:regexp_count(p1 , pattern )
功能: 统计某个字符窜中包括特定模式的子窜的个数
参数: p1: 目标字符窜, pattern: 匹配模式
返回值: 0或者正整数
Chr(10)换行符
例题:查询REG_EXP_TEST 表中ID列中包括5位数字的个数
SELECT R.ID ,REGEXP_COUNT(R.ID,'[[:digit:]]{5}')FROM REG_EXP_TEST R |
名称:regexp_count(p1 , pattern , target_str )
功能: 将字符窜中的满足模式的子窜替换为目标字符窜
参数: p1: 目标字符窜, pattern: 匹配模式 ,target_str : 目标字符窜
返回值: 字符窜
例题:将 'Joe Smith'中间的多个空格替换为1个空格
SELECT REPLACE('Joe Smith',' ')AS replace FROM dual—将空格替换掉 |
SELECT REGEXP_REPLACE('Joe Smith',' +',' ')ASreplaceFROM dual |
递归查询,又称为级联查询,是指访问某个对象时,按照特定的路线返回数据的过程
递归查询的表通常存在树形结构( 类似于父子关系), 这种表通常有一个 子id , 一个父id
id | parent_id |
例如:
或者:
再者:
员工表就是一张存储有树形关系的表
其中 empno 相当于 子
mgr 相当于父
查询基本结构:
select … from table_name
start with 条件1
connect by 条件2
例题: 查询员工SMITH 以及所有的领导
SELECT E.*FROM EMP ESTART WITH E.ENAME ='SMITH'CONNECT BY EMPNO = PRIOR E.MGR; |
start with指定树的根(即父节点)实际上你还可以指定多个根的,比如 E.ENAME in ('爷爷', '爸爸')
而connect by prior EMPNO =PRIOR E.MGR相当于表名在递归的过程中,查找到的树中其它节点接着又作为根结点。然后继续递归(prior在的一侧表示该侧为子节点)
为了便于理解可以可以connect by prior那一行当作多余的,只记住要查询的列名放前面,根列名放等号后面就行,这样只要指定树的根结点就比较好理解了。
可以这么理解, 将smith 看成根, 并且下一条记录的工号是上一条记录的领导,相当于从 儿子 找爸爸
如果返回来, 将PRIOR 放在 empno 前面, 那么同样以smith 为根 ,但是方向是往下找下属,相当于 从爸爸找儿子
自己领会一下, 不做重点要求
我们还可以通过伪列 LEVEL查看树形结构的深度
SELECT level,E.*FROM EMP ESTART WITH E.ENAME ='SMITH'CONNECT BY EMPNO =PRIOR E.MGR; |
A | B | |||
ID | Sum | ID | Amount | |
1 | 55 | 1 | 100 | |
2 | 66 | 1 | 200 | |
3 | 44 | 1 | 320 | |
4 | 88 | 2 | 230 | |
5 | 55 | 4 | 246 | |
6 | 22 | 5 | 212 | |
7 | 500 | 8 | 55 |
Create table AAA(id number,sum number);
Insert into AAA values(1,55);
Insert into AAA values(2,66);
Insert into AAA values(3,44);
Insert into AAA values(4,88);
Insert into AAA values(5,55);
Insert into AAA values(6,22);
Insert into AAA values(7,500);
Create table BBB(id number,amount number);
Insert into BBB values(1,100);
Insert into BBB values(1,200);
Insert into BBB values(1,320);
Insert into BBB values(2,230);
Insert into BBB values(4,246);
Insert into BBB values(5,212);
Insert into BBB values(8,55);
方法一:Update AAA set AAA.sum=(select sum(BBB.amount) from BBB where AAA.id =BBB.id group by BBB.id) Where exists (select 1 from BBB where BBB.ID = AAA.ID);---一定要加上Where exists (select 1 from BBB where BBB.ID = AAA.ID)否则结果为:B表中不存在的ID在A表中存在,那sum就会变为空
正确答案:
方法二:
select a.id,nvl(bb.sumamount,a.sum) as sum from AAA a
left join
(select b.id,sum(b.amount) as sumamount from BBB b group by b.id) bb
On a.id = bb.id
方法三:
Merge into AAA a
Using (select b.id,sum(b.amount) as sumamount from BBB b group by b.id) bb
On (a.id = bb.id)
When matched then
Update set a.sum =bb.sumamount;
表A和表B是用ID来关联 ,ID是A的主键,B的外键,请把B中的Amount按ID加起来,然后放到A的Sum字段中.
MERGE INTO A
USING (SELECT B.ID , SUM(B.AMOUNT) AS SUM_B FROM B GROUP BY B.ID) S
ON (A.ID = S.ID )
WHEN MATCHED THEN UPDATE SET --UPDATE和SET之间不需要加表名
A.SUM = S.SUM_B
UPDATE
方法一:Update A set A.sum = (select sum(B.Amount) from B where A.ID =B.ID group by B.ID)Where exists (select 1 from B where B.ID = A.ID);方法二:Select A.ID,nvl(s. amountsum,A.sum) from ALeft join(Select B.ID,sum(B.Amount) as amountsum from B group by B.ID) sOn A.ID =s.ID |
使用外关联获取数据后,再将数据写回到目标表 ( ORACLE一般不这么做,但是后面的教学工具会用到
dml命令( update, delete , insert)
语法格式:MERGE(不是所有数据库都通用)
MERGE INTO 目标表USING (增量)ON (匹配字段)WHEN MATCHED THEN UPDATE SET --UPDATE和SET之间不需要加表名WHEN NOT MATCHED THEN INSERT VALUES--INSERT和VALUES之间不需要加INTO 表名 |
SELECT * FROM BBB;
MERGE INTO AAA A
USING (SELECT B.ID,SUM(B.AMOUNT) AS SUMAMOUNT FROM BBB B GROUP BY B.ID) BB
ON (A.ID=BB.ID)
WHEN MATCHED THEN
UPDATE SET A.SUM = BB.SUMAMOUNT
WHEN NOT MATCHED THEN
INSERT
(A.ID,A.SUM)
VALUES
(BB.ID,BB.SUMAMOUNT);
数据库的逻辑存储空间,本质上上一系列文件的集合,为了便于管理,我们给这一系列文件进行了分类,即: 表空间
表空间只是逻辑上的概念,是物理上的1个或多个数据文件的统称.
表空间是oracle引入的概念,别的数据库有其他的划分标准.
CREATE OR REPLACE VIEW EMPGRA
AS
SELECT E.ENAME,E.SAL,D.DNAME,S.GRADE FROM EMP E,DEPT D,SALGRADE S
WHERE E.DEPTNO = D.DEPTNO
AND E.SAL>=S.LOSAL AND E.SAL <=S.HISAL
WITH READ ONLY
表是数据的集合,数据是保存在一个或者多个文件中的,所以表空间可以包含一系列表
oracle中所有的数据库对象都存放在指定的表空间中,但主要存放的是表,所以称作表空间。
表可以对应一个文件,也可能对应多个文件,不同的文件可以属于不同的表空间,一个数据文件只能属于一个表空间,表空间统一管理空间中的数据文件,。一个数据库空间由若干个表空间组成。如图所示:
从逻辑上来看.
数据库是由一个或者多个表空间等组成。
一个表空间(tablespace)由一组段组成,
一个段(segment)由一组区组成,
一个区(extent)由一批数据库块组成,
一个数据库块(block)对应一个或多个物理块(操作系统的块)
如图:
--Database(数据库)
数据库是按照数据结构来组织、存储和管理数据的仓库。
--Tablespaces(表空间)
表空间是数据库的逻辑划分,一个表空间只能属于一个数据库。表空间(tablespace)是最大的逻辑单位,对应一个或多个数据文件,通常由相关的段组成。表空间的大小是它所对应的数据文件大小的总和。所有的数据库对象都存放在指定的表空间中。但主要存放的对象是表, 所以称作表空间。
--Segments (段):
一个段是分配给一个逻辑结构(一个表、一个索引或其他对象)的
和高速缓存段等。Types of segments (段的类型详解)
--extents (盘区)个
是数据库存储空间分配的一个逻辑单位,它由连续数据块所组成。第一个段是由一或多个盘区组成。当一段中间所有空间已完全使用,oracle为该段分配一个新的范围。
--Data Block (数据块)
是oralce 管理数据文件中存储空间的单位,为数据库使用的I/O的最小单位,最小的逻辑部件,其大小可不同于操作系统的标准I/O块大小。数据块的大小由DB_BLOCK_SIZE参数确定。块尺寸是处理Oracle更新、选择、或者插入数据事务的最小单位。当用户从表中选择数据时,选择操作从数据库文件中以块为单位读取或者提取数据。例如Oracle块的大小为8kb,即使只想检索4kb的字符的名字,也必须读取含有这4个字符的整个8kb的块。
1.查看表空间
SELECT T.* FROM USER_TABLESPACES T |
user_tablespaces(普通用户查看的数据字典)
SELECT S.*FROM USER_SEGMENTS S WHERE S.SEGMENT_NAME =' SYSTEM '; |
大部分情况下,一个表对应一个段, 分区表例外,分区表的每个表分区分别对应一个段,后面会介绍分区表. 通常段名称与其对应的表名是一样的
我们还可以通过数据字典: USER_EXTENTS查看区,这里知道有这回事就行了, 之所以强调出来,是为了让大家有更深的印象: oracle中所有的信息(元数据)都可以在数据字典找到
3.oracle查看数据库块大小(返回的单位是字节: byte),
在命令窗口中执行:show parameter db_block_size; |
Oracle物理存储结构组成:
数据文件(data file)、 联机日志文件(online redo log file)、 控制文件(control file) 归档日志文件、参数文件、警报文件、跟踪文件、备份文件 |
真正存放数据库数据的.数据库的对象(表和索引)物理上是被存放在数据文件中的。当我们要查询一个表的数据的时候,如果该表的数据没有在内存中,那么oracle就要读取该表所在的数据文件,然后把数据存放到内存中.数据文件的特征是:
1.一个数据文件只能属于一个数据库.
2.数据文件可以被设置成自动增长.
3.一个或多个数据文件组成了表空间.
4.一个数据文件只能属于一个表空间.
一个数据库至少要有一个控制文件,控制文件中存放的数据库的"物理结构信息",例如:数据库的名字,数据文件和联机日志文件的名字及位置等等
在启动数据库的时候,oracle就会根据控制文件中的数据文件和联机日志文件的信息来打开数据库.
联机日志文件包含了重做记录(undo records).联机日志文件记录了数据库的改变,比如,一次系统的意外掉电,导致内存中的数据没有被写到数据文件中.那么oralce就会根据联机日志文件中的重做记录功能将数据库恢复到失败前的状态.
正常情况下,数据所有的操作都会记录到重做日志文件中
是联机日志文件的副本和历史,他记录了对数据库改变的历史.
上述,了解即可
就是在数据库发生介质损坏的时候用来还原(restore)数据库的,恢复(recover)数据的.
Oracle中所有的数据(包括系统数据),全部保存在表空间中,常见的表空间有:
注意,我们在创建表的时候,如果没有指定表空间,那么默认表空间为: USER, 在实际工作中,每个项目基本都会创建属于自身的表空间用来与别的项目的数据进行隔离,具体需要实际工作中去确认.
Oracle 数据库对象(object)
数据库对象是数据库的组成部分,常常用CREATE命令进行创建,可以使用ALTER命令修改,用DROP执行删除操作。前面已经接触过的数据库对象有表、用户等。 今天将学习更多的Oracle数据库对象:
同义词:就是给数据库对象一个别名。
序列:Oracle中实现增长的对象。
视图:预定义的查询,作为表一样的查询使用,是一张虚拟表。
索引:对数据库表中的某些列进行排序,便于提高查询效率。
SELECT A.*FROM ALL_OBJECTS A WHERE A.OWNER ='SCOTT'; |
OBJECTS
同义词(Synonym)是数据库对象的一个别名,Oracle可以为表、视图、序列、过程、函数、程序包等指定一个别名。同义词有两种类型:
同义词是指数据库对象(表、视图、序列、存储过程等数据库对象)用另一个名字来引用。比如:
建立一个同义词可以排除一个对象名字的限制.
如果跨用户访问数据库对象,需要在对象名称前面加上模式名,如果创建了同义词,那么直接访问同义词就可以了.
注意:除了创建对象的时候需要指定schema ,在开发的代码中一般是禁止指定schema的,这样是为了维护程序更好的可移植性, 工作中一般会对每一个对象创建同义词,通过同义词访问对象
同义词可以与表名相同,也可以有差异,为了便于理解,一般尽量与表名保持一致
创建同义词的语法是:
语法结构:创建同义词
CREATE [OR REPLACE] [PUBLIC] SYNONYM [schema.]synonym_name FOR [schema.]object_name |
语法解析:
如果一个用户有权限访问其他用户对象时,就可以使用全称来访问。比如:
代码演示:System用户访问Scott用户的Emp表
SELECT ENAME,JOB,SAL FROM SCOTT.EMP WHERE SAL>2000; |
代码解析:
删除同义词使用的语法是:
语法结构:删除同义词
DROP [PUBLIC] SYNONYM [schema.]sysnonym_name |
语法解析:
此命令只能删除同义词,不能删除同义词下的源对象。
Select *from ALL_OBJECTS sWHERE S.OBJECT_TYPE ='SYNONYM'AND S.OBJECT_NAME ='EMP' |
课堂练习:
数据准备:
-- 使用管理员用户连接数据库,创建一个新用户CREATE USER bangzhu IDENTIFIED BY 123;--新建用户 设置密码ALTER USER bangzhu ACCOUNT UNLOCK;--解锁GRANT CONNECT,RESOURCE TO bangzhu ;--将相关角色赋予给用户 |
使用管理员用户,将表新建在新用户名下
CREATE TABLE bangzhu.EMP AS SELECT E.*FROM EMP E; |
现在使用scott登录数据库,执行下列查询
SELECT E.* FROM bangzhu.EMP E ; |
注意:
刚创建的用户是没有任何权限的,包括登录数据库;
角色是一些列权限的集合,connect 包括了连接数据库的权限,resource包括创建表等数据库对象的权限
查看当前用户拥有的权限
Select *from session_privs; |
其余的权限也可以通过数据字典查询,这里不列举,知道有这回事即可
序列(Sequence)是用来生成连续的整数数据的对象。序列常常用来作为主键中增长列,序列中的可以升序生成,也可以降序生成。可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字)。其主要的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值。创建序列需要CREATE SEQUENCE系统权限。序列的创建语法如下:
语法结构:创建序列
CREATE SEQUENCE sequence_name[START WITH num][INCREMENT BY increment][MAXVALUE num|NOMAXVALUE][MINVALUE num|NOMINVALUE][CYCLE|NOCYCLE][CACHE num|NO CACHE] |
语法解析:
【例】创建一个从1开始,默认最大值,每次增长1的序列,要求NOCYCLE,缓存中有30个预先分配好的序列号。
代码演示:生成序列号
CREATE SEQUENCE MYSEQMINVALUE 1START WITH 1NOMAXVALUEINCREMENT BY 1NOCYCLECACHE 30; |
序列创建之后,可以通过序列对象的CURRVAL和NEXTVAL两个“伪列”分别访问该序列的当前值和下一个值。
代码演示:序列使用
--访问下一个值SELECT MYSEQ.NEXTVAL FROM DUAL;--访问当前值SELECT MYSEQ.CURRVAL FROM DUAL; |
使用ALTER SEQUENCE可以修改序列,在修改序列时有如下限制:
使用DROP SEQUENCE命令可以删除一个序列对象。
代码演示:序列修改和删除
--序列修改ALTERSEQUENCE MYSEQMAXVALUE10000MINVALUE-300--删除序列DROPSEQUENCE MYSEQ; |
注意:序列作为一个对象,与表一样,也需要给相关用户赋予权限, 也可以给序列创建同义词
grantselecton scott.myseq to用户名; |
视图(View)实际上是一张或者多张表上的预定义查询,这些表称为基表。从视图中查询信息与从表中查询信息的方法完全相同。只需要简单的SELECT…FROM即可。
视图中的基表也可以是其他视图(只要能够直接或者间接提供数据即可)
视图具有以下优点:
语法结构:创建视图
CREATE [OR REPLACE] [{FORCE|NOFORCE}] VIEW view_nameASSELECT查询[WITH READ ONLY CONSTRAINT] |
语法解析:
【例】基于EMP表和DEPT表创建视图
代码演示:视图
--创建视图CREATE OR REPLACE VIEW EMPDETAILASSELECT EMPNO,ENAME,JOB,HIREDATE,EMP.DEPTNO,DNAMEFROM EMP JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNOWITH READO NLY--通过视图查询SELECT *FROM EMPDETAIL;--查看普通视图语法select * from all_views |
代码解析:
语法结构:删除视图
DROP VIEW 视图名 |
注意:
grant create view to scott;
2.可将视图权限授予特定用户,而无需授予这些用户对基表 (视图引用的物理表) 的访问权限
Create view scott.test_1 as
select e.*from emp e, dept d where e.deptno = d.deptno ;
grant selecton test_1 to scott;
切换到chaosehng, 访问视图;
chaoseng : select * from scott.dept; -- 是否能够返回结果?
3.可以通过单表视图 增删改 表的数据,但是这种方式绝大部分情况下是不被允许的,大家了解下即可;
视图给我们查询数据提供了一扇窗, 但是这扇窗开多大,我们是可以设置的
课堂练习: 查询销售部门的员工姓名,工资,部门名称和工资等级,并且将这段查询以视图的形式保存在数据库中
1. GRANT CREATE VIEW TO SCOTT;2. CREATE OR REPLACE VIEW EMPGRA AS SELECT E.ENAME,E.SAL,D.DNAME,S.GRADE FROM EMP E,DEPT D,SALGRADE SWHERE E.DEPTNO = D.DEPTNOAND E.SAL>=S.LOSAL AND E.SAL <=S.HISALWITH READ ONLY 3. SELECT * FROM EMPGRA; |
课堂练习: 使用新用户访问这张视图,有什么不方便的地方? 你需要做什么
如果这张视图表很大 访问就很慢 |
物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表,应用的局限性大,任何对视图的查询,oracle都实际上转换为视图SQL语句的查询。这样对整体查询性能的提高,并没有实质上的好处。
物化视图会将查询的数据落地为文件,不需要临时去查询,性能相对于普通视图会有提升
权限准备:
grant create materialized view to user_name; |
CREATE MATERIALIZED VIEW an_user_base_file_no_charge REFRESH COMPLETE START WITH SYSDATE NEXT TRUNC(SYSDATE+29)+5.5/24 AS 查询语句; |
NEXT TRUNC(SYSDATE+29)+5.5/24 : 如果系统日期+29天还是当月,那么,当天的凌晨05:30刷新,如果系统日期+29天是下个月, 那么下个月月初的05:30刷新
也可以每十秒刷新一次,根据实际需求设计
COMPLETE : 刷新物化视图前,先 执行truncate ( 表示全量更新)
我们也可以选择增量刷新,不过有一些限制,再者BI工作中用的不多,所以不再讲解
create materialized view V_AB refresh force on commit as select * from a,b where a.id=b.id |
--查看物化视图
SELECT *
FROM user_mviews
上面的语法表示,按照事务刷新,只要基表存在任何事务操作(通常: 增删改) ,那么下游的物化视图会自动刷新
物化视图与普通视图最大的区别在于,物化视图会将查询的数据保存在文件,能够节约临时查询时的时间成本,
Demand feedback