阅读更多
151 查询当前用户自己有多少张表 user_tables (user_xxx,all_xxx,dba_xxx )
select table_name from user_tables;
152 查询当前用户可以访问的所有表 all_tables (user_xxx,all_xxx,dba_xxx ) (别人授 权访问的表)
select table_name from all_tables; 这个数量 一定比 user_tables 的数量
153 dba_tables, 显示所有方案拥有的数据库表,但是查询这种数据库字典视图,要求用户 必须用dba角色和select any table 系统权限
154 oracle 9i 真个数据库中有695张表 oralce 11个有 2500张左右
155 oracle 用户所拥有的权限和角色都存放在数据库字典中
156 查询数据库中所有用户的详细信息
select * from dba_users;
157 查询当前用户具有的系统权限
select * from dba_sys_privs where grantee='SYSTEM';
select * from role_sys_privs where role='SYSTEM';
158 查询当前用户具有的对象权限
select * from dba_tab_privs where grantee='SYSTEM';
159 查询当前用户具有的列权限
select * from dba_col_privs where grantee='SYSTEM';
160 查询用户具有的 角色
select * from dba_role_privs where grantee='SCOTT';
161 查询数据库系统中有多少角色
select count(*) from dba_roles; ---51 11.1版本 --25 9i
162 查询用户 SCOTT 所拥有的系统权限
select * from dba_sys_privs where grantee in (select granted_role from dba_role_privs where grantee='SCOTT');
163 查询oralce的系统权限 有多少种
select * from system_privilege_map; --11.1 [ 206 ] 9i [ 140 ]
164 查询oracle的对象权限
select * from dba_tab_privs; -- 11.1 [31520]
165 查询表空间
select tablespace_name from dba_tablespaces;
166 显示当前用户可以查看的所有数据字典视图
select * from dict where comments like ‘%grant%’
167 显示当前数据库的全称
select * from global_name;
168 sqlplusw 清屏 命令是 clear screen; PL/SQL ,sqlplus 清屏 是 clear
169 动态性能视图:用于记录当前例程的活动信息。
当启动oracle service时 系统会建立动态性能试图;
当停止oracle service的时候,系统会删除动态性能视图 ;
ORACLE 的所有动态性能视图都是以 v_$开始的,并且oracle为每个动态性能视图都提供了相应的同义词,并且同义词都是以V$开始的。
例如 v_$datafile 的同义词是v$datafile;
动态性能的所有者是sys,一般情况下,由dba和特权用户来查询动态性能视图。
170 管理表空间和数据文件
表空间:是数据库的逻辑组成部分。
从物理上讲,数据库数据存放在数据文件中;
从逻辑上讲,数据库是存放在表空间中,表空间由一个或者多个数据文件组成。
171 oracle 的逻辑结构包含 表 空间 段 区 块
数据库是由表空间构成,表空间又是有段构成,段是由区构成,区是由 oracle的块构成,这样做是为了提高数据库的效率,
作用
1.和控制数据库占用的磁盘空间
2.dba 可以将不同数据类型部署到不同的位置,这样 有利于i/0的性能,同时利于备份和恢复等管理
172 创建表空间采用create tablespace命令完成,需要注意的是一般情况下,建立表空间,是特权用户和dba来执行的。如果其他用户要创建必须要有 create tablespace 的系统权限
crate tablesapce data01 datafile 'd:\test\data01.dbf' size 20m uniform size 128k;
说明:创建一个名称为 data01 的表空间,并为该表空间建立一个名称为data.01.dbf的数据文件,区的大小为128k,
使用的时候是
create table mydept(deptno number(4),dname varchar2(14),loc varchar2(13)) tablespace data01; (如果不指定表空间,就默认放在 SYSTEM 表空间下);
create table emp(empno,ename) tablespace data01 as select empno,ename from scott.emp;
173 改变表空间的状态
当建立表空间的时候,表空间处于联机的(online)状态,此时表空间是可以访问的,并且是可以读写,既可以在表空间上执行各种语句。
但是在进行系统维护活数据维护的时候,可能需要改变表空间的状态。 一般由特权用户和dba来操作
1.使表空间脱机
alter tablespace 表空间名 offline;
2.使表空间联机
alter tablespace 表空间名 online;
3.只读表空间
当建立表空间时,表空间可以读写,如果不希望在表空间上执行update ,delete ,insert 操作,那么可以将表空间修改为只读
alter tablespace 表空间 read only;
4.改为只读后,边回来成读写
alter tablespace tbs001 read write;
174 显示表空间中的所有表
select * from user_tables where TABLESPACE_NAME='DATA01'; (大写)
175 知道表名,查看该表属于那个表空间 (大写)
select tablespace_name,table_name from user_tables where table_name='EMP';
176 删除表空间的名字 (dba 或者特权用户)
drop tablespace DATA01 including contents and datafiles;
说明: including contents 表示删除表空间时候,删除该表空间的所有数据对象,而datafiles 表示将数据库文件也删除。
177 扩展表空间 oralce 有3中方法
1.添加数据文件 alter tablespace TBS001 add datafile 'd:\tbs002.dbf' size 20m;
2.增加数据文件的大小 alter database datafile 'd:\tbs001.dbf' resize 20m;
3.设置自动增长 alter database datafile 'd:\tbs002.dbf' autoextend on next 10m maxsize 500m;
178 移动数据文件(处理磁盘损坏的时候,将数据文件进行迁移)
1.找出数据文件对应的 表空间
select tablespace_name from dba_data_files where file_name='D:\TBS001.DBF';
2.使表空间脱机 确保数据文件的一致性
alter tablespacce tbs001 offline;
3.使用命令移动数据文件到指定的目标位置 (PL/Sql中不能成功,sqlplus中能成功)
host move d:\tbs001.dbf c:\tbs001.dbf;
4.修改表空间对应的数据文体 为新磁盘下的数据文件
alter tablespace TBS001 rename datafile 'D:\TBS001.DBF' to 'E:\TBS001.DBF';
5.使表空间联机
alter tablespace TBS001 online;
179 查询表空间的信息(dba_tablespaces);
select * from dba_tablespaces;
180 查询表空间的所有的数据文件(dba_data_files)
select file_name,bytes from dba_data_files where tablesapce_name='TBS001';
181 表空间的状态
offline,online, read only, read write;
182 其他常用的表空间
索引表空间
undo表空间
临时表空间
非标准块的表空间
183 数据的完整性用户确保数据库数据遵从一定的商业和逻辑规则,在oralce中可用 以下三种
1.使用约束(5) not null ,unique ,primary key ,foreign key,check
2.使用触发器
3.使用 应用程序(过程,函数)
184 一个表中只能有一个主键,但是可以有多一个 unique 约束
185 添加 非空约束
alter table goods modify goodsName not null;
186 添加唯一约束
alter table customer add constraint card_unique unique(cardId);
187 添加check约束
alter table customer add constraint address_check check(address in('东城'),'西城','崇明');
189 添加范围限制约束
alter table customer add constraint nums_check check(nums between 1 and 30);
190 删除约束
alter table customer drop constraint 'nums_check';
191 删除主键约束的时候 可能会报错 (如果存在主外键关系)
alter table customer drop primary key 【cascade】; 表示也删除级联的关系
192 查询某个表的约束信息 (通过查询数据库字典视图user_constraints)
select constraint_name,constraint_type,status,validated from user_constraints where table_name='CUSTOMER';
193 根据约束名称查询约束的列 user_constrants
select column_name,position from user_cons_colums where constraint_name='约束名';
193 查询某个表的约束详细信息 user_cons_columns
select cn.constraint_name,cn.constraint_type,cc.column_name,cc.position,cn.status,cn.validated from user_cons_columns cc,(select constraint_name,constraint_type,status,validated from user_constraints where table_name='CUSTOMER') cn where cc.constraint_name=cn.constraint_name;
select cs.constraint_name,cs.constraint_type,cs.validated,cc.column_name,cc.position from user_cons_columns cc,user_constraints cs where cs.constraint_name=cc.constraint_name and cs.table_name='CUSTOMER';
194 列级定义 :指在定义列同时 定义约束
create table department4( dept_id number(2) constraint pk_department primary key,
name varchar2(12),
loc varchar2(12));
195 表级定义:定义所有的列后,再定义约束
create table employee2( emp_id number(4),name varchar2(15),dept_id number(2),constraint pk_employee primary key(emp_id),
constraint fk_department foreign key (dept_id) references department4(dept_id));
196 索引:用于加速数据存储的数据对象,合理的使用索引可以大大降低I/O次数,从而提高数据的访问 性能,索引有很多种
197 索引的维护,指的是数据库中添加或者删除了数据,索引都需要进行对应的改变
198 单列索引:基于单个列建立的索引
create index 索引名 on 表名(列名);
199 复合索引:基于两列或者是多列的索引,在同一张表上可以有多个索引,要求列的组合必须不同。
create index emp_idx1 on emp(ename,job);
create index emp_idx2 on emp(job,ename);
200 sql语句扫描是从后面往前面,所以在写sql语句的时候要将能偶筛选出很多数据的条件放在后面。(条件越苛刻的越放在后面,主要是在利用索引的时候能)
201 使用原则
1.在大表上建立索引才有意义(否则浪费空间)
2.在where 子句或者连接条件上经常引用列上建立索引
3.索引的层次不要超过4层
202 索引的缺点
1.建立索引,系统要占用大约为表的1.2倍的硬盘和内存空间来保存索引
2.跟新数据的时候,系统必须要有额外的时间来同时对索引进行更新,一维持数据和索引的一致性
3.实践表明,不恰当的索引不但于事无补,反而会大大降低系统的性能。因为大量的索引在进行插入,修改和删除的操作是比没有索引花费更多的系统时间。
4.不宜在很少和不引用的字段上建立索引
5.不宜在 逻辑型字段上建立索引,如男或女(是或否)等。
6.索引是消耗一定的系统资源为代价的,索引不能盲目的建立,这是考研一个DBA是否优秀的很重要的指标
203 索引的分类
1 数据的存储方式:B *树,反向索引,位图索引
2.按照列的个数分类:单列,复合索引
3.列的唯一性:唯一索引 ,非唯一索引
4.此外还有,函数索引,全局索引,分区索引...
B*树索引建立在重复值很少的列上,而位图索引则建立在重复置很多,不同值相对固定的列上。
204 显示表的所用索引 dba_indexes(数据库的所有索引) 和 user_indexes(当前用户的索引) 这些都是 数据库字典视图
select index_name,index_type from user_indexes where table_name="表名";
205 显示索引列的信息 (user_ind_columns)
select table_name,column_name from user_ind_columns where index_name='IND_ENAME';
206 查询一个表的索引的详细信息
select ic.table_name,ic.column_name,i.index_name,i.index_type from user_indexes i,user_ind_columns ic where i.index_name=ic.index_name and ic.table_name='CUSTOMER';
207 oracle的角色是为了简化权限的管理
208 create table :权限表示可以在自己的方案中建表
create any table : 表示可以在任何方案中建表
create session: 连接数据库
create view:建视图
create procedure: 建过程
create cluster:建簇
create public synonym: 建同义词
create trigger:触发器
select * from system_privilege_map; --查询显示所有的系统权限
209 授予权限(一般是dba完成)
其他用户来授予系统权限必须要有grant any privilege 【with admin option】--表示遗传性
210 一个表对象上的权限 包括
alter 修改表结构
delete select insert upate index references execute
211 显示对象权限(dba_tab_privs)
包含 用户或者角色具有的对象权限
212 授予对象权限
指定修改某列 grant update on emp(sal) to luob;
只能查询这指定字段 grant select on emp(ename,sal) to luob;
213 授予alter权限
可以对表的结构进行修改 grant alter on emp to luob;
214 授予 execute 权限(用于用户执行其他方案的包、过程,函数)
grant execute on dbms_transaction to luob; --执行 dbms_transaction 包
215 如果想让luob可以在 scott.emp 上建立索引
grant index on scott.emp to luob with grant option;
216 系统权限不是级联回收
对象权限是级联回收的
217 介绍常用的预定角色 connect ,resource,dba
connect 具有一般开发人员的大部分权限,建立一个用户多半情况下,赋予 connect 和 resource 角色 就够了
connect角色 所拥有的权限有 :
alter session 修改会话
create cluster 创建簇
create database link
create session
create table
create view
create sequence
resources 角色用开发人员选哟的其他权限,比如建立存储过程,触发器,resource 角色隐含了 unlimited tablespace 系统权限 无限表空间权限、
create cluster
create indextype
create table
create type
create proecdure
create trigger
dba角色具有 所有的系统权限 以及 with admin option选项,默认的dba用户为 sys和system 他们可以将任何系统权限授予其他用户,但是 dba角色不具备 sysdba和sysoper的特权(启动和关闭数据库)
218 自定义角色 一般是dba来建立,别的用户需要 create role 的系统权限(创建角色时候可以指定验证方式(不验证,数据库验证等))
建立角色(不验证):如果角色是公用的,可以采用不验证的方式建立角色
create role 角色名 not identified;
alter role myrole identified by luobing; --修改成 需要数据库验证的
建立角色(需要数据库验证)
create role 角色名 identified by shunping;
grant select on scott.emp from 角色名 --都是 system 用户登录
create update on scott.emp from 角色名 -- 如果用 scott 就没有方案名
crate delete on scott.emp from 角色名
219 给角色赋予权限
grant create session to 角色名 with admin option;
220 给用户赋角色
grant 角色名 to 用户名 with admin option; 表示 此用户可以将这个角色传递下去
221 删除某个用户的角色
revoke 角色名 from 用户名;
222 删除角色 一般也是由dba来执行的
drop role 角色名 :---》如果角色被删除了, 拥有者角色的人没有权限了
223 查询所有的角色
select * from dba_roles;
224 PL/SQL procedura language /sql 过程化语言
225 查询创建过程中的错误信息
show error;
226 create or replace procedure ss is
begin
insert into myTest values('luob','luob');
end;
/ ---如果采用sqlplusw 需要用 这个来结束执行
227 调用过程
exec 过程名;
call 过程名();
exec 过程名();
228 pl/sql 的组成
块{过程,函数,触发器,包} 最小单元
规范: 单行注视 “--“
多行注视: /* */
标识符的命名规范
定义变量 ---》 v_
定义长常量 ---》 c_
游标 ------》 _cursor ---》emp_cursor;
例外 ------》 e_ ---->e_error;
229 块有三个定义的部分组成
declare (可选)
/*
定义部分 --->定义常量 ,变量,游标,例外,复发数据类型
*/
begin
/*
执行部分
*/
exception (可选)
/*
例外处理部分 ---》处理运行的各种错误
*/
end;
230 set serveroutput on ;打开一个输出选项 就会有输出
begin
dbms_output.put_line('hello world!');
end;
/
231 declare
v_ename varchar2(30);
v_sal number(7,2);
begin
select ename,sal into v_ename,v_sal from emp where empno=&no;
dbms_output.put_line('用户名:'||v_name||' 工资'|| v_sal);
end;
/
232 declare
v_enme varchar2(30);
v_sal number(10,2);
begin
select ename,sal into v_ename,v_sal from emp where empno=&no;
dbms_output.put_line(v_ename|| v_sal);
exception
when no_data_found then
dbms_output.put_line('朋友,你输入的编号有误');
end;
/
233 上面都是 pl/sql 语句快
234 过程
create or replace procedure sp_emp3(spName varchar2,newSal number)is
begin
upadte emp set sal=newSal where ename=spName;
end;
/
exec sp_emp3('SCOTT',4687);
235 函数
create or replace function sp_fun1(spName varchar2) return
number is yearSal number(7,2);
begin
select sal*12+nvl(comm,0)*12 into yealSal from emp where ename=spName;
return yearSal;
end;
/
var abc number;
call sp_fun1('SCOTT') into:abc;
236 包规范
create package sp_package is
procedure update_sal(name varchar2,newSal number);
function annual_income(name varchar2) return number;
end;
237 包体
create package body sp_package is
proceduare update_sal(name varchar2,newSal number)
is
begin
update emp set sal=newSal where ename=name;
end;
function annual_salary(name varchar2) return numer is yearSal number;
begin
select sal*12+nvl(comm,0)*12 into yearSal from emp where ename =name;
return yealSal;
end;
end;
238 在 pl/sql 中给变量赋初始值
v_sal number(6,2):=5.4;
v_hiredate date;
v_valid boolean not ull default false;
239 标量(scalar)的时候用
declare
c_tax_rate number(3,2):=0.03;
v_ename varchar2(50);
v_sal number(7,2);
v_yearSal number(7,2);
begin
select ename,sal into v_ename,v_sal from emp where empno=&no;
v_yearSal:=v_sal*c_tax_rate;
dbms_output.put_line('姓名:'||_ename||' 工资:'||v_Sal||' 交税:'||v_yearSal);
end;
/
240 标量使用 %type类型
declare
c_tax_rate number(3,2):=0.03;
v_ename emp.ename%type;
v_sal emp.sal%type;
v_tax_sal emp.sal%type;
select ename,sal into v_ename,v_sal from emp where empno=&no;
v_tax_sal:=v_sal*c_tax_rate;
dbms_output.put_line('姓名:'||_ename||' 工资:'||v_Sal||' 交税:'||v_tax_sal);
end;
/
241 复合变量(composite) 能够返回多个值的变量,
pl/Sql 记录
pl/Sql 表
嵌套表
varray (动态数组)
242 pl/sql 记录
declare
//自己定义的一个类型
type emp_record_type is record(name emp.ename%type,sal emp.sal%type,title emp.job%type);
v_emp_record emp_record_type; //给这个类型 定义一个变量
begin //赋值
select ename,sal,job into v_emp_record from emp where empno=&no;
// 取值
dbms_output.put_line('员工姓名:'||v_emp_record.name);
end;
/
243 pl/sql表 (相当于一个数组)(下标没有限制 能够为 - +);
declare
//定义pl/sql表类, sp_table_type 该类型用户存放 emp.ename%type
// index by binary_integer 表示下标是整数
type sp_table_type is table of emp.ename%type index by binary_integer;
sp_table sp_table_type; // 定义这个类型的 一个变量
begin
//赋值一个只能返回一行 而且 下标可以为负数,取和存都是一个下标
select ename into sp_table(0) from emp where empno=7788;
dbms_output.put_line('员工名:'||sp_table(0));
end;
244 参照标量 用于存放数值指针的变量,可以使应用程序同享相同的对象,从而降低占用空间 不属于 复合变量
游标变量 ref cursor
定义的时候:不需要指定相应的select语句
使用的时候:(open) 需要指定select语句 (这样游标就与一select语句结合了)
对象类型变量 ref obj_type
245 定义游标变量
declare
//定义一个类型 为游标变量
type sp_emp_cursor is ref cursor;
//定义这类型的变量
test_cursor sp_emp_cursor;
//定义变量
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
//执行
//把 test_cursor 和一个 select结合起来
open test_cursor for select ename,sal from emp where deptno=&no;
//循环取出
loop
//遍历
fetch test_cursor into v_ename,v_sal;
//判断当前用户的工资 是否是小于200 否则+100
if v_sal<200 then
update emp set sal=sal+100 where ename=v_ename;
end if;
//判断test_cursor游标是否为空, 否则退出
exit when test_cursor%notfound;
//打印出来
dbms_output.put_line('员工名字'||v_ename||'工资'||v_sal);
end loop;//结束游标
end;
/
246 orale的三种验证机制
sys 采用的 是操作系统验证 和密码文件验证
操作系统验证 --我的电脑 --管理 ---本地用户和组 -- 组 ora_dba
密码文化验证 --oralce的安装目录下的 _PWDorcl.ora 这个就是密码文件
数据库验证 ---普通的用户
第一个 在 用户组中删除 用户就可以了 这样 conn / as sysdba 就不能进去
第二个 删除 密码文件 --采用命令 orapwd
orapwd file=D:\app\Admin\product\11.1.0\database\PWDorcl.ora password=123456 entries=10 force=y
表示重新穿件一个密码文件,
247 主流的数据库据
微软 sql server access
瑞典MySql AB公司 mySql
ibm公司 db2
美国Sybase公司 Sybase
ibm公司 informix
美国Oracle公司 oralce
248 列和表名的命名规则 字符开头 不得超过 30字符 不能使用 oracle 的保留字, 只能使用 A-Za-z0-9$#
249 rowid 确定了每条记录在oracle中的那一个数据对象,那个数据文件,快,行上。
rowid的格式如下
数据对象编号 文件编号 块编号 行编号
OOOOOO FFF BBBBBB RRR
data_object_id# rfile# block# row#
32bit 12bit 22bit 16bit
250 删除重复记录 (保留大号用 max 保留小号 用min)
1. delete from student a where rowid not in (select max(b.rowid) from student b where a.name=b.name and a.sex=b.sex and a.no=b.no);
2.(保留大号用 "max <" 保留小号 用 "min >")
delete from student a where rowid <(select max(b.rowid) from student b where a.sex=b.sex and a.name=b.name and a.no=b.no);
3. (保留大号用 max 保留小号 用min 和 group by)
delete from student a where row id not in (select max(b.rowid) from student b. group by b.no,b.name,b.sex)
4.把student中唯一确定的任意一行数据(1,'ab','男') 把sex字段更新为‘女’
update student set sex='女' where rowid=(select min(rowid) from student where no=1 and name='ab' and d.dex='男’);
5.查询大量重复的记录
select empno from empa group by empno having count(*) >1;
select * from empa where rowid not in (select min(rowid) from empa group by empno);
6.查询少量重复记录
select * from empa a where rowid<>(select max(rowid) from empa where empno=a.empno)
7.删除大量重复记录
delete empa where empno in(select empno from empa group by empno having count(*)>1) and rowid not in(select min(rowid) from empa group by empno having count(*)>1);
delete empa where rowid not in (select min(rowid) from empa group by empno);
delete empa a where rowid <>(select max(rowid) from empa where empno=a.empno)
delete emp where rowid <>(select max(rowid) from empa group by empno)
--------------------------
user_tables
all_tables;
dba_tables;
dba_user;
dba_sys_privs
role_sys_privs
ROLE_TAB_PRIVS
dbs_tab_privs //对象权限
all_tab_privs
user_tab_privs
dba_col_privs
all_col_privs
user_col_privs
dba_roles; //所有的角色
dba_role_privs //角色对应的权限
system_privilege_map //系统的所有权限
dba_tablespaces; //所有的表空间
dict
global_name;
dual
v_$
dba_data_files
user_constraints
user_cons_columns
dba_indexes
all_indexes;
user_indexes
user_ind_columns
all_ind_columns;
table_privilege_map;
table_privileges;
select count(*) from dba_roles; 51
select count(*) from system_privilege_map; 206
select count(*) from table_privilege_map; 26