oracle 操作基础知识
-- 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; LTRIM(char) 去除字符串左的空格 -- select ltrim(' hello ')from dual; RTRIM(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) 将日期按指定的日期时间格式转换成字符串 (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; -- 刚刚创建的用户没有任何权限,只有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 ename,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、查询列的时候必须加表名作为前缀 连接查询: -- 连接查询是指基于两个或两个以上的基表或视图的查询 注意事项: -- 使用连接查询,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]放在join和(left、right、full)之间 -- 左连接 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; select * from 视图名; -- 创建复杂的视图 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;