数据库中使用最多的是表,其次就是索引
什么是索引:
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';
-- ================================视图对象=============================================
--视图,就是一个虚表,我们可以从这个表中查询数据
-- 给人事经理使用的视图
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;
-- 创建学生表,并准备数据
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对于rownum1的自然数)的条件认为是成立的,所以可以找到记录。
*/
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
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;
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;