Oracle总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
-- oracle 操作基础知识
--1、登陆oracle的四种方式
a、cmd --> sqlplus --> 输入用户名 、密码
b、oracle自带的 sql plus
c、PL/SQL Develeper -- 常用
d、浏览器:访问前启动isqlplus服务,输入网址 http://主机:5560/isqlplus -- 如果是本地,主机为 localhost 或者 127.0.0.1
--2、oracle的系统用户
a、系统管理员:用户名 sys 密码是 xt
b、系统操作员:用户名 system 密码是 xt
c、scott 用户:用户名是 scott 密码是 tiger
-- 数据库安装完毕,scott用户默认锁定 -- 去除scott用户锁: alter user scott account unlock;
-- 3、其他命令:
a、清屏:clear;
b、退出:exit;
c、连接数据库:conn 用户名/密码 -- 例如: conn scott/tiger
-- 4、数据类型
a、varchar2(n) 变长,长度是 1 - 4000
b、char(n) 定长,长度是 1-2000
c、number(m,n) 数值类型,m 代表 有效数字位数,n代表小数点后位数
d、date 日期类型,默认是 dd-mon-yy
e、boolean 值只能为true false null ,不能作为表列类型
-- 5、内置函数
a、数值函数
ABS(n) 返回数字n的绝对值
-- select abs(-9) from dual;
COS(n) 返回数字n的余弦值 (以弧度表示角)
-- select cos(180) from dual;
ACOS(n) 返回数字n的反余弦值
-- select acos(0.8) from dual;
SIN(n)返回数字n的正弦值(以弧度表示角)
-- select sin(30) from dual;
ASIN(n)返回数字n的反正弦值
-- select asin(0.5) from dual;
TAN(n)返回数字n的正切值(以弧度表示角)
ATAN (n)返回数字n的反正切值
FLOOR(n) 返回小于等于数字n的最大整数
-- select floor(2.3) from dual;
CEIL(n) 返回大于等于数字n的最小整数
-- select ceil(2.3) from dual;
MOD(m,n) 返回两个数字相除后的余数
-- select mod(5,3) from dual;
-- select mod(5,0) from dual;
POWER(m,n) 返回数字m的n次幂
-- select power(5,6) from dual;
ROUND(n,[m]) 执行四舍五入运算,m为要保留的小数位数
-- select round(4.2) from dual;
LOG(m,n) 返回数字m为底的数字n的对数
LN(n) 返回数字n的自然对数
EXP(n) 返回e的n次幂
b、字符函数
ASCII(char) 返回字符串首字符的ASCII码值
-- select ASCII('1234') from dual;
CHR(n) 将ASCII码值转为字符
-- select chr(97) from dual;
CONCAT(char1, char2) 将两个字符串连接
-- select concat('王庭','你好') from dual;
INITCAP(char) 将每个单词的第一个字母大写
-- select initcap('hello word') from dual;
INSTR(char1,char2[,n[,
m]]) 寻找指定字符串在字符串中的位置
--select instr('hello word','o') from dual;
--select instr('hello word','o',6) from dual;
LENGTH(char) 返回字符串的长度
-- select length('赵峰') from dual;
LOWER(char) 将字符串转为小写
-- select lower('HELLO NI HAO') from dual;
UPPER(char) 将字符串转为大写
-- select UPPER('hello ni hao') from dual;
SUBSTR(char,m[,n]) 返回字符串中指定位置的子串
-- select substr('hello kitty',4) from dual;
-- select substr('hello kitty',4,5) from dual;
REPLACE(char,search[,replace]) 将字符串替换为指定的字符串
-- select replace('hello word','o','u') from dual;
-- select replace('hello word','o') from dual; -- 删除指定的字符串
TRIM(char) 去除字符串前后的空格
-- select trim(' hello ')from dual;
LTRIMTRIM(char) 去除字符串左的空格
-- select ltrim(' hello ')from dual;
RTRIMTRIM(char) 去除字符串右的空格
--select rtrim(' hello ')from dual;
c、日期和时间函数
SYSDATE 返回系统当前日期
-- select sysdate from dual;
CURRENT_DATE 返回当前会话时区所对应的日期时间
-- select CURRENT_DATE from dual;
EXTRACT 从日期时间值中取得特定数据
-- select extract(day from sysdate) from dual;
ADD_MONTHS(d, n) 返回特定日期时间d加上n个月后的日期时间
-- select add_months(sysdate,1) from dual;
NEXT_DAY(d, char) 返回指定日期后的第一个指定工作日所对应的日期
-- select next_day(sysdate,'星期二') from dual;
LAST_DAY(d) 返回特定日期所在月份最后一天
-- select last_day(sysdate) from dual;
d、转换函数
TO_CHAR(char) 将NCHAR,NVARCHAR2等转换成数据库字符集数据 ,当为NCHAR,NVARCHAR2 等数据类型时,前面加n
-- select to_char(n'hello word') from dual;
TO_CHAR (date, fmt) 将日期按指定的日期时间格式转换成字符串
-- select to_char(sysdate,'yyyy:mm:dd') from dual;
TO_DATE (char, fmt) 将字符串按指定的格式转换成日期时间数据
-- select to_date('2012:11:22','yyyy-mm-dd') from dual;
e、聚合函数
AVG ([ALL|DISTINCT]) 计算平均值
-- 查询平均工资 select avg(sal) from emp;
COUNT ([ALL|DISTINCT])计算记录的总计行数
-- 查询有多少名员工 select count(*) from emp;
-- 查询有多少个职位 select count(distinct job) from emp;
MAX ([ALL|DISTINCT]) 取得列或表达式的最大值
-- 查询员工的最高工资 select max(sal) from emp;
MIN ([ALL|DISTINCT]) 取得列或表达式的最小值
-- 查询员工的最低工资 select min(sal) from emp;
SUM ([ALL|DISTINCT]) 取得列或表达式的总和
-- 查询公司的每月总工资 select sum(sal) from emp;
f、其他函数
NVL (expr1,expr2):将空转换为实际值。
-- 查询员工姓名和实际工资,用 0 代替 奖金的空值
-- select ename,sal+nvl(comm,0) as 实际工资 from emp;
查看表的结构: desc 表名
序列:
创建序列:
CREATE SEQUENCE empseq --自定义的序列名
INCREMENT BY 1 -- 每次加几个,即递增的间隔
START WITH 1 -- 从1开始计数
NOMAXVALUE -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10; --每次取10个数放入缓存
示例:
create sequence seq1
increment by 1
start with 1
nomaxvalue
nocycle
cache 10;
序列的使用:
-- insert into emp values(seq1.nextval,'文博','CLERK',7902,sysdate,800,20,20);
-- select seq1.nextval from dual;
-- select seq1.nextval from dual;
CURRVAL:返回 sequence的当前值
NEXTVAL:增加sequence的值,然后返回 sequence 值
修改序列号:
ALTER SEQUENCE empseq -- empseq 修改的序列号名
INCREMENT BY 10 -- 每次增长量
MAXVALUE 10000 -- 最大值
CYCLE -- 循环,到10000后从头开始
NOCACHE ; -- 不缓存
删除序列
drop sequence seq1; -- 删除序列号
同义词:
创建同义词
create [public] synonym 同义词名 for object --- 定义同义词的基本格式
-- 创建同义词之前,登陆sys用户,给scott 用户赋予创建同义词的权限
conn sys/xt;
grant create any synonym to scott;
-- 给emp创建私有的同义词 e
create synonym e for emp;
-- 使用同义词
select * from e;
-- 删除同义词
drop synonym e;
完整性约束
主键约束(PRIMARY KEY)
外键约束(FOREIGN KEY)
唯一约束(UNIQUE)
检查约束(CHECK)
默认约束(DEFAULT)
非空约束(NOT NULL)
--创建班级表
create table class
(cid number(4) primary key, -- 主键约束
cname varchar2(10) unique not null, -- 非空唯一约束
cnumber number(2) );
-- 创建学生表
create table student
(sid number(4) primary key, -- 主键约束
sname varchar2(10) not null, -- 非空约束
ssex char(2) default '男', -- 默认约束
sage number(3) check (sage>10 and sage<120), -- 检查约束
cid number(4),
constraint con_cid foreign key (cid) -- 外键约束
references class(cid));
--创建学生表 方法二
create table student
(sid number(4) primary key,
sname varchar2(10) not null,
ssex char(2) default '男',
sage number(3) check (sage>10 and sage<120),
cid number(4) references class(cid)); -- 外键约束
创建表空间
-- 创建永久表空间
create tablespace tablespacenew -- tablespacenew表空间名字
datafile 'd:/tablestpac.dbf' size 20m -- 表空间地址及大小
--示例
create tablespace testspace
datafile 'd:/testspace.dbf' size 50m;
-- 创建临时表空间
create temporary tablespace tablespacenew -- tablespacenew表空间名字
tempfile 'd:/tablestpac.dbf' size 20m -- 表空间地址及大小
创建用户:
-- 基本格式
create user 用户名
[Identified by 密码] -- 用于指定用户的密码
[default tablespace 表空间] -- 指定用户默认表空间
[temporary tablespace 临时表空间] -- 指定临时表空间
[quota 使用空间大小 on 表空间] -- 指定用户在特定表空间上的配额
[password expire] -- 设置账户初始状态口令为过期
[account lock/unlock] -- 设置账号的初始状态为锁定/非锁定
-- 示例
create user xiaoxiao
identified by xiaoxiao
default tablespace testspace
temporary tablespace temptestspace
quota 40m on testspace
password expire
account unlock;
——
--解锁
alter user 用户名 account unlock;
-- 刚刚创建的用户没有任何权限,只有sys赋予其会话权限,才能登陆
-- 赋予回话权限
grant create session to xiaoxiao
-- 修该用户
alter user 用户名 更改的项
-- 修改xiaohei 的秘密为 minglu
alter user xiaohei identified by minglu
-- 删除用户
drop user 用户名
-- 删除用户 如果用户已经拥有对象,需要追加 cascade ,同时释放表空间
drop user 用户名 cascade
-- 显示当前用户
show user;
-- Oracle查看当前的数据库名称 ,必须登录 sys用户
select name from V$database;
-- Oracle显示sql语句的运行时间:
set timing on
权
限:
-- 系统权限
-- 授予不限使用表空间的权限
grant unlimited tablespace to 用户
-- 授予系统权限
grant 系统权限列表(多个权限用“,”分隔) to 用户
--授予liubo 不限使用的表空间和创建表、会话的权限
grant unlimited tablespace,create table,create session to liubo
-- 授予系统权限,同时准许继续向下传递 -- 如果删除用户 wangting ,lihu 不受影响
grant create session to wangting with admin option;
-- 回收系统权限
revoke 系统权限列表 from 用户
-- 回收刘博的会话权限
revoke create session from liubo;
-- 查看系统权限
-- 显示当前用户权限(user_sys_privs)
select * from user_sys_privs
-- 显示当前会话权限(session_privs)
select * from session_privs
-- 对象权限
-- 授予对象权限
grant 对象权限 on 对象名 to 用户
-- 授予liubo 查看emp表的权限
grant select on emp to liubo
-- 用 账户 liubo 登录,查看emp 表
select * from scott.emp;
-- 授予用户权限,同时准许继续向下传递
grant select on emp to wangting with grant option;
-- 回收对象权限
revoke 对象权限 on 对象名 from 用户
角色:
-- 角色的创建
create role 角色名
-- 创建角色 zhangya
create role zhangya;
-- 给角色授权
grant 权限列表 to 角色
-- 给角色zhangya 授权
grant create session to zhangya;
-- 用角色给用户授权
grant 角色 同 用户
-- 用角色zhangya给 gaopeng授权
grant zhangya to gaopeng;
-- 删除 角色 -- 删除角色,用这个角色所赋予的权限消失
drop role 角色名
drop role zhangya;
-- 查看当前用户所具有的角色
select * from user_role_privs
数据字典:
静态数据字典
user_users描述当前用户的信息,包括用户名、帐户id、帐户状态、表空间名、创建时间等
user_tables描述当前用户拥有的所有表的信息,主要包括表名、表空间名、簇名等
user_objects当前用户拥有的所有对象的信息,包括表、视图、存储过程、触发器、索引等
user_tab_privs 存储当前账户下对所有表的权限信息
动态数据字典
V$access 显
示数据库中锁定的数据库对象以及访问这些对象的会话对象
V$session 显示当前会话的详细信息
sql语句的使用:
--基本查询
-- 查询表的结构
desc 表名
-- 查询 emp 表的结构
desc emp;
-- 查询所有列
select * from emp;
-- 查询指定列
select 列名,列名 from 表名
-- 查询员工的姓名和薪水
select ename,sal from emp;
-- 使用算术表达式
-- 查询每个员工年薪
select ename, sal*12 from emp;
-- 查询每个员工的实际工资
select ename,sal+nvl(comm,0) from emp;
-- 使用别名
-- 查询每个员工年薪 ,更改列名
select ename as 姓名,sal*12 as 年薪 from emp;
select ename 姓名,sal*12 年薪 from emp;
-- 处理空值 -- 通过 nvl
-- 去除重复行
-- 查询员工的职位,去除重复行
select distinct job from emp;
-- 通过 where 子句进行查询
-- 通过比较运算符 > >= < <= = != <>
-- 查询工资大于2000 并且小于4000的员工信息
select * from emp where sal>2000 and sal<4000;
-- 范围查询 between .. and not between .. and
-- 查询工资在2000 到 4000 之间的员工信息
select * from emp where sal between 2000 and 4000;
-- 模糊查询 like 统配符 % 统配0个或多个字符 _ 统配一个字符
-- 查询姓名中有陈 的员工信息
select * from emp where ename like '%陈%';
-- 查询姓名只有两个字,第一个字是陈的员工信息
select * from emp where ename like '陈_';
-- 集合查询 in not in
-- 查询 部门编号是 10 或者30 的员工信息
select * from emp where deptno in(10,30);
-- 非空查询 is null is not null
-- 查询没有奖金的员工信息
select * from emp where comm is null;
-- 逻辑运算符号 or and not
-- 查询工资大于4000 并且 20 号部门的员工信息
select * from emp where sal>4000 and deptno=20;
-- 排序查询 order by asc 升序,默认值 desc 降序
-- 单属性值排序
-- 查询员工的姓名和工资,按照工资降序排列
select ename,sal from emp order by sal desc;
-- 多属性值排序
-- 查询员工的姓名、部门编号、工资,先按照部门编号升序排列,然后按照工资降序排列
select ena
me,deptno,sal from emp order by deptno ,sal desc;
数据处理
-- 插入数据
-- 向所有的列插入数据
-- 要求:1、列数和表中的列数必须相同 2、插入的值顺序必须和表中的顺序一致
insert into emp values (8888,'刘博','CLERK',7782,sysdate,100,10,10);
-- 向表中插入部分信息
insert into 表名 (列名) values (列值) -- 列名和列值的 个数和顺序必须相同
insert into emp (empno,ename,mgr,hiredate,deptno) values (7777,'金楠',7566,sysdate,20);
-- 修改数据
-- 修改全部数据
-- 给每个员工的奖金更改为500 元
update emp set comm=500 ;
-- 给指定员工更改奖金
update emp set comm=1400 where ename='WARD';
-- 删除数据
-- 删除所有数据
delete from emp;
-- 删除指定数据
delete from emp where ename='金楠';
事物处理
-- 提交事务commit :执行该命令,确认事务变化,结束事务,删除保存点,释放锁。
-- 回滚事务 rollback:执行该命令,退回事务变化,结束事务,删除保存点,释放锁
注意:a、事务提交后不能再回滚
b、执行DDL语句成功,自动提交事务
c、执行DCL语句(Grant,revoke),自动提交事务
d、退出SQL*Plus 自动提交事务
高级查询
分组查询
-- avg 求平均值
-- 查询所有员工的平均工资 -- 如果没有 group by,就是对表中的所有信息进行 统计
select avg(sal) from emp;
-- 查询各个部门的平均工资 -- 先按照 部门编号分组,然后求平均工资
select deptno,avg(sal) from emp group by deptno;
-- count 求记录条数
-- 求该公司的员工数
select count(*) from emp;
-- 求每个部门的员工数
select deptno,count(*) from emp group by deptno;
-- max min 求最大值和最小值
-- 求最高的员工工资
select max(sal) from emp;
-- 求每个部门最高的员工工资
select deptno,max(sal) from emp group by deptno;
-- sum 求和
-- 所有每个月工资总和
select sum(sal) from emp;
-- 查询 每个部门的员工工资总和
select deptno,sum(sal) from emp group by deptno;
-- 分组查询的要求
-- 查询时聚合函数都会忽略null
--查询所有的员工人数
select count(comm) from emp;
--查询
所有员工的奖金
select sum(comm) from emp;
-- 查询时如果一个列出现在了选择列表中,那么他必须出现在group by 子句中
-- 使用分组函数时可以使用 all 或者 distinct 选项,默认为all
-- 查询每个部门的职位个数
select deptno,count(distinct job) from emp group by deptno;
-- 使用having 子句对查询结果进行筛选
-- having 只能作为group by的子句,不能单独出现
-- 分组函数只能出现在选择列表、having子句和group by 子句中
-- 如果查询语句中同时包含group by子句,having子句和order by 子句,则order by 放在最后面
-- 查询各个部门的平均工资,按工资降序排列
select deptno,avg(sal) from emp group by deptno order by avg(sal) desc;
-- 查询各个部门的平均工资,显示平均工资大于2000的部门
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
连接查询:
-- 连接查询是指基于两个或两个以上的基表或视图的查询
注意事项:
-- 使用连接查询,from子句后必须指定两个或者两个以上的表
-- 使用连接查询,应当在列名前加表名作为前缀,如果不同表的列名不同,可以省略前缀。
-- 使用连接查询,必须在where后指定连接条件
-- 可以使用别名进行连接查询
连接查询分类:
-- 等值查询
-- 查询各个员工所在的部门名称
select ename,dname from emp,dept where emp.deptno=dept.deptno;
select ename,dname from emp e,dept d where e.deptno=d.deptno;
不等值连接:
自连接:-- 使用同一个数据表或者视图,自己连接自己
-- 查询每个员工的姓名及其上司的姓名
select e.ename,m.ename from emp e,emp m where e.mgr=m.empno;
-- 注意事项:
1、必须给表起两个别名,把一个表看做两个表
2、查询列的时候必须加表名作为前缀
内连接:inner join
-- 查询各个员工所在的部门名称
select ename,dname from emp inner join dept on emp.deptno=dept.deptno;
--结果集是符合条件的所有结果
-- 外连接 outer
-- 左连接 left join
-- 查询各个员工所在的部门名称 ,包含没有分配部门的员工
select ename,dname from emp left join dept on emp.deptno=dept.deptno;
-- 左连接的结果集是符合条件
的所有内容,和不符合条件的左面表的所有内容
-- 右连接 right join
-- 查询各个员工所在的部门名称 ,包含没有员工的部门
select ename,dname from emp right join dept on emp.deptno=dept.deptno;
-- 右连接的结果集是符合条件的所有内容,和不符合条件的右面表的所有内容
-- 全连接 full join
-- 查询各个员工所在的部门名称 ,包含没有员工的部门和没有部门的员工
select ename,dname from emp full join dept on emp.deptno=dept.deptno;
-- 全连接的结果集是符合条件的所有内容,和不符合条件的所有内容
子查询:
-- 在一个查询语句中嵌套另一个查询语句,也叫嵌套查询
子查询分类:
单行子查询 -- 子查询返回的结果是一行
-- 内层子查询只返回一行数据的子查询语句,外层查询的WHERE子句中可以使用单行比较运算符(<> 、= 、>=、 <=、 >、 < )
-- 查询和scott 同一个部门的员工信息
select * from emp where deptno=(select deptno from emp where ename='SCOTT');
多行子查询 -- 子查询返回的结果集是多行
-- 返回多行数据的子查询语句,外层查询的WHERE子句中必须使用多行比较符(IN、ALL、ANY )
-- 查询和编号为10的部门工作相同的员工信息
select * from emp where job in(select job from emp where deptno=10);
-- 查询比 30 号部门所有员工工资高的员工信息
select * from emp where sal>all(select sal from emp where deptno=30);
-- 大于所有 ,即是大于最大的,大于任何一个,即是大于最小的
-- 小于
多列子查询 -- 返回多列数据子查询语句
-- 查询和scott 同一个部门,并且同一个工作的员工信息
select * from emp where (job,deptno)=(select job,deptno from emp where ename='SCOTT');
其他子查询
-- exists -- 子查询相当于一个开关语句,如果子查询有结果集,那么显示查询的所有内容,如果子查询没有 结果集,那么查询结果不显示
-- 查询所有的员工信息,如果有员工的编号为1000,那么现实所有信息,否则不显示
select * from emp where exists (select * from emp where empno=1000);
-- 在insert 语句中使用
-- 增加一名员工的信息,他的姓名和薪水和 scott 相同
insert into emp ( empno,ename,sal ) select empno+1,ename,sal from emp where ename='SCOTT';
-- 在update 语句中使用
-- 更改苏旭晨 的信息,使他的薪水和 black 的相同
update emp set sal=(select sal from emp where ename='BLACK') where ename='苏旭晨';
-- 在delete 语句中使用
-- 删除 和Ford 工资相同的员工
delete from emp where sal=(select sal from emp where ename='FORD')
集合查询:
-- 概念:将两个或多个分结果集进行集合操作得到新的结果集。
-- 分类
-- UNION(并集,结果总集删除重复记录)
-- 查询工资大于3000 或者 工作是 销售的员工信息
select * from emp where job='SALESMAN'
union
select * from emp where sal>3000;
UNIION ALL(并集,结果不删除重复记录)
-- 查询奖金不为空 或者 工资大于2000的 员工信息
select * from emp where comm is not null
union all
select * from emp where sal >2000;
INTERSECT(交集)
-- 查询奖金不为空并且工资大于2000的员工信息
select * from emp where comm is not null
intersect
select * from emp where sal>2000;
MINUS(差集)
-- 查询工资大于2000 的员工信息,去除 领导阶层的
select * from emp where sal>2000
minus
select * from emp where job='PRESIDENT';
其他查询:
-- case的使用
-- 对雇员表雇员工资进行查询分级
-- 对于工资在3000以上的定为最高级(第三级)工资,
-- 对于工资大于200且小于等于3000的员工工资定为第二级,
-- 对于其它情况为第一级。
-- 查询输出员工名称、员工工资及工资级别。
select ename,sal,
case when sal>3000 then 3
when sal>200 then 2
else 1 end grade
from emp;
索引:
-- 概念
-- 是一种可选的与表相关的数 据库对象,用于提高数据库的查询效率
-- 索引是建立在表列上的数据库对象,但不依赖于表
-- 在一个表上创建索引,不会 影响表的使用方式,只会影响表中数据的查询效率
-- 分类:
-- 唯一索引和非唯一索引(根据索引值是否唯一)
-- 平衡树索引和位图索引(根据索引的组织结构)
-- a、平衡树又称B树索引,在数的子节点中保存索引值和rowid,Oracle默认创建的是平衡树索引。它占用空间多,适合索引值基数高,重复率低的应用
-- b、位图索引是为每一个索引值建立一个位图,在位图中使用一个位元对应一个rowid。它占用空间小,适合索引值基数少,重复率高的应用
-- 单列索引和复合索引(根据索引引用的列数)
-- 函数索引(包含列的函数或表达式创建的索引 )
-- 创建索引:
-- 基本格式:
create [unique][bitmap] index 索引名 -- unique 唯一索引,bitmap位图索引
on 表名(列名[asc/desc],列名…)
[reverse] -- 反转索引
--为 users 表的usid列创建索引
create index index_u on users(usid);
-- 创建唯一/非唯一索引
create unique index ind3 on emp(empno) ;
-- 创建位图索引
create bitmap index bindx on emp(sex) ;
-- 创建函数索引
create index findx on emp(lower(ename)) ;
-- 一般情况下,满足一下条件,删除索引
a、该索引不再使用
b、该索引很少或几乎不使用
c、索引中包含损坏的数据或者过多的存储碎片,需要删除重建
d、移动了表数据,导致索引失效
-- 删除方法
drop index 索引名
-- 删除索引
drop index index_u;
--在SQL中有很多陷阱会使一些索引无法使用。
使用( <>、!= )操作符会限制索引的使用
is Null 和 not is null 会限制索引的使用
对索引的列使用函数时,会忽略索引
比较不匹配的数据类型,索引失效
-- 查看索引信息
dba_indexes、all_indexes、user_indexes包含索引的基本描述信息和统计信息
dba_ind_columns、all_ind_columns、user_ind_columns包含索引列的描述信息
dba_ind_expressions、all_ind_expressions、user_ind_expressions 包含函数索引的描述信息
簇
-- 概念
-- 簇是存储表数据的一种可选结构,它由一组共享相同数据块的表组成。并且这些表都具有共同的簇键列
-- 建立索引簇
create cluster dept_emp_cluster(deptno number(3));
--创建簇
create cluster clu_cla_stu(cid number(4));
-- 建立簇表
create table dept ( -- 建立部门表
deptno number(3) primary key,
Dname varchar2(14),
Loc varchar2(13),
Address varchar2(30)
)cluster dept_emp_cluster(deptno); -- 指定使用索引簇的列
create table emp( -- 建立 员工表
Empno number(4) primary key,
Ename varchar2(10),
deptno number(3) constraint fk_deptno references dept(deptno)
) cluster dept_emp_cluster(deptno); -- 指定使用索引簇的列
-- 注意:簇表是放在簇段中的,所以不需要表空间配额,为了
将表组织到簇中,必须在建表时指定cluster
-- 建立簇索引
create index dept_emp_idx on cluster dept_emp_cluster
-- 使用索引簇
select dname,ename,sal from dept where dept.deptno=10 and dept.deptno=emp.deptno
-- 当主从表组织到索引簇之后,如果执行两表连接查询,可以大大降低I/O次数,从而提高查询的速度
-- 删除簇
-- 删除不带表的簇
drop cluster dept_emp_cluster ;
-- 删除带表的簇
drop cluster dept_emp_cluster including tables;
-- 删除带表的簇(先删除簇表)
drop table dept ;
drop table emp ;
drop cluster dept_emp_cluster
创建视图
--基本格式
create [ or replace ] view 视图名(别名列表)
as select 子查询语句
-- 创建简单的视图
create view 视图名 as 子查询语句
-- 给emp表创建视图 ,只存储员工的姓名和 工资
create view emp_view as select ename,sal from emp;
-- 创建别名列表的视图
create view 视图名(别名列表) as 子查询语句
-- 创建视图 起别名
create view view_sal(姓名,工资) as select ename,sal from emp;
-- 创建复杂的视图
create view 视图名(别名列表) as 连接查询
create view view_dept_emp(姓名,部门) as select ename,dname from emp,dept where emp.deptno=dept.deptno;
-- 删除视图
DROP VIEW 视图名
drop view view_dept_emp;