一. 视图,序列,索引

视图

1. 什么是视图

视图(VIEW)也被称作虚表,是一组数据的逻辑表示

视图对应于一条SELECT语句,结果集被赋予一个名字,即视图名字

视图本身并不包含任何数据,它只包含映射到基表的一个查询语句,当基于数据发生变化,视图数据页随之变化

CREATE [OR REPLACE] VIEW view_name[alias[,alias…]] AS subquery;

视图创建后,可以像操作表一样操作视图,主要是查询

SUBQUERY是SELECT查询语句,对应的表被称为基表

— SELECT语句是基于单表建立的,且不包含任何函数运算,表达式或分组函数,叫简单视图,这时视图是基表的子集

— SELECT语句基于单表,但包含了单行函数,表达式,分组函数或GROUP BY子句,叫做复杂视图

— SELECT语句基于多个表,叫做连接视图

2. 视图的作用

简化复杂查询:若经常需要执行某项复杂查询,可以基于这个复杂查询建立视图,此后查询次视图即可

限制数据访问:当访问视图时只能访问到对应的SELECT语句中涉及的列,对基表中其它列起到安全和保密的作用

3. 授权创建简单视图(单表)

创建视图的语句是:CREATE VIEWER

用户必须有CREATE VIEWER系统权限,才能创建视图

管理员通过DCL语句授予用户创建视图的权限:GRANT CREATE VIEWER TO user;

eg: CREATE VIEWER v_emp_10 AS SELECT empno,name,sal,deptno FROM emp WHERE deptno = 10;

4. 查询视图

desc v_emp_10;

5. 对视图进行INSERT操作

视图本身并不包含数据,只是基表数据的逻辑映射

当对视图执行DML操作时,实际上是对基表的DML操作

对视图执行DML操作的基本原则:

— 简单视图能够执行DML操作,下列情况除外:在基表中定义了非空列,但简单视图对应的SELECT语句并没有包含这个非空列,导致这个非空列队视图不可见,这时无法对视图执行INSERT操作

— 如果视图定义中包含了函数,表达式,分组语句,DISTINCT关键字或ROWNUM伪列,不允许执行DML操作

— DML操作不能违反基表的约束条件

— 简单视图可以通过DML操作影响到基表数据

— 视图进行DELETE操作时只能删除基表中视图中看得到的数据,不能基表中存在而视图中看不到的数据

6. 创建具有CHECK OPTION约束的视图

CREATE [OR REPLACE] VIEW view_name[(alias[, alias...])] AS subquery [WITH CHECK OPTION];

WITH CHECK OPTION短语表示,通过视图所做的修改,必须在视图的可见范围

— 假设INSERT,新增的记录在视图仍可查看

— 假设UPDATE,修改后的结果必须能通过视图查看到

7. 创建具有READ ONLY约束的视图

CREATE [OR REPLACE] VIEW view_name[(alias[, alias...])] AS subquery [WITH READ ONLY];

如果没有在视图上执行DML操作的必要,在建立视图时声明为只读来避免这种情况,保证视图对应的基表数据不会被非法修改

8. 通过查询user_viewers获取相关信息

和视图相关的数据字典:

— USER_OBJECTS

— USER_VIEWS

— USER_UPDATE_COLUMNS  (查看哪些列允许增删改)

eg:在数据字典USER_OBJECTS中查询所有视图名称

SELECT object_name FROM user_objects WHERE object_type = ‘VIEW’;

9. 创建复杂视图(多表关联)

复杂视图:在子查询中包含了表达式,单行函数或分组函数的视图

必须为子查询中的表达式或函数定义别名

复杂视图不允许DML操作(即INSERT,UPDATE,DELETE)

10. 删除视图

当不再需要视图的定义,可以使用DROP VIEW语句删除视图

eg:DROP VIEW view_name;

视图虽然时存放在数据字典中的独立对象,但视图仅仅是基于表的一个查询定义,所以对视图的删除不会导致基表数据的丢失,不影响基表数据

SELECT sys_guid() FROM DUAL;//可以得到32位的uuid

JAVA中:

String uuid = UUID.randomUUID().toString();

序列

1. 什么是序列

序列(SEQUENCE)是一种用来生成唯一数字值的数据库对象

序列的值由Oracle程序按递增或递减顺序自动生成,通常用来自动生成表的主键值,是一种高效率获得唯一键值的途径

序列是独立的数据库对象,和表是对立的对象,序列并不依附于表

通常一个序列为一个表提供主键值,但一个序列也可以为多个表提供主键

2. 创建序列

CREATE SEQUENCE [schema.]sequence_name

[START WITH i] [INCREMENT BY j ]

[MAXVALUE m | NOMAXVALUE ]

[MINVALUE n | NOMINVALUE ]

[CYCLE | NOCYCLE ][ CACHE p | NOCACHE]

sequence_name是序列名,将创建在schema方案下,schema是用户名,给自己用户创建时可不写

序列的第一个序列值是i,步进(即步长)是j

如果j是整数,表示递增,如果是负数,表示递减

序列可生成的最大值是m,最小值n

如果没有设置任何可选参数,序列的第一个值是1,步进是1

CYCLE表示在递增至最大值或递减至最小值之后是否重用序列。若是递减并有最大值,从最大值开始。若是递增并有最小值,从最小值开始。若没有从START WITH指定的值开始。默认是NOCYCLE

CACHE用来指定先预取p个数据在缓存中,以提高序列值的生成效率,默认是20

3. 使用序列

eg:序列起始数据:100,步进10,则序列号分别是:100,110,120,130...

CREATE SEQUENCE emp_seq START WITH 100 INCREMENT BY 10;

序列中有2个伪列:

— NEXTVAL:获取序列的下个值

— CURRENT:获取序列的当前值

当序列创建以后,必须先执行一次NEXTVAL,之后才能使用CURRENT

获取序列的第一个值,并使用序列值为EMP表插入新的记录

SELECT emp_seq.NEXTVAL FROM DUAL;//第一次执行:100;第二次执行:110

INSERT INTO emp(epmno, ename) VALUES(emp_seq.NEXTVAL, ‘DONNA’);

4. 删除序列

DROP SEQUENCE sequence_name;

索引

1. 索引的原理

索引是一种允许值接访问数据表中某一数据行的树型结构,为了提高查询效率而引入,是独立于表的对象,可以存放在与表不同的表空间(TABLESPACE)中

索引记录中存有索引关键字和指向表中数据的指针(地址)

对索引进行的I/O操作比对表进行操作要少很多

索引一旦被建立就将被Oracle系统自动维护,查询语句中不用指定使用哪个索引

索引是一种提高查询效率的机制

2. 创建索引

CREATE [UNIQUE] INDEX index_name ON table(column[, column…]);

— index_name表示索引名称

— table表示表明

— column表示列名,可以建立单列索引或复合索引

— UNIQUE表示唯一索引

— 索引指定的列是在查询时WHERE子句中经常出现的列

复合索引也叫多列索引,是基于多个列的索引

如果经常在ORDER BY子句中使用job,sal作为排序依据,则可以建立复合索引:

CREATE INDEX idx_emp_job_sal ON emp(job, sal);

当做下面查询时会自动应用索引[idx_emp_job_sal]

SELECT empno, name, sal, job FROM amp ORDER BY job,sal;

3. 创建基于函数的索引

可以在列上建立一个基于UPPER函数的索引:

CREATE INDEX emp_name_upper_idx ON emp(UPPER(name));

当做下面查询时会自动应用索引[emp_name_upper_idx]

SELECT empno FROM emp WHERE UPPER(ename) = ‘KING'

4. 修改和删除索引

如果经常在索引列上执行DML操作,需要定期重建索引,提高索引的空间利用率:ALTER INDEX index_name REBUILD;

当一个表上有不合理的索引,会导致操作性能下降,删除索引:DROP INDEX index_name;

5. 合理使用索引提升查询效率

为经常出现在WHERE子句中的列创建索引

为经常出现在ORDER BY,DISTINCT后面的字段建立索引。如果建立的是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致

为经常作为表的连接条件的列上创建索引

不要在经常做DML操作的表上建立索引

不要在小表上建立索引

限制表上的索引数目,索引并不是越多越好

删除很少被使用的,不合理的索引

二. 约束

约束概述

1. 约束的作用

约束(CONSTRAINT)的全称是约束条件,也称为完整性约束条件

约束条件可以保证表中数据的完整性,保证数据间的商业逻辑

2. 约束的类型

— 非空约束(Not Null),简称NN

— 唯一性约束(Unique),简称UK

— 主键约束(Primary Key),简称PK

— 外键约束(Foreign Key),简称FK

— 检查约束(Check),简称CK

非空约束

1. 建表时添加非空约束

列级约束:在创建表指定列的同时声明的约束

CREATE TABLE employees(id NUMBER(6),

name VARCHAR2(30) NOT NULL,//列级约束1

salary NUMBER(7,2),

hiredate DATE CONSTRAINT employees_hiredate_nn NOT NULL//列级约束2

);

NOT NULL只能是列级约束

2. 修改表时添加非空约束

ALTER TABLE employees MODIFY (id NUMBER(6) NOT NULL);

3. 取消非空约束

ALTER TABLE employees MODIFY (id NUMBER(6) null);

唯一性约束

1. 什么是唯一性约束

唯一性(Unique)约束条件用于保证字段或者字段的组合不出现重复值

当给表的某个列定义了唯一约束条件,该列的值不允许重复,但允许是NULL

2. 添加唯一性约束

CREATE TABLE employees(id NUMBER(6)  UNIQUE,//列级约束

name VARCHAR2(30),

email VARCHAR2(50),

salary NUMBER(7,2),

hiredate DATE,

CONSTRAINT employees_email_uk UNIQUE(email)//表级约束

);

列级约束是在建表声明某一列的同时指定约束条件,表级约束是所有列都声明完毕后单独加约束,括号里指定约束对象是哪一列。

唯一性约束即可以是列级约束也可以是表级约束

在建表之后增加唯一性约束条件:ALTER TABLE employees ADD CONSTRAINT employees_name_uk UNIQUE(name);//新增的唯一性约束条件只会对该增加之后的数据起作用

主键约束

1. 主键的意义

主键(Primary Key)约束条件从功能上看相当于非空且唯一的组合

主键字段可以是单字段或多字段组合

主键可用来确定表中唯一一行数据

一个表中只允许建立一个主键,而其它约束条件则没有明确的个数限制

2. 主键选取的原则

主键应是对系统无意义的数据

永远不要更新主键,让主键除了唯一标识一行之外,再无其它用处

主键不应包含动态变化的数据,如时间戳

主键应自动生成,不要人为干预,以免它带有了唯一标识以外的意义

主键尽量建立在单列上

3. 添加主键约束

在建表时添加主键约束条件:

CREATE TABLE employees (

id NUMBER(6) PRIMARY KEY,

name VARCHAR2(30),

email VARCHAR2(50),

salary NUMBER(7,2),

hiredate DATE

);

建表后创建主键约束条件,并自定义约束条件名称:

CREATE TABLE employees (

id NUMBER(6),

name VARCHAR2(30),

email VARCHAR2(50),

salary NUMBER(7,2),

hiredate DATE

);

ALTER TABLE employees ADD CONSTRAINT employees ADD CONSTRAINT employees_id_pk PRIMARY KEY (id);

外键约束

1. 外键约束的意义

外键约束条件定义在两个表的字段或一个表的两个字段上,用于保证相关两个字段的关系

dept表:主表或父表

emp表:从表或子表deptno(PK)nameloc

10研发部北京

20销售部上海

empno(PK)namedeptno(FK)

1001刘心10

1002李苏海10

1. 添加外键约束

先建表,在建表后建立外键约束条件

CREATE TABLE employees (

id NUMBER(6),

name VARCHAR2(30),

email VARCHAR2(50),

salary NUMBER(7,2),

deptno NUMBER(4)

);

ALTER TABLE employees ADD CONSTRAINT employees_deptno_fk FOREIGN KEY (deptno) REFERENCES dept(deptno);

2. 外键约束对一致性的维护

外键约束条件包含两个方面的数据约束:

— 从表上定义的外键的列值,必须从主表被参照的列值中选取,或者为NULL

— 当主表参照列的值被从表参照时,主表的该行记录不允许被删除

3. 外键约束对性能的降低

若在一个频繁DML操作的表上建立外键,每次DML操作都将导致数据库自动对外键所关联的对应表做检查,产生开销,如果已在程序中控制逻辑,这些判断将增加额外负担,可以省去

外键确定了主从表的先后生成关系,有时会影响业务逻辑

4. 关联不一定需要外键约束

保证数据完整行可由程序或触发器控制

简化开发,维护数据时不用考虑外键约束

大量数据DML操作时不需要考虑外键耗费时间

检查约束

1. 什么是检查约束

检查(Check)约束条件用来强制在字段上的每个值都要满足Check中定义的条件

当定义了Check约束的列新增或修改数据时,数据必须符合Check约束中定义的条件

2. 添加检查约束

eg:员工薪水必须大于2000

ALTER TABLE employees4 ADD CONSTRAINT employees4_salary_check CHECK (salary > 2000);

3. 删除一个约束

ALTER TABLE employees DROP CONSTRAINT employees_salary_check;

查看约束的数据字典

SELECT constraint_name,constraint_type FROM user_constraints WHERE table_name = ‘EMPLOYEES’;

— constraint_type:约束类型

— constraint_name:约束名

SELECT * FROM user_constraints WHERE table_name = ‘EMPLOYEES’;

oracle 取第三大的值,Oracle数据基础(三)相关推荐

  1. oracle 取第三大的值,Oracle 常见的几种访问提取数据的方式!

    oracle中常见的几种提取数据的方式可以分为三大类:全表扫描,通过rowid访问和索引扫描.下面先看一下全表扫描. 1.table full scan全表扫描:这个应该是平时工作中比较常见,一般在返 ...

  2. oracle取最小值怎么写,【Oracle】oracle取最大值和最小值的几个方法汇总

    (1)oracle使用keep分析函数取最值记录 --取工资sal最大的雇员姓名及其工资,以及工资sal最少的雇员姓名及其工资 selectdeptno, empno, ename, sal,max( ...

  3. oracle中获取列的值,oracle - Oracle-SQL从具有特定列和值的所有表中获取数据 - SO中文参考 - www.soinside.com...

    假设我们有一个表ACCOUNT,其中的CUST_ID列如下:SQL> SELECT OWNER, A.TABLE_NAME, COLUMN_NAME FROM 2 ALL_TAB_COLS A ...

  4. oracle取两个小时内的数据,【求解】一个时间条件,查两个不同时间段数据怎么查...

    建表脚本 create table a_test7 ( date       DATE, aproduct VARCHAR2(32), num       NUMBER, amount   NUMBE ...

  5. oracle取32位唯一码,Oracle导出导入dmp文件命令,以及excel生成32位uuid

    Oracle导出dmp文件命令,以及excel生成64位uuid 导出命令cmd中 expdp mms/xfkjerp@orcl schemas=mms dumpfile=expdp.dmp DIRE ...

  6. oracle取_后的数字,Oracle SQL语句实现数字四舍五入取整

    取整(向下取整): select floor(5.534) from dual; select trunc(5.534) from dual; 上面两种用法都可以对数字5.534向下取整,结果为5. ...

  7. oracle如何查看sequence的值,Oracle sequence详解

    创建sequence: create sequence seq_test increment by 1 start with 1 noMaxValue noCycle cache 10; create ...

  8. oracle查找clob中的值,Oracle 查找带有CLOB字段的所有表

    myBatis的一对多查询,主要利用resultMap实现一次查询多个结果集 日常开发中有这中场景,一个用户有多个角色,一个角色又有多个菜单,想查出一个用户的所有菜单.除了常见的关联查询之外,更使用的 ...

  9. oracle移除字段默认值,Oracle——增加修改删除字段

    添加字段的语法:alter table tablename add (column datatype [default value][null/not null],-.); 例:alter table ...

最新文章

  1. Effective C# 原则18:实现标准的处理(Dispose)模式(译)
  2. VIM之Project 项目管理工具
  3. [渝粤教育] 西南科技大学 形式逻辑 在线考试复习资料
  4. spring学习--AOP术语
  5. 搜狗输入法 android2.3,搜狗输入法安卓版
  6. python如何合并txt文件_Python实现将目录中TXT合并成一个大TXT文件的方法
  7. 服务器引导损坏怎么处理,硬盘主引导记录(MBR)损坏,一个命令轻松解决问题...
  8. 论文查重系统哪个好?
  9. 【视线追踪】视线追踪的性能评估框架 及 基础知识
  10. Springboot项目整合xxl -job
  11. android获取设备的型号,Android获取手机设备信息
  12. 新 iPhone 去“刘海”、AR/VR 头显或成 One More Thing,苹果秋季发布会前瞻!
  13. 一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。
  14. FFmpeg将mp4转成flv
  15. 2021 数据挖掘与大数据分析复习笔记 电子科技大学《数据挖掘与大数据分析期末》课程期末高分指南
  16. 用户行为分析(如何用数据驱动增长)-读书笔记1
  17. java基础知识面试题(2020年最新版)
  18. Oracle VM VirtualBox设置共享文件夹
  19. 存在重复元素-python对不起算法大人,我又来水了
  20. mysql 分区表 限制_MySQL分区表的局限和限制-阿里云开发者社区

热门文章

  1. ElementUI 添加修改提示成功后 如何刷新表格数据展示
  2. Ubantu16.4下fabric环境搭建
  3. MPICH 完整配置存档
  4. 使用 pg_dump 迁移 postgresql
  5. final、finally、finalize的区别
  6. 2020-11-2(安卓入门(每个字皆为手打))
  7. 如何使用pFuzz以多种方法验证Web应用程序防火墙的安全性
  8. 【安全漏洞】Cisco命令注入漏洞CVE-2021-1414分析
  9. Intel VT学习笔记(五)—— 调试技巧
  10. 1.4 Java创建一个学生类