数据库视图
视图View
视图是从若干基本表和(或)其他视图构造出来的表
视图存放的都是查询语句,并没有真实的数据
虚表
作用
限制对数据的操作
复杂查询变简单
提供相同数据的不同显示
UNION ALL
直接添加到一起
UNION
添加到一起并去重
*/
–赋予scott用户创建视图的权限
sqlplus / as sysdba;
GRANT CREATE VIEW TO SCOTT;
–创建视图
CREATE OR REPLACE VIEW V_EMP
AS
SELECT * FROM EMP WHERE ENAME LIKE ‘%A%’
UNION ALL
SELECT * FROM EMP WHERE ENAME LIKE ‘%S%’
UNION ALL
SELECT * FROM EMP WHERE SAL >= 3000;
CREATE OR REPLACE VIEW V_EMP
AS
SELECT * FROM EMP WHERE ENAME LIKE ‘%A%’
UNION
SELECT * FROM EMP WHERE ENAME LIKE ‘%S%’
UNION
SELECT * FROM EMP WHERE SAL >= 3000;
–删除视图
DROP VIEW V_EMP;
/*
序列
一个连续递增的数列
*/
–创建序列
CREATE SEQUENCE SEQ_BJSXT
START WITH 20001
INCREMENT BY 2
MAXVALUE 99999999
MINVALUE 1
CYCLE
CACHE 50
–删除数列
DROP SEQUENCE SEQ_BJSXT;
–查询数列
SELECT SEQ_BJSXT.NEXTVAL FROM DUAL;
/*
索引
饕餮 就类似于字典的索引
大大提高了数据库的查询性能
索引会占单独的存储空间,如果建立不合适有可能导致索引数据远大于真实数据
索引会降低数据库的增删改性能
/
SELECT E.,ROWID FROM EMP E;
–创建索引
CREATE INDEX IDX_EMP_ENAME ON EMP(ENAME);
Oracle对象教程:视图(View)创建使用,视图(View)实际上是一张或者多张表上的预定义查询,这些表称为基表。从视图中查询信息与从表中查询信息的方法完全相同。只需要简单的SELECT…FROM即可。
视图具有以下优点:
-
可以限制用户只能通过视图检索数据。这样就可以对最终用户屏蔽建表时底层的基表。
-
可以将复杂的查询保存为视图。可以对最终用户屏蔽一定的复杂性。
-
限制某个视图只能访问基表中的部分列或者部分行的特定数据。这样可以实现一定的安全性。
-
从多张基表中按一定的业务逻辑抽出用户关心的部分,形成一张虚拟表。
语法结构:创建视图
CREATE [OR REPLACE] [{FORCE|NOFORCE}] VIEW view_name
AS
SELECT查询
[WITH READ ONLY CONSTRAINT]
语法解析:
-
OR REPLACE:如果视图已经存在,则替换旧视图。
-
FORCE:即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表创建成功后,视图才能正常使用。
-
NOFORCE:如果基表不存在,无法创建视图,该项是默认选项。
-
WITH READ ONLY:默认可以通过视图对基表执行增删改操作,但是有很多在基表上的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视图执行insert操作),WITH READ ONLY说明视图是只读视图,不能通过该视图进行增删改操作。现实开发中,基本上不通过视图对表中的数据进行增删改操作。
Oracle数据库分页:
Oracle分分页查询格式:
以下是代码片段:
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21
其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。
上面给出的这个Oracle分分页查询语句,,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。
选择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。查询语句如下:
以下是代码片段:
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
)
WHERE RN BETWEEN 21 AND 40
对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。
这是由于CBO 优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。
而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。
上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。