NO.47 视图、序列、索引 、 约束

为方便测试,创建表emp,包含以下信息:

emp测试用表

视图VIEW

视图是数据库对象之一,在SQL语句中体现的角色与表一致。但是视图并非一张真实存在的表,它只是一个查询语句对应的结果集。

CREATE VIEW v_emp_10 AS SELECT empno, ename, sal, deptno FROM emp WHERE deptno = 10 DESC v_emp_10

SELECT * FROM v_emp_10

视图对应的子查询中的字段可以指定别名,这样该视图对应的字段名就是这个别名。

当一个字段是函数或者表达式,那么该字段必须指定别名

CREATE OR REPLACE VIEW v_emp_10 AS SELECT empno id,ename name,sal salary,deptno FROM emp WHERE deptno=10

视图根据对应的子查询不同,分为简单视图和复杂视图

简单视图:对应的子查询不含有函数,表达式,分组,去重,关联查询。

除了简单视图就是复杂视图

简单视图可以进行DML操作,对该视图的操作就是对该视图数据来源的基础表进行的操作。

复杂视图不允许进行DML操作。

对简单视图进行DML操作也不能违反基础表的约束条件。

对视图进行DML操作,视图对基础表操作时,只能对视图可见的字段进行。

INSERT INTO v_emp_10(id,name,salary,deptno) VALUES (1001,'JACK',3000,10)

SELECT * FROM v_emp_10

SELECT * FROM emp

UPDATE v_emp_10 SET salary=4000 WHERE id=1001 DELETE FROM v_emp_10 WHERE id=1001

对视图的不当DML操作会污染基表数据

即:对视图进行DML操作后,视图对基础表对应数据进行该DML操作,但是操作后视图却对该记录不可见。

INSERT INTO v_emp_10(id,name,salary,deptno) VALUES(1001,'JACK',3000,20)

UPDATE v_emp_10 SET deptno=20

DELETE不会产生污染现象。

DELETE FROM v_emp_10 WHERE deptno=20

为视图添加检查选项,可以避免对视图操作而导致的对基表的数据污染。

WITH CHECK OPTION

该选项要求对视图进行DML操作后,该记录必须对视图可见。

CREATE OR REPLACE VIEW v_emp_10 AS SELECT empno id,ename name,sal salary,deptno FROM emp WHERE deptno=10 WITH CHECK OPTION

WITH READ ONLY

只读选项

只读选项要求对视图仅能进行查询操作,不能进行任何DML操作。

CREATE OR REPLACE VIEW v_emp_10 AS SELECT empno id,ename name,sal salary,deptno FROM emp WHERE deptno=10 WITH READ ONLY

常用的数据库的数据字典

USER_OBJECTS:记录用户创建过的所有数据库对象

SELECT object_name,object_type FROM user_objects WHERE object_type='VIEW' 

USER_VIEWS:专门记录曾经创建过的视图信息

SELECT view_name,text FROM user_views WHERE view_name LIKE '%EMP%'

USER_TABLES:专门记录曾经创建过的表的信息

SELECT table_name FROM user_tables

删除视图

DROP VIEW v_emp_10

创建复杂视图

创建一张视图,包含员工工资及相关部门信息

包含:每个部门的平均工资,最大,最小,工资总和,以及对应的部门名称,部门编号。

CREATE OR REPLACE VIEW v_emp_salinfo AS SELECT AVG(e.sal) avg_sal,MAX(e.sal) max_sal,MIN(e.sal) min_sal,SUM(e.sal) sum_sal,d.deptno,d.dname,d.loc FROM emp e,dept d WHERE e.deptno=d.deptno GROUP BY d.deptno,d.dname,d.loc

SELECT * FROM v_emp_salinfo

查看哪些员工的工资高于其所在部门平均工资?

SELECT e.ename,e.sal,e.deptno FROM emp e,v_emp_salinfo v WHERE e.deptno=v.deptno

AND e.sal>v.avg_sal

序列SEQUENCE

序列是数据库对象之一,作用是根据指定的规则生成一系列数字。通常使用序列生成的

数字是为表中的主键字段提供值使用。

CREATE SEQUENCE seq_emp_id START WITH 1 INCREMENT BY 1

序列支持两个伪列:

NEXTVAL:获取序列的下一个数字,如果是新创建的序列,那么会从START WITH开始返回。

之后则是用上次生成的数字加上步长来得到本次生成的数字返回。

需要注意,序列是不能后退的。并且不受事务控制。

CURRVAL:获取序列最后生成的数字,新创建的序列至少调用NEXTVAL生成一个数字后才可以使用。CURRVAL不会导致序列步进。

SELECT seq_emp_id.NEXTVAL FROM dual

SELECT seq_emp_id.CURRVAL FROM dual

使用序列为EMP表主键字段提供值:

INSERT INTO emp(empno,ename,job,sal,deptno) VALUES (seq_emp_id.NEXTVAL,'JACK','CLERK',3000,10)

SELECT * FROM emp

删除一个序列

DROP SEQUENCE seq_emp_id

序列的数据字典

SELECT * FROM USER_SEQUENCES

索引INDEX

索引是数据库对象之一,作用是提高查询效率

索引的创建时是数据库自行完成的,并且数据库会在适当的时候自动使用索引。

CREATE INDEX idx_emp_ename ON emp(ename)

经常出现在WHERE中和ORDER BY中的字段要添加索引。经常出现在DISTINCT后面的字段也可以添加索引。

需要注意,对于字符串类型字段,若在WHERE中使用LIKE进行过滤时,是不会用到索引的。

约束

非空约束

CREATETABLE employees(

eidNUMBER(6),

nameVARCHAR2(30)NOTNULL,

salaryNUMBER(7,2),

hiredate DATE

CONSTRAINTemployees_hiredate_nn NOT NULL

)

添加非空约束

ALTER TABLE employees MODIFY(eid NUMBER(6) NOT NULL)

取消非空约束

ALTER TABLE employees MODIFY(eid NUMBER(6) NULL)

唯一性约束

CREATE TABLE employees2 (

eid 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)

测试

INSERT INTO employees2

(eid,name,email)

VALUES

(NULL,'jack',NULL)

SELECT * FROM employees2

主键约束

一张表只能有一个字段定义主键约束,主键约束要求该字段非空且唯一

CREATE TABLE employees3 (

eid NUMBER(6) PRIMARY KEY,

name VARCHAR2(30),

email VARCHAR2(50),

salary NUMBER(7, 2),

hiredate DATE

)

增加主键约束

ALTER TABLE employees3 ADD CONSTRAINT employees3_eid_pk PRIMARY KEY(eid);

测试

INSERT INTO employees3

(eid,name,email)

VALUES

(2,'jack','jack@123.com')

外键约束

外键约束条件定义在两个表的字段或一个表的两个字段上,用于保证相关两个字段的关系。比如emp表的deptno列参照dept表的deptno列,则dept称作主表或父表,emp表称作从表或子表。

CREATE TABLE employees4(

eidNUMBER(6),

nameVARCHAR2(30),

salaryNUMBER(7,2),

deptnoNUMBER(4)

);

ALTER TABLE employees4 ADD CONSTRAINT employees4_deptno_fk FOREIGN KEY(deptno) REFERENCES dept(deptno);

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

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

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

检查约束

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • 1.简介 数据存储有哪些方式?电子表格,纸质文件,数据库。 那么究竟什么是关系型数据库? 目前对数据库的分类主要是...
    乔震阅读 1,681评论 0 2
  • 5.多表查询 多表查询 目的:从多张表获取数据 前提:进行连接的多张表中有共同的列 等连接 通过两个表具有相同意义...
    乔震阅读 1,172评论 0 0
  • 数据库概述: 数据库(DataBase,DB):指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用...
    字节码阅读 519评论 0 0
  • mysql数据库中 :database : 文件夹table : 数据表(数据文件) 进入mysqlmysql -...
    赋闲阅读 554评论 0 0
  • 终于熬到放假了,手机关机,睡了几天懒觉,顿时感觉脑袋都轻飘了许多。 出门觅食去,想吃的吃饱了肚,感觉前所未有的舒服...
    清清雾阅读 198评论 0 0