其他教程

其他教程

Products

当前位置:首页 > 其他教程 >

需要一个正则表达式,用来限定前端提交的值只能是特定的字符串 如‘男’,‘女’,‘其他’

GG网络技术分享 2025-03-18 16:14 4


问题描述:

应用场景是这样,我有一个接口需要前端传过来的字符串,值分别为 男,女,其他。只能是这三个值,不能有空格和其他特殊的字符串,现在需要一个正则表达式来进行验证,这个表达式应该怎么写?

网友观点:

^[男,女,其他]{1}$

枚举不香嘛

正则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串中是否含有符合该模式的子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。


oracle中有个5个函数支持正则表达式,学习之前我们先看看一些最基本的匹配符,又称之为:元字符

描述输入方式
^匹配某类子串的开始。shift键+数字6
$匹配字符串的结尾。shift键+数字4
*匹配零个或多个。shift键+数字8
+匹配一个或多个出现。
匹配零次或一次出现。
.匹配任何字符,除了空。 ''
|用“OR”来指定多个选项。
[]用于指定一个匹配列表,您尝试匹配列表中的任何一个字符。
[^]用于指定一个不匹配的列表,您尝试匹配除列表中的字符以外的任何字符。


例如:


模式运算符匹配规则描述的字符窜备注
xy?匹配x或者xyx, xy?此处表示匹配0个或者1个y
x|y匹配x或者yx, y| 是或者的意思
x*匹配0个或者任意多个x'' ,x,xx,xxx...
x+匹配1个或者任意多个xx,xx,xxx...
‘\\w’匹配数字,字母或者下划线
\\.匹配一个点号.因为点号”.”是特殊符号,所以需要使用转移符\\ 转义为普通字符

..


1.1 regexp_substr

名称: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;



1.2 regexp_instr

名称: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




1.3 regexp_like

名称: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}');



1.4 regexp_count

名称: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




1.5 regexp_replace

名称: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



idparent_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;






更新数据的几种方式--掌握


  1. 数据更新,被更新的表是A,而数据来自B表
AB
IDSumIDAmount
1551100
2661200
3441320
4882230
5554246
6225212
7500855

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一般不这么做,但是后面的教学工具会用到




MERGE命令--掌握

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.1表空间(TABLESPACE):

数据库的逻辑存储空间,本质上上一系列文件的集合,为了便于管理,我们给这一系列文件进行了分类,即: 表空间

表空间只是逻辑上的概念,是物理上的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

    1. 7 ;


    表是数据的集合,数据是保存在一个或者多个文件中的,所以表空间可以包含一系列表

    oracle中所有的数据库对象都存放在指定的表空间中,但主要存放的是表,所以称作表空间。

    表可以对应一个文件,也可能对应多个文件,不同的文件可以属于不同的表空间,一个数据文件只能属于一个表空间,表空间统一管理空间中的数据文件,。一个数据库空间由若干个表空间组成。如图所示:







    1.3 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.4 相关查看命令--了解即可

    1.查看表空间

    SELECT T.* FROM USER_TABLESPACES T


    user_tablespaces(普通用户查看的数据字典)


    1. 查看某张表所属的段
    SELECT S.*FROM USER_SEGMENTS S WHERE S.SEGMENT_NAME =' SYSTEM ';


    大部分情况下,一个表对应一个段, 分区表例外,分区表的每个表分区分别对应一个段,后面会介绍分区表. 通常段名称与其对应的表名是一样的


    我们还可以通过数据字典: USER_EXTENTS查看区,这里知道有这回事就行了, 之所以强调出来,是为了让大家有更深的印象: oracle中所有的信息(元数据)都可以在数据字典找到


    3.oracle查看数据库块大小(返回的单位是字节: byte),

    在命令窗口中执行:show parameter db_block_size;



    1.5 oracle物理存储结构--了解

    Oracle物理存储结构组成:

    数据文件(data file)、 联机日志文件(online redo log file)、 控制文件(control file) 归档日志文件、参数文件、警报文件、跟踪文件、备份文件









    1.3.1数据文件(data file)

    真正存放数据库数据的.数据库的对象(表和索引)物理上是被存放在数据文件中的。当我们要查询一个表的数据的时候,如果该表的数据没有在内存中,那么oracle就要读取该表所在的数据文件,然后把数据存放到内存中.数据文件的特征是:

    1.一个数据文件只能属于一个数据库.

    2.数据文件可以被设置成自动增长.

    3.一个或多个数据文件组成了表空间.

    4.一个数据文件只能属于一个表空间.


    1.3.2控制文件(control file):

    一个数据库至少要有一个控制文件,控制文件中存放的数据库的"物理结构信息",例如:数据库的名字,数据文件和联机日志文件的名字及位置等等

    在启动数据库的时候,oracle就会根据控制文件中的数据文件和联机日志文件的信息来打开数据库.



    1.3.3联机日志文件(online redo log file):

    联机日志文件包含了重做记录(undo records).联机日志文件记录了数据库的改变,比如,一次系统的意外掉电,导致内存中的数据没有被写到数据文件中.那么oralce就会根据联机日志文件中的重做记录功能将数据库恢复到失败前的状态.

    正常情况下,数据所有的操作都会记录到重做日志文件中



    1.3.4归档日志文件(Archive log file):

    是联机日志文件的副本和历史,他记录了对数据库改变的历史.


    上述,了解即可

    1.3.5备份文件(backup file):


    就是在数据库发生介质损坏的时候用来还原(restore)数据库的,恢复(recover)数据的.








    1.6 常见表空间

    Oracle中所有的数据(包括系统数据),全部保存在表空间中,常见的表空间有:

    • 系统表空间:存放系统数据,系统表空间在数据库创建时创建。表空间名称为SYSTEM。存放数据字典和视图以及数据库结构等重要系统数据信息,在运行时如果SYSTEM空间不足,对数据库影响会比较大,虽然在系统运行过程中可以通过命令扩充空间,但还是会影响数据库的性能,因此有必要在创建数据库时适当的把数据文件设置大一些。
    • TMEP表空间:临时表空间,安装数据库时创建,可以在运行时通过命令增大临时表空间。临时表空间的重要作用是数据排序。比如当用户执行了诸如Order by等命令后,服务器需要对所选取数据进行排序,如果数据很大,内存的排序区可能装不下太大数据,就需要把一些中间的排序结果写在硬盘的临时表空间中。
    • 用户表自定义空间:用户可以通过CREATE TABLESPACE命令创建表空间。



    注意,我们在创建表的时候,如果没有指定表空间,那么默认表空间为: USER, 在实际工作中,每个项目基本都会创建属于自身的表空间用来与别的项目的数据进行隔离,具体需要实际工作中去确认.


    1.7 建表时指定表空间








    2.数据库对象


    Oracle 数据库对象(object)


      数据库对象是数据库的组成部分,常常用CREATE命令进行创建,可以使用ALTER命令修改,用DROP执行删除操作。前面已经接触过的数据库对象有表、用户等。 今天将学习更多的Oracle数据库对象:


      同义词:就是给数据库对象一个别名。

      序列:Oracle中实现增长的对象。

      视图:预定义的查询,作为表一样的查询使用,是一张虚拟表。

      索引:对数据库表中的某些列进行排序,便于提高查询效率。


    2.1 查看数据库对象


    SELECT A.*FROM ALL_OBJECTS A WHERE A.OWNER ='SCOTT';


    OBJECTS



    2.2 同义词

    2.2.1 定义

    同义词(Synonym)是数据库对象的一个别名,Oracle可以为表、视图、序列、过程、函数、程序包等指定一个别名。同义词有两种类型:

    • 私有同义词:拥有CREATE SYNONYM权限的用户(包括非管理员用户)即可创建私有同义词,创建的私有同义词只能由当前用户使用。
    • 公有同义词:系统管理员可以创建公有同义词,公有同义词可以被所有用户访问。


    同义词是指数据库对象(表、视图、序列、存储过程等数据库对象)用另一个名字来引用。比如:

    建立一个同义词可以排除一个对象名字的限制.

    如果跨用户访问数据库对象,需要在对象名称前面加上模式名,如果创建了同义词,那么直接访问同义词就可以了.


    注意:除了创建对象的时候需要指定schema ,在开发的代码中一般是禁止指定schema的,这样是为了维护程序更好的可移植性, 工作中一般会对每一个对象创建同义词,通过同义词访问对象


    同义词可以与表名相同,也可以有差异,为了便于理解,一般尽量与表名保持一致


    2.2.2 语法


    创建同义词的语法是:

    语法结构:创建同义词

    CREATE [OR REPLACE] [PUBLIC] SYNONYM [schema.]synonym_name FOR [schema.]object_name

    语法解析:

    1. CREATE [OR REPLACE:]表示在创建同义词时,如果该同义词已经存在,那么就用新创建的同义词代替旧同义词。
    2. PULBIC:创建公有同义词时使用的关键字,一般情况下不需要创建公有同义词。
    3. Oracle中一个用户可以创建表、视图等多种数据库对象,一个用户和该用户下的所有数据库对象的集合称为Schema(中文称为模式或者方案),用户名就是Schema名。一个数据库对象的全称是:用户名.对象名,即schema.object_name。


    如果一个用户有权限访问其他用户对象时,就可以使用全称来访问。比如:


    代码演示:System用户访问Scott用户的Emp表

    SELECT ENAME,JOB,SAL FROM SCOTT.EMP WHERE SAL>2000;

    代码解析:

    1. 管理员用户可以访问任何用户的数据库对象,SYSTEM用户访问SCOTT用户的EMP表时,必须使用SCOTT.EMP。

    删除同义词使用的语法是:


    语法结构:删除同义词

    DROP [PUBLIC] SYNONYM [schema.]sysnonym_name

    语法解析:

    1. PUBLIC:删除公共同义词。
    2. 同义词的删除只能被拥有同义词对象的用户或者管理员删除。

    此命令只能删除同义词,不能删除同义词下的源对象。


    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;



    其余的权限也可以通过数据字典查询,这里不列举,知道有这回事即可



    2.3 序列


    序列(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. START WITH:从某一个整数开始,升序默认值是1,降序默认值是-1。
    2. INCREMENT BY:增长数。如果是正数则升序生成,如果是负数则降序生成。升序默认值是1,降序默认值是-1。
    3. MAXVALUE:指最大值。
    4. NOMAXVALUE:这是最大值的默认选项,升序的最大值是:1027,降序默认值是-1。
    5. MINVALUE:指最小值。
    6. NOMINVALUE:这是默认值选项,升序默认值是1,降序默认值是-1026。
    7. CYCLE:表示如果升序达到最大值后,从最小值重新开始;如果是降序序列,达到最小值后,从最大值重新开始。
    8. NOCYCLE:表示不重新开始,序列升序达到最大值、降序达到最小值后就报错。默认NOCYCLE。
    9. CACHE:使用CACHE选项时,该序列会根据序列规则预生成一组序列号。保留在内存中,当使用下一个序列号时,可以更快的响应。当内存中的序列号用完时,系统再生成一组新的序列号,并保存在缓存中,这样可以提高生成序列号的效率。Oracle默认会生产20个序列号。
    10. NOCACHE:不预先在内存中生成序列号。


    【例】创建一个从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可以修改序列,在修改序列时有如下限制:

    1. 不能修改序列的初始值。
    2. 最小值不能大于当前值。
    3. 最大值不能小于当前值。


    使用DROP SEQUENCE命令可以删除一个序列对象。


    代码演示:序列修改和删除

    --序列修改ALTERSEQUENCE MYSEQMAXVALUE10000MINVALUE-300--删除序列DROPSEQUENCE MYSEQ;



    注意:序列作为一个对象,与表一样,也需要给相关用户赋予权限, 也可以给序列创建同义词


    grantselecton scott.myseq to用户名;




    2.4 视图


    2.4.1 普通视图

    视图(View)实际上是一张或者多张表上的预定义查询,这些表称为基表。从视图中查询信息与从表中查询信息的方法完全相同。只需要简单的SELECT…FROM即可。

    视图中的基表也可以是其他视图(只要能够直接或者间接提供数据即可)


    视图具有以下优点:

    1. 可以限制用户只能通过视图检索数据。这样就可以对最终用户屏蔽建表时底层的基表,具有安全性。
    2. 可以将复杂的查询保存为视图,屏蔽复杂性。


    语法结构:创建视图

    CREATE [OR REPLACE] [{FORCE|NOFORCE}] VIEW view_nameASSELECT查询[WITH READ ONLY CONSTRAINT]

    语法解析:

    1. OR REPLACE:如果视图已经存在,则替换旧视图。
    2. FORCE:即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表创建成功后,视图才能正常使用。
    3. NOFORCE:如果基表不存在,无法创建视图,该项是默认选项。
    4. WITH READ ONLY:默认可以通过视图对基表执行增删改操作,但是有很多在基表上的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视图执行insert操作),WITH READ ONLY说明视图是只读视图,不能通过该视图进行增删改操作。现实开发中,基本上不通过视图对表中的数据进行增删改操作。


    【例】基于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

    代码解析:

    1. 对视图可以像表一样进行查询。该视图中隐藏了员工的工资。


    语法结构:删除视图

    DROP VIEW 视图名


    注意:

    1. 用户在创建视图前必须先被赋予 create 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;


    课堂练习: 使用新用户访问这张视图,有什么不方便的地方? 你需要做什么

    如果这张视图表很大 访问就很慢







    2.4.2 物化视图

    物化视图是一种特殊的物理表,“物化”(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