Oracle学习4


  

1 数据库对象-索引

数据库中使用最多的是表,其次就是索引
什么是索引:
1、方案(schema)中的一个数据库对象
2、在 Oracle数据库中用来加速对表的查询
3、通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O
4、索引是独立的数据库对象,并不与表存储在一起,而是与表独立存放
5、索引记录了表的索引字段的值,也就是关键字,关键字始终与表的索引字段值相同,这种6、同步由Oracle数据库自动维护

-- 创建索引有两种方式
--1.自动创建:Oracle会自动为主键和唯一键创建索引
-- 自动创建的索引是无法手动删除的.但是在删除主键约束,唯一键约束的时候,对应的索引会被自动的删除.
--主键索引,和唯一性索引的索引类型 都为UNIQUE
ALTER TABLE EMP  ADD CONSTRAINTS ENAME_UNI  UNIQUE (ENAME);
   

ALTER TABLE EMP DROP CONSTRAINTS  ENAME_UNI;
  
SELECT * FROM EMP;  

-- 2.可以手动的创建约束,表中什么样的字段应该添加索引,索引类型为NOMAL
--在查询的时候,经常被用来做为查询添加的字段,应该添加索引
CREATE INDEX ENAME_INDEX  ON EMP (ENAME);

-- 删除索引
DROP INDEX ENAME_INDEX;

SELECT * FROM EMP WHERE ENAME = 'SMITH';

2 数据库对象-视图

-- ================================视图对象=============================================
--视图,就是一个虚表,我们可以从这个表中查询数据


-- 给人事经理使用的视图
CREATE VIEW HR_VIEWAS SELECT * FROM EMP;

-- 创建给项目经理使用的视图
CREATE VIEW HR_MGR	AS SELECT EMPNO,ENAME,JOB,MGR,HIREDATE,DEPTNO FROM EMP ;

-- 我们可以在命令行窗口模式下查看表的结构,也可以查看视图的结构
DESC EMP;
DESC  HR_VIEW;
SELECT * FROM HR_VIEW WHERE EMPNO = 7369;


CREATE OR REPLACE  VIEW HR_MGR
AS
SELECT EMPNO,ENAME,JOB,MGR,HIREDATE,DEPTNO,COMM
FROM EMP ;


-- 删除视图,不会影响原来的数据!
DROP VIEW HR_MGR;
SELECT * FROM HR_MGR;
SELECT * FROM EMP;

-- 
CREATE OR REPLACE  VIEW VIEW_EMPINFO
AS
SELECT E.EMPNO,E.ENAME,E.JOB,E.MGR,E.HIREDATE,E.SAL, (E.SAL*12) AS "年薪" ,E.COMM ,(E.SAL*12 + NVL(E.COMM,0))"年收入" ,E.DEPTNO,D.DNAME,D.LOC_ID,L.LOCNAME
FROM EMP E,DEPT D,LOCATIONS L
WHERE E.DEPTNO = D.DEPTNO AND D.LOC_ID= L.LOCID;

SELECT * FROM VIEW_EMPINFO WHERE 年收入 < 20000;


CREATE OR REPLACE VIEW VIEW_EMP
( 员工编号,员工姓名,薪水,佣金 )
AS
SELECT EMPNO,ENAME,SAL,COMM FROM EMP;

SELECT * FROM VIEW_EMP WHERE 员工编号 = 7369;

SELECT * FROM VIEW_EMP WHERE 员工姓名 = 'SMITH';

-- 把使用组函数的查询创建成视图
CREATE OR REPLACE VIEW  V_EMP_SAL
AS
SELECT DEPTNO,MAX(SAL) MAXSAL ,MIN(SAL) MINSAL,SUM(SAL) SUMSAL,AVG(SAL) AVGSAL
FROM EMP
WHERE DEPTNO IS NOT NULL
GROUP BY DEPTNO
ORDER BY DEPTNO;

SELECT  * FROM V_EMP_SAL  WHERE MAXSAL > 2000;

-- 视图就是一个(虚)表,我们可以对表插入数据,也可以对视图插入数据
CREATE OR REPLACE VIEW V_EMPINFO
AS
SELECT * FROM EMP WHERE SAL  > 2000;


-- 对视图插入数据,数据会被插入到源表中!
INSERT INTO V_EMPINFO VALUES (8000,'张1','工程师',7902,'12-8月-1987',1900,500,20);

SELECT * FROM EMP;


-- 创建只读的视图,不能执行DML操作
CREATE OR REPLACE VIEW V_EMPINFO AS SELECT * FROM EMP WITH READ ONLY

行内视图


-- 行内视图,就是出现在FROM后面的子查询,也就是一个视图,但是该视图没有命名,不会在数据库中保存
-- 查询工资最高的前三个人的信息,这种方式被称为TOP-N分析法
-- ROWNUM只能适用于 <= 的情况
SELECT ROWNUM,E.*
FROM (SELECT * FROM EMP ORDER BY SAL DESC) E
WHERE ROWNUM <= 3;

-- 不能适用于 >= 的情况
SELECT ROWNUM,E.*
FROM (SELECT * FROM EMP ORDER BY SAL DESC) E
WHERE ROWNUM >= 12;

3 ROWNUM 详解

-- 创建学生表,并准备数据
DROP TABLE STUDENT;
CREATE TABLE STUDENT(
  ID     NUMBER (4) primary key,
  NAME   VARCHAR2(20)
);


insert into Student values (1000,'张一');
insert into Student values (1001,'张二');
insert into Student values (1002,'张三');
insert into Student values (1003,'张四');
insert into Student values (1004,'张五');
insert into Student values (1005,'张六');
insert into Student values (1006,'张七');

SELECT * FROM STUDENT for update;

/*
(1) rownum 对于等于某值的查询条件
    如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条
    学生的信息,使用rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum
    做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。
*/
select rownum ,T.* FROM student T where rownum = 1;    --可以查询到数据
select rownum,id,name from student where rownum = 2;    -- 查询不到数据

/*
2)rownum对于大于某值的查询条件
   如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是
   从1开始的伪列,Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录  
*/
select rownum,id,name from student where rownum >=2;

/*
   找到第二行以后的记录,可以使用以下的子查询方法来解决。注意子查询中的rownum必须
   要有别名,否则还是不会查出记录来,这是因为rownum不是某个表的列,如果不起别名的话,无法知道
   rownum是子查询的列还是主查询的列。
*/
select * from(select rownum no ,id,name from student) where no>=2 and no <=5;


/*
3)rownum对于小于某值的查询条件
   如果想找到第三条记录以前的记录,当使用rownum<3是能得到两条记录的。
   显然rownum对于rownum<n((n>1的自然数)的条件认为是成立的,所以可以找到记录。
*/   
select rownum ,id name from student where rownum <3;

/*
(4)可能有时候需要查询rownum在某区间的数据,从上可以看出rownum对小于某值的查询条件是
   人为true的,rownum对于大于某值的查询条件直接认为是false的,但是可以间接的让它转为认为是
   true的。那就必须使用子查询。例如要查询rownum在第二行到第三行之间的数据,包括第二行和第三行
   数据,那么我们只能写以下语句,先让它返回小于等于三的记录行,然后在主查询中判断新的rownum的
   别名列大于等于二的记录行。但是这样的操作会在大数据集中影响速度。
*/
select * from (select rownum no,id,name from student where rownum<=5 ) where no >=3;
select * from (select rownum no ,id,name from student) where no>=3 and no <=5;


/*
(4)rownum和排序
     Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。
*/
select rownum ,id,name from student order by name;

/*
    可以看出,rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,
    rowid也是顺序分配的。为了解决这个问题,必须使用子查询
*/
select rownum ,id,name from (select * from student order by name);

--rowid是物理地址,用于定位oracle中具体数据的物理存储位置
select rowid ,e.* from emp e

4 数据库对象-同义词

1、同义词是数据库对象的一个别名
2、同义词可以简化对对象的访问
3、通过使用同义词,可以:简化了引用另一个用户对象的方法(用户名.对象名)
4、缩短了对象名称的长度
5、同时屏蔽了对象的名称,使用户不知道最终的数据来源于那个对象

--同义词,就是数据库对象的一个别名,可以简化访问其他用户的数据库对象
SELECT SYSDATE FROM SYS.DUAL;

create or replace synonym DUAL1 for SYS.DUAL;
  
SELECT SYSDATE FROM DUAL1;  

--删除同义词
DROP SYNONYM DUAL1;

5 数据库对象-序列

NEXTVAL , CURRVAL的使用
SELECT *. CURRVAL FROM SYS.DUAL;

-- 序列 ,用来维护数据库的主键数据
DROP TABLE STUDENT;

CREATE TABLE STUDENT(
   SID       NUMBER(4) PRIMARY KEY,
   SNAME     VARCHAR2(10)
);


create sequence SEQ_STU
minvalue 1
maxvalue 9999
start with 1
increment by 1;

-- 使用序列
INSERT INTO STUDENT VALUES (SEQ_STU.NEXTVAL,'张1');

SELECT * FROM STUDENT;

SELECT SEQ_STU.CURRVAL FROM SYS.DUAL;


DELETE FROM STUDENT WHERE SID >= 10;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值