oracle表空間相關常用命令小結:
1、ALTER DATABASE SET DEFAULT BIGFILE TABLESPACE; //修改表空間數據文件類型
2、ALTER TABLESPACE 舊表空間名稱 TO 新表空間名稱; //修改表空間名稱
3、select * from v$database;
show parameter db //查看數據庫相關信息
4、select * from v$instance;
show parameter instance 集裝箱運費
//查詢數據庫實例名
5、select * from v$parameter t where t.NAME='db_domain';
show parameter domain //查詢數據庫域名
6、select * from v$parameter t where t.NAME='service_name';
show parameter service_name //查詢數據庫服務名
7、grant connect to sys identified by 111111;
alter user sys identified by 111111;
password sys 注:這個命令不適用於sys用戶 //修改用戶的密碼
8、orapwd file=%ORACLE_HOME%\database\pwd<sid>.ora //創建新的sys用戶密碼存儲文件pwd<sid>.ora,如果重新創建,必須刪除原有的密碼存儲文件
password=XXXX //設置的新密碼
entries=30 //同時連接到sys用戶的最大數
9、show parameter nls //查詢數據庫中字符集的參數
10、select sysdate from dual //查詢數據庫日期
11、select * from nls_database_parameters;
select * from v$nls_parameters;
select * from props$; //查詢數據庫安裝時確定的參數值
12、export NLS_LANG="simplified chinese_china".zhs16gbk或zhs16cgb231280
export ORA_NLS33=$ORACLE_HOME/nls/admin/data //安裝oracle時設置中文字符集的環境變量
13、update props$ set value$='ZHS16GBK' where name = 'NLS_CHARACTERSET'; //修改oracle數據庫核心字符集
14、exp giapsys/giap file=/home/giapsys.dmp log=/home/giapsys.log direct=y //導出giapsys用戶的所有數據
15、create pfile from spfile; //使用默認的服務器參數文件在默認路徑中創建默認的文本參數文件
16、create spfile from pfile; //使用默認的文本參數文件在默認路徑中創建默認的服務器參數文件
17、select t.tablespace_name,t.bytes,t.blocks,t.autoextensible,t.maxbytes,t.file_name from dba_data_files t;
select * from v$datafile //查詢數據庫數據文件與表空間的信息
18、select t.NAME,t.VALUE from v$parameter t where t.NAME='db_block_size'
show parameter db_block_size //查詢數據塊db_block_size的大小
19、select t.tablespace_name,t.file_id,t.block_id,t.bytes,t.blocks from dba_free_space t;
//查詢表空間的使用情況,bytes表示該表空間空閑表空間大小,blocks標示剩余塊數
20、alter database datafile 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\GIAPSYS' resize 100m;
//重新為數據文件划分尺寸,在原有的基礎上進行增加,前提是AUTOEXTENSIBLE的狀態為YES或ON,否則無法擴充
21 create tablespace AAA //創建表空間名稱為AAA
datafile 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\AAA01' size 1m //數據文件所在目錄,大小為1M
autoextend on //自動擴展狀態為ON(可擴展)
next 1m //下一次將要擴展的文件大小
maxsize 100m //數據文件允許擴展到最大的尺寸,如果maxsize unlimited時則表示數據文件自動擴展,不受限制,它的限制條件為操作系統磁盤可用空間
22、alter tablespace AAA //增加表空間的數據文件,AAA為空間名
add datafile 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\AAA02' size 1m //增加數據文件所在的目錄,大小為1M
autoextend on //自動擴展狀態為ON(可擴展)
next 1m //下一次將要擴展的文件大小
maxsize 100m //數據文件允許擴展到最大的尺寸,如果maxsize unlimited時則表示數據文件自動擴展,不受限制,它的限制條件為操作系統磁盤可用空間
23、alter database datafile 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\AAA02' autoextend off
//修改數據文件的自動擴展屬性,狀態為off
24、alter database datafile 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\AAA02' autoextend on next 1m maxsize 100m
//修改數據文件的自動擴展屬性,狀態為on ,同時指出下次擴展文件的大小,和擴展最大的尺寸
25、select * from dba_tablespaces //查詢表空間存儲參數
26、select t.table_name,t.initial_extent,t.next_extent,t.min_extents,t.max_extents,t.pct_increase from user_tables t
select b.segment_name,b.tablespace_name,b.extent_id,b.extent_id,b.bytes,b.blocks from user_extents b
ORACLE 表空間擴展方法
第一步:查看表空間的名字及文件所在位置:
select tablespace_name, file_id, file_name, round(bytes / (1024 * 1024), 0) total_space from sys.dba_data_files order by tablespace_name
第二步:增大所需表空間大小:
alter database datafile '表空間位置' resize 新的尺寸
例如:
alter database datafile '\oracle\oradata\anita_2008.dbf' resize 4000m
對於oracle數據庫的表空間,除了用手動增加大小外,還可以增加數據文件等方式擴展表空間大小。
方法一:增加數據文件個數
alter tablespace 表空間名稱 add datafile '新的數據文件地址' size 數據文件大小
例如:
alter tablespace ESPS_2008 add datafile '\oracle\oradata\anita_2010.dbf' size 1000m
方法二:設置表空間自動擴展。
alter database datafile '數據文件位置' autoextend on next 自動擴展大小 maxsize 最大擴展大小
例如:
alter database datafile '\oracle\oradata\anita_2008.dbf' autoextend on next 100m maxsize 10000m
方法三:查詢表空間使用情況:
select a.tablespace_name, a.bytes / 1024 / 1024 "sum MB", (a.bytes - b.bytes) / 1024 / 1024 "used MB", b.bytes / 1024 / 1024 "free MB", round(((a.bytes - b.bytes) / a.bytes) * 100, 2) "used%" from (select tablespace_name, sum(bytes) bytes from dba_data_files group by tablespace_name) a, (select tablespace_name, sum(bytes) bytes, max(bytes) largest from dba_free_space group by tablespace_name) b where a.tablespace_name = b.tablespace_name order by ((a.bytes - b.bytes) / a.bytes) desc;
一.數據文件的擴展
1.
alter database datafile '$home/data/df1.dbf' antoextend on;
alter database datafile '$home/data/df1.dbf' autoextend off;
2.創建時啟用
create tablespace testuser datafile '$home/data/df1.dbf'
autoExtend on next 10M maxsix 500M
3.DBA_DATA_FILES ,AUTO_EXTEND
select name,auto_extend from dba_data_files;
4.自動擴展屬性-- 浪費性能 一般關掉 -----》手動擴展
--》1.alter database datafile '/u03/oradata/userdata02.dbf' resize 200M
--> 2. 增加新文件,alter tablespace userdata add datafile '$home/' size 500M
二.移動非SYSTEM 數據文件
--》使表空間脫機
alter tablespace userdata offline;
--》OS copy 文件
--》重命名
alter tablespace userdata rename datafile '11' to '22';
--》使表空間連機
--》使OS命令刪除文件
三.移動SYSTEM數據文件
1.關閉數據庫
2.使用OS 移動
3.startup mount
4.alter database rename file 'system01.dbf' to '/user/system01.dbf';
四.刪除表空間 --system 表和有激活undo的段無法,刪除
1.including contents 刪掉所有的段。
2.including contents and datafiles 刪除掉對應的操作系統文件。
3.cascade constraints;
五.得到表空間的信息
得到表空間的信息
dba_tablespaces
v$tablespace
得到 數據文件的信息
dba_data_files;
v$datafile
得到臨時文件的信息
dba_temp_files;
v$tempfile;
六.臨時表空間temp(只有一個臨時段) --先 sort memory,后 sort disk ---v$sysstat
select * from v$sysstat where name like 'sortx';
臨時表的工作方式:一次分配,循環,共享使用。
1.創建
create temporary tablespace temp
tempfile '/u01/oradata' size 10M;
2.默認臨時表空間(只能有一個)
創建用戶時,如果沒有指定臨時表空間,會使用數據庫級別的臨時表空間。
3.修改數據庫臨時表空間
alter database default temporary tablespace temp2;
4.默認表空間不能被刪除,不能offline.
Oracle 10g表空間創建的完整步驟
當在數據庫中創建用戶時,基於應用性能和管理方面的考慮,最好為不同的用戶創建獨立的表空間。
1.創建表空間
不論是Lnux環境,還是Wndows環境,都要首先創建好表空間的存放路徑,根據自己的情況修改。如:
/opt/oracle/oradata/cocis 或 D:\oracle\oradata\cocis
若事先不創建該目錄路徑,則在創建表空間的時候會出錯。
通過pl/sql登錄到Oracle數據庫上,然后執行菜單:文件/新建/命令窗口 ,打開一個命令窗口然后在該命令窗口中執行腳本創建和刪除表空間
引用
創建表空間
Sql>create tablespace histdb datafile 'D:\oracle\product\10.2.0\oradata\orcl\histdb.dbf' size 200m autoextend on next 10m maxsize unlimited;
Sql>alter database datafile 'D:\oracle\product\10.2.0\oradata\orcl\histdb.dbf' autoextend on;
1) DATAFILE: 表空間數據文件存放路徑
2) SIZE: 起初設置為200M
3) UNIFORM: 指定區尺寸為128k,如不指定,區尺寸默認為64k
4) 空間名稱histdb 與 數據文件名稱 histdb.dbf 不要求相同,可隨意命名.
5) AUTOEXTEND ON/OFF 表示啟動/停止自動擴展表空間
6) alter database datafile ' D:\oracle\product\10.2.0\oradata\orcl\histdb.dbf ' resize 500m; //手動修改數據文件大小為500M
刪除表空間
DROP TABLESPACE histdb INCLUDING CONTENTS AND DATAFILES;
表空間已創建。
2.為應用創建用戶
創建用戶的同時,為用戶指定缺省的永久表空間和臨時表空間。
SQL> create user cocis identified by cocis
2 default tablespace cocis
3 temporary tablespace temp;
用戶已創建。
SQL> select username,default_tablespace,temporary_tablespace
2 from dba_users
3 where username='COCIS';
USERNAME DEFAULT_TABLESPACE TEMPORARY_TABLESPACE
------------------------------ ------------------------------ ------------------
COCIS COCIS TEMP
SQL> select username,user_id,password,default_tablespace,temporary_tablespace
2 from dba_users
3 where username='COCIS';
USERNAME USER_ID PASSWORD TEMPORARY_TABLESPACE
------------------------------ ---------- ------------------------------ -----------------------
COCIS 61 E031F623C0F15D34 COCIS
3.權限的授予
SQL> grant connect,resource to cocis;
授權成功。
注釋:當用戶創建之后,一般只需要授予CONNECT和RESOURCE這兩個角色即可。若要單獨進行授權,則需執行單獨的授權命令,如grant create table to cocis;等。
如果要授予SYSDBA的權限給用戶則用如下命令
SQL> grant SYSDBA to cocis;
---------------------------------------------------
SQL> revoke unlimited tablespace from cocis;
撤銷成功。
SQL> alter user cocis quota unlimited on cocis;
用戶已更改。
注釋:為了更嚴謹的管理,可以回收用戶的UNLIMITED TABLESPACE權限,然后對用戶的空間限額進行單獨授權。
Oracle管理命令集錦
創建表空間:
CREATE TABLESPACE lmtbsb DATAFILE '/u02/oracle/data/lmtbsb01.dbf' SIZE 50M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K BLOCKSIZE 8K;
CREATE TEMPORARY TABLESPACE lmtemp3 TEMPFILE '/u02/oracle/data/lmtemp301.dbf' SIZE 25M TABLESPACE GROUP group1;
CREATE TABLESPACE lmtbsb DATAFILE '/u02/oracle/data/lmtbsb01.dbf' SIZE 50M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
CREATE TABLESPACE lmtbsb DATAFILE '/u02/oracle/data/lmtbsb01.dbf' SIZE 50M EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
修改表空間:
ALTER TABLESPACE lmtbsb ADD DATAFILE '/u02/oracle/data/lmtbsb02.dbf' SIZE 1M;
ALTER TABLESPACE bigtbs AUTOEXTEND ON NEXT 20G;
ALTER TABLESPACE bigtbs RESIZE 80G;
ALTER DATABASE TEMPFILE '/u02/oracle/data/lmtemp02.dbf' OFFLINE;
ALTER DATABASE TEMPFILE '/u02/oracle/data/lmtemp02.dbf' ONLINE;
ALTER DATABASE TEMPFILE '/u02/oracle/data/lmtemp02.dbf' DROP INCLUDING DATAFILES;
ALTER DATABASE TEMPFILE '/u02/oracle/data/lmtemp02.dbf' RESIZE 18M;
ALTER TABLESPACE flights READ ONLY;
ALTER TABLESPACE flights READ WRITE;
表空間數據文件管理:
ALTER TABLESPACE users ADD DATAFILE '/u02/oracle/rbdb1/users03.dbf' SIZE 10M AUTOEXTEND ON NEXT 512K MAXSIZE 250M;
ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/users03.dbf' AUTOEXTEND OFF;
ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/stuff01.dbf' RESIZE 100M;
ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/stuff01.dbf' ONLINE;
ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/stuff01.dbf' OFFLINE;
ALTER TABLESPACE users OFFLINE NORMAL;
ALTER TABLESPACE users RENAME DATAFILE '/u02/oracle/rbdb1/user1.dbf','/u02/oracle/rbdb1/user2.dbf' TO '/u02/oracle/rbdb1/users01.dbf', '/u02/oracle/rbdb1/users02.dbf';
ALTER TABLESPACE example DROP DATAFILE '+DGROUP1/example_df3.f';
ALTER TABLESPACE lmtemp DROP TEMPFILE '/u02/oracle/data/lmtemp02.dbf';
ALTER DATABASE TEMPFILE '/u02/oracle/data/lmtemp02.dbf' DROP INCLUDING DATAFILES;
歸檔路徑管理:
show parameter archive;
alter system set log_archive_dest_1='location=d:\oracle\archivelog' scope=both;
create pfile from spfile;
ALTER SYSTEM SWITCH LOGFILE;
刪除表空間:
DROP TABLESPACE users INCLUDING CONTENTS;
DROP TABLESPACE users INCLUDING CONTENTS AND DATAFILES;
開啟歸檔模式:
SHUTDOWN
STARTUP MOUNT
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE ARCHIVELOG MANUAL;
ALTER DATABASE OPEN;
SHUTDOWN IMMEDIATE
系統進行一次歸檔:
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=3;
導出部分用戶的數據:
exp system/password@orcl owner=(user1,user2,user3) file=c:\test01.dmp
導入部分用戶的數據:
imp system/password@orcl fromuser=(user1,user2,user3) touser=(eia,eia_hn,eia_test) file=c:\test01.dmp
通過pl/sql登錄到Oracle數據庫上,然后執行菜單:文件/新建/命令窗口 ,打開一個命令窗口然后在該命令窗口中執行腳本創建和刪除表空間
2) SIZE: 起初設置為200M
3) UNIFORM: 指定區尺寸為128k,如不指定,區尺寸默認為64k
4) 空間名稱histdb 與 數據文件名稱 histdb.dbf 不要求相同,可隨意命名.
oracle學習總結
1.創建表:
create table IT_EMPLOYEES(
EMPLOYEE_ID NUMERIC(6) NOT NULL UNIQUE,
FIRST_NAME VARCHAR2(20),
LAST_NAME VARCHAR2(25) NOT NULL,
EMAIL VARCHAR2(25),
PHONE_NUMBER VARCHAR2(10),
JOB_ID VARCHAR2(10),
SALARY NUMBER(8,2),
MANAGER_ID NUMBER(6)
);
2.創建視圖:
(1)
create view prog_employees_1
as
select employee_id,first_name,last_name,email,
phone_number,salary,manager_id from it_employees
where job_id='IT_PROG';
(2)
create view prog_employees_1
as
select employee_id,first_name,last_name,email,
phone_number,salary,manager_id from it_employees
where job_id='IT_PROG';
with check option;
(3)刪除視圖
drop view prog_employees;
3.創建索引
(1)Create 【unique】【cluster】INDEX<索引名> ON<表名>(<列名> <次序>)
例:
create index IT_LASTNAME ON IT_EMPLOYEES(LAST_NAME);
用戶可以在查詢頻率最高的列上建立聚簇索引,由於聚簇索引是將索引和表記錄放在一起存儲,所以在一個基表上只能建立一個聚簇索引。在建立聚簇索引之后,由於更新索引列數據時會導致表中記錄的物理順序的變更,系統代價較高,因此對於經常更新的列不適宜建立聚簇索引。
(2)刪除索引
Drop index <索引名>;
4.Alter
(1) 增加一列
alter table It_Employees add BIRTH_DATE DATE;
(2)修改字段
alter table It_Employees modify manager_id number(8);
(3)刪除約束條件
alter table It_Employees drop unique(employee_id);
4.select / group by /having
注意:select子句后面只有兩類表達式,統計函數和進行分組的列明。
Having 子句對分組的結果進一步篩選,having子句與分組有關,而where子句與單個行有關。
select deptno,avg(sal),sum(sal),max(sal),min(sal),count(sal) from emp group by deptno;
select deptno,avg(sal),sum(sal),max(sal),min(sal),count(sal),count(*) from emp group by deptno having avg(sal) > 2000;
5.內連接inner join /外連接(左left outer join/右外連接 right outer join/全外連接 full <outer> join )
區別:內連接進行多表查詢時,返回的查詢結果集中僅僅包含符合查詢條件(where 條件和having條件)和連接條件的行。內連接消除了與另一個表中的任何行不匹配的行,而外連接擴展了內連接的結果集,除返回所有匹配的行外,還返回不匹配的行。
select empno,ename,dname from emp inner join dept on emp.deptno = dept.deptno where job='SALESMAN';
1 7499 ALLEN SALES
2 7654 MARTIN SALES
3 7844 TURNER SALES
4 7521 WARD SALES
5 5555 lipeng OPERATIONS
測試數據:deptno為null的
insert into
emp values(6666,'lipeng','SALESMAN',6666,to_date('2013-04-02','yyyy/mm/dd'),5000.00,1000.00,null);
select empno,ename,dname from emp left outer join dept on emp.deptno = dept.deptno where job='SALESMAN'
1 5555 lipeng OPERATIONS
2 6666 lipeng
3 7499 ALLEN SALES
4 7521 WARD SALES
5 7654 MARTIN SALES
6 7844 TURNER SALES
從結果可以看出:做外連接不僅包含連接相匹配的行,而且還包含左表emp中所有滿足where限制的行,而不論是否與右表相匹配。
5.union /union all/intersect/minus
union 將集合中的重復記錄濾除,而union all包含兩個子結果集重復的行。
select ename,SAL from emp where ename like 'S%' OR ename like 'J%'
union all
select ename,SAL from emp where ename like 'J%' OR ename like 'C%';
6.子查詢in/exists/比較運算符
(1)select empno,ename,deptno
from emp where deptno in (select deptno from dept where loc='CHICAGO');
執行順序:先執行括號內的子查詢,然后將查詢到的deptno結果跟emp中的deptno進行比較,若列值存在於這些返回值中,則外層查詢結果會在結果集中顯示該行。
(2)select empno,ename from emp where exists (
select * from dept where emp.deptno = dept.deptno and loc='CHICAGO'
);
(3)查詢emp表,將將薪資大於本職位平均薪資的雇員信息顯示出來。
select empno,ename,sal,job from emp
where job='SALESMAN' and sal >(
select avg(sal) from emp where job='SALESMAN'
);
7.數據操縱 INSERT/UPDATE/DELETE/TRUNCATE
update emp
set sal =
(select avg(sal) from emp where job='SALESMAN')
where empno=6666;
commit;
delete from emp where empno=5555;
DELETE/TRUNCATE區別:
如果確定要刪除表中所有記錄時,建議使用TRUNCATE,因為TRUNCATE刪除數據時要比DELETE快的多。但是TRUNCATE刪除數據后,不能用rollback來恢復數據,但是delete可以用。
Reuse storage/drop storage
Truncate table emp reuse storage;
Reuse storage表示刪除記錄后保存記錄占用的空間。
drop storage 表示刪除記錄后立刻回收記錄占用的空間。
8.授權grant/回收revoke
grant select on emp to sup2db;
revoke select on emp from sup2db;
9.字符類函數
select ASCII('A') big_A,ASCII('a') small_a from dual;
select CHR(65),CHR(97) from dual;
select concat('oracle','11g') oraclename from dual;
select initcap('hello world') name from dual;
select replace('feelblue','blue','yellow') from dual;
日期函數:
select add_months(hiredate,1) from emp;
第七章 oracle數據庫管理操作
一.增加安全性
解決的問題:例如,銷售經理需要訪問數據庫中有關該部門員工的信息。但是該經理沒有理由訪問有關其它部門員工的信息。
(1)以系統管理員的身份進行登錄:
conn sys/change_in_stall as sysdba;
(2)激活人力資源示例數據庫賬戶,連接到HR示例數據庫
Alter user hr identified by hr account unlock;
Conn hr/hr;
查看hr用戶下面的所有表:
(1)連接到hr用戶
(2)Select table_name from user_tables;
或者使用 Select * from tab;
(3)為銷售經理創建用戶ID,用戶名salesmanger,密碼sales,並將connect權限授予銷售經理。
(4) Conn sys/change_in_stall;
grant connect to salesmanger identified by sales;
(4)定義一個查看員工編號和姓名的視圖,將數據庫中員工等信息隱藏起來。
create view emp_sales
as
select employee_id,first_name,last_name from hr.employees;
}
(5)授予salesmanger查看emp_sales視圖的權限
grant select on emp_sales to salesmanger;
(6)讓銷售經理以用戶salesmanger登錄數據庫后,銷售經理可以查看員工的編號和姓名,但是不允許查看員工的工資信息,這樣在一定程度保證了數據的安全性。
conn salesmanger/sales
select * from sys.emp_sales;
select * from sys.emp_sales;
二.隱藏數據的復雜性
現有一機場數據庫,擁有pilotSkills表和hanger表,
其中表pilotSkills描述了飛行員和他們能夠駕駛的飛機信息,表hanger描述了停在飛機棚中的飛機信息。
現在要求查詢能夠駕駛飛機棚中每一架飛機的飛行員的姓名。
--創建pilotSkills表
create table pilotSkills(
pilot char(15) not null,
plane char(15) not null,
primary key(pilot,plane)
);
create table hanger(
plane char(15) primary key
);
創建視圖,實現“找出能夠駕駛飛機棚中每一架飛機的飛行員的姓名”
Create view QualifiedPilots(pilot)
As
Select ps.pilot from pilotSkills ps,hanger h
Where ps.plane = h.plane
Group by ps.pilot
Having count(ps.plane) = (select count(plane) from hanger);
select pilot from QualifiedPilots;
三、實現記錄的唯一性
--增加主鍵
Alter table stu add constrait c1 primary key(sno);
--刪除主鍵約束
Alter table stu drop constrait c1;
--創建一個名為ind1的唯一索引
Create unique index ind1 on emp(empno);
當插入一條重復數據的時候會報錯。
四.實現數據的完整性
Alter table student modify sname not null;
第八章 數據庫用戶管理
1.創建一個用戶使其具有登陸,連接的系統權限
create user stu identified by stu;
grant create session to stu;
2.用戶HR將Employees表的查詢、查詢、更改表的對象的權限授予stu,那么stu具有了對HR的employees表的select對象權限,但不具備其它對象權限。
conn hr/hr;
grant select,insert,update on employees to stu;
select first_name,last_name,job_id,salary from hr.employees where salary>15000;
3.授權角色
數據字典dba_roles可以了解數據庫中全部的角色信息。
select * from dba_roles;
角色connect、resource和DBA主要用於數據庫管理。對於數據庫管理員分別授予Connnect、resources和DBA角色。
創建角色:
create role access_database;
Create role access_database identified by 123;
(2) 授權
grant create session,create table,create view to access_database;
(3)可將角色授予用戶,使用戶獲得該角色所擁有的所有權限。
grant access_database to scott;
4.修改用戶的默認角色
(1)設置用戶的角色失效
Alter user scott default role none;
用戶角色失效后,該用戶中的權限將全部丟失。用戶連接數據庫權限create session存儲於ACCESS_DATEBASE中,當該角色失效后,用戶scott就不能登錄到數據庫中。
(2)設置用戶角色生效
Alter user scott default role all;
(3)查看session_roles視圖,確認會話所用的角色
connect stu/stu;
select * from session_roles;
結果:
ROLE
------------------------------
CONNECT
RESOURCE
(4)為當前用戶啟用ACCESS_DATABASE角色。
Set role access_database;
5.回收權限
*逐一回收
Connect sys/change_in_stall as sysdba;
(1)系統權限的回收
收回scott用戶的select any dictionary系統權限。
Revoke select any dictionary from scott;
(2)對象權限的回收
Hr用戶回收scott對employees表的select對象權限。
Connect hr/hr
Revoke select on employees from scott;
用戶HR將基表Employees的所有權限從public用戶回收。
Revoke all on employees from public;
6.刪除角色
Drop role access_database;
刪除用戶:
Drop user stu;
7.使用數據庫連接
是為了訪問遠程數據庫而創建的數據庫通信鏈路。
鏈接到指定的用戶:
CREATE DATABASE LINK link_name CONNECT TO USER IDENTIFIED BY password USING server_name;
link_name:表示要鏈接到遠程數據庫名。
Server_name:表示遠程數據庫的服務名。
數據庫空間管理
1.設置其它表空間初值
例如學生信息庫,要把有關學生信息的一些表放到一個表空間中,如果有2000多名學生,則存儲學生個人信息最多也不超過100MB的空間,但是為了保險,我們可以設置兩個數據文件,每個數據文件的大小均設置為100MB
create Tablespace student_info
datafile 'C:\oracle\product\10.2.0\oradata\orcl\student01.dbf'size 100M, 'C:\oracle\product\10.2.0\oradata\orcl\student02.dbf'size 100M
default storage(
initial 10M
next 10M
minextents 1
maxextents 10
pctincrease 20
)
online;
說明:
Storage 指定表空間的存儲參數,這些參數對於數據庫的性能影響很大,選着時要慎重。
initial 10M:--表空間student_information初始空間大小為10MB
next 10M: -- 當初始區間填滿后,分配第二個區間的大小為10MB
pctincrease 20:--當在填滿時,按照20%的增長速率分配區間大小。
minextents 1:-- 初始為該表空間分配1個區間
maxextents 10: --最多為該表空間分配10個區間
2.空間充足的管理
查看表空間使用情況,使用以下方法避免空間的不足:
(1)使用數據字典動態監視
這里使用的數據字典是dba_free_space和user_free_space,可以查看其內容來得到有關表空間的空間信息。
以system的身份登錄:
select * from dba_free_space;
(2)向表空間增加數據文件
alter tablespace student_info
add datafile
'C:\oracle\product\10.2.0\oradata\orcl\student03.dbf'
size 2M;
注意:通過上述方法給表空間分配太多的空間並不好,因為這樣做無疑造成較大空間的浪費。因此建議做好空間估計,並合理利用空間,無論是對減少資源浪費還是提高系統性能都有好處。
3.解決空間不足的方法
擴充數據庫存儲空間常用的方法有如下三種:
(1)增加SYSTEM表空間中數據文件的大小
(2)創建新的表空間
(3)創建新的數據文件
(1)增加SYSTEM表空間中數據文件的大小
數據庫中的數據其實都是存儲在數據文件中的,SYSTEM表空間的數據文件是在創建數據庫的時候給定的,並且給其大小給定了一個初值。那么System表空間不夠時就可以Alter DataBase命令動態的增加SYSTEM表空間數據文件的大小。
查11g
Alter DATABASE orcl
Datafile 'C:\oracle\product\10.2.0\oradata\orcl\system01.dbf'
resize 750M;
(2)創建新的表空間
表空間其實是一個邏輯概念,它所有數據和結構信息都存儲在一個或者多個數據文件當中,當需要擴充數據庫存儲空間時,可以創建新的表空間並指定它的數據文件,系統就會划出一塊磁盤空間給這個表空間.
注意:創建數據庫時最好能創建幾個私用的表空間,因為SYSTEM表空間是系統表空間,其中存儲數據字典和數據庫結構等重要信息,他是數據庫運行的基礎,若是把所有信息都存放在這個表空間里,一方面會迅速占滿它的空間,另一方面也加大了出錯的可能性。
1. Create tablespace 命令簡介
Create tablespace 表空間名
Datafile{
文件名[autoextend {off | on next數值 maxsize數值}],
}
Mininum extend 數值
Logging | nologging
Default storage{...}
Online | offline
Permanent | temporary;
2.用create tablespace創建表空間
create tablespace test
datafile 'C:\oracle\product\10.2.0\oradata\orcl\test01.dbf' size 2M
default storage(initial 2M
next 2M
minextents 2
maxextents 10
pctincrease 20
)
online;
(3)動態的增加表空間
1.Alter tablespace 命令簡介
向表空間中增加數據文件使用的命令:
Alter tablespace 表空間名
Loggin | nologging
Add datafile{數據庫文件名 [autoextend],...}
Rename datafile 原文件名 to 新文件名
Coalesce
Default storage
Mininum extend 數值
Online | offline [normal | temporary | immediate | for recover]
[begin | end] backup
Read only | write
Permanent | temporary
說明:
Add datafile:用於增加數據文件,可在聯機或者是脫機下增加,但所增加的數據文件不能是其它表空間或者數據庫已經使用的,它同樣可帶autoextend參數選項。
Coalesce:用於所有相連的空間范圍合並到相鄰較大的范圍當中去,這一項不能被其它命令所指定。
[begin | end] backup:用於開始或者結束聯機備份表空間的數據文件,在備份過程中用戶可以繼續訪問該表空間,但備份過程中不能將表空間脫機,也不能關閉數據庫。
Read only | write:其中Read only表示此表空間的內容是只讀的,不能像其中寫入任何數據,而read write則可以對此表空間的數據進行讀寫操作。
向表空間test中增加兩個大小為10MB的數據文件
Alter tablespace test
Add datafile
'C:\oracle\product\10.2.0\oradata\orcl\test02.dbf size 10M' ;
oracle SQL學習總結
1.候選鍵、主鍵和外鍵約束:
create table Employee(
id int primary key,
name char(20),
birthday Date,
address varchar(30),
city varchar(10),
sex char(2),
salary numeric(10,2),
dno int,
pno int
unique(name,birthday)
);
create table Employee(
id int,
name char(20),
birthday Date,
address varchar(30),
city varchar(10),
sex char(2),
salary numeric(10,2),
dno int Reference Department(deNumber),//外鍵約束
pno int
unique(name,birthday)//候選鍵
primary key(id)//員工表的主鍵
);
外部鍵約束增加了關系數據庫表的關聯完整性,可以較好的保證數據庫表之間的關聯完整性。主鍵所在的表成為父表,為主控方,對應的外部鍵所在的表為子表,為被控方。
dno int Reference Department(deNumber)工作人員所屬的部門號(dno)是相對於Department部門表的外部鍵。這樣定義以后若想添加一個工作人員的記錄,添加的記錄中dno列的值必須在Department記錄中存在與其相同的值,否則就無法添加記錄。
也可以用另一種方式添加外鍵,若對應的主鍵是多個列的組合,那么外部鍵的定義只能放在所有列之后。只能是這種定義:
create table Employee(
id int,
name char(20),
birthday Date,
address varchar(30),
city varchar(10),
sex char(2),
salary numeric(10,2),
dno int,
pno int,
unique(name,birthday)//候選鍵
primary key(id)//員工表的主鍵
foreign key(dno) references Department(deNumber)
);
在對子表中的外部鍵或對父表的主鍵進行更新時(可能會產生的關聯完整性的問題的四種情況)總結:
1.在子表中添加記錄:
在子表Employee中添加一個記錄,其dno列的值必須與Department表中dNumber列中的一個值相同。或者添加dno列值為NULL,否則將破壞數據庫的完整性。但是向父表Department中添加新記錄不會產生這個問題。
2.更新子表外部鍵的值:用update更新后的值必須與父表中的一個主鍵相匹配,或者更新為NULL,否則將產生錯誤。
3.刪除父表中的記錄:從父表中刪除一個記錄,子表中對應該值的外部鍵的記錄不在與父表中的任何一個主鍵值相匹配。例如從父表Department表中刪除dNumber列值為3的記錄,那么子表Employee表中所有dno列值為3的記錄(即員工所在部門為3號)的記錄都將產生沒有匹配主鍵值的問題。然而從子表中刪除記錄並不會產生這個問題。
4.更新父表中主鍵的值:父表Department中更新一個主鍵的值后,子表Employee中與原來值相對應的外部鍵的值也將不再與父表中任一主鍵的值相匹配。
下面是解決上面問題的方法:
1.使用Restrict關鍵字:父表中的主鍵值在子表中有許多具有該值的外部鍵的記錄時,若在約束中指定Restrict關鍵字,則企圖刪除父表中的語句將被拒絕,企圖更新父表中記錄的主鍵值也將被拒絕。
2.CASCADE關鍵字:當父表中一個記錄被刪除時,cascade可以使其子表中所有與該記錄的主鍵值對應的記錄的(例如父表Department中的dNumber為3的值被刪除,在子表中外鍵dno為3的記錄都將被刪除)都將從子表中刪除。而更新父表中一個主鍵值時,CASCADE可以使其子表中對應外部鍵的值也自動被修改。
3.SET NULL:當父表中一個記錄被刪除時,SET NULL可以使其子表中所有與該記錄的主鍵值對應的外部鍵的值將自動被賦值為NULL。更新同理。
4.SET DEFAULT: 當父表中一個記錄被刪除時,SET DEFAULT可以使其子表中的所有與該記錄的主鍵值對應的外部鍵的值都將被賦值為缺省值。
2. NULL 和NOT NULL約束:
NULL值並不表示0值或空值,而是表示一個丟失、不知道,不可用的值。
舉例子說明該約束:例如,Employee表中,如果沒有name就無法知道工作人員的名字,一般來說公司都要記錄工作人員的名字,因此name的值可以規定為NOT NULL,而工作人員的生日,地址,等並不是一定要有的,也允許其丟失,這些列值允許為NULL。
作為區分每個表的主鍵的值,不可以為空值,而對於外部鍵來說,NULL值是允許存在的。
舉例來說明:在Company數據庫中,Employee表中pno列是相對於Project的外部鍵,並不是公司的一個員工都參與一個工程項目的工作,如總裁等。因此Employee表中的pno允許有NULL值存在,(員工表Employee的總裁的外部鍵pno可以為NULL)。
3. 校驗約束
舉例來說明:在Employee增加校驗約束條件
Salary NUMERIC(10,2)CHECK(Salary >1000.00 )后Employee表中拒絕小於等於1000的所有記錄。
用UPDATE Employee Set Salary=900.00 where id = 2002,該語句產生錯誤。
在員工表中sex列一般限制男和女兩個值,可以增加一個檢驗約束來實現對sex列的限制。
create table Employee(
id int,
name char(20),
birthday Date,
address varchar(30),
city varchar(10),
sex char(2) check(sex in('男','女')),
salary numeric(10,2),
dno int Reference Department(deNumber),//外鍵約束
pno int
unique(name,birthday)//候選鍵
primary key(id)//員工表的主鍵
Constraint sex_check CHECK(sex in('男','女')),
Constraint salary_check CHECK(salary > 1000.00),
);
使用Constraint關鍵字進行檢驗約束的定義。這樣我們可以在以后必要的時候對定義的約束進行激活和撤銷。
5.默認值(default)
舉例:salary numeric(10,2) default 3000.00,當對表添加記錄時,若對設有默認值的列沒有指定明確的值,系統自動會進行默認的添加。
Insert into Employee values ('peter','2012-02-20','','北京','男',1004,1,3);
6.Company數據庫表的創建
1.Employee 表:
create table Employee(
id int primary key,
name char(15) NOT NULL, /*員工名字*/
birthday Date, /*員工生日*/
address varchar(30), /*員工住址*/
city char(10), /*員工所在城市*/
sex char(2) check(sex in('男','女')) default '男',
salary numeric(10,2) , /*員工工資*/
dno int Reference Department(dnumber), /*外鍵約束 部門號*/
pno int,
foreign key(dno) references Department(pnumber), /*外鍵約束 項目號*/
--unique(name,birthday)//候選鍵
--primary key(id)//員工表的主鍵
Constraint sex_check CHECK(sex in('男','女')),
Constraint salary_check CHECK(salary > 1000.00),
);
2.Department部門表
Create table Department(
dnumber int primary key, /*主鍵約束 部門號*/
dname char(20) unique, /*公司中每個部門的名稱應該是不同的*/
mgrid int, /*部門負責人的id號*/
mgrdate DATE /*負責人上任日期*/
);
3.Project項目表的
Create table Project(
pnumber int primary key, /*項目號*/
pname varchar(20) unique, /*項目名稱*/
pmgrid int,
budget NUMRIC(10,2), /*項目預算*/
Gross NUMRIC(10,2), /*預計總收入*/
pstartime Date, /*項目開始時間*/
pendtime Date /*項目結束時間*/
);
4.Paccpeter項目接收方表:
說明:由於不同項目的接收方可以相同,因此以pnumber列作為表的主鍵。同時pnumber列是Paccpeter表相對於Project表的外部鍵。若父表Project不存在的項目號在子表Paccpeter也不能存在。
Create table Paccpeter(
pnumber int primary key, /*項目號*/
accepter char(20) NOT NULL, /*項目接收方不允許為空*/
city char(10),
acceptdate Date, /*接收日期*/
pnumber reference Project(pnumber) /*外鍵pnumber*/
);
5.Dep_Pro部門和項目連接表的創建:
說明:表中只包含兩列:記錄部門號的dnumber和記錄項目號的pnumber,該表中以二者的組合作為主鍵。同時dnumber是相對於Department表的外部鍵,而pnumber列是相對於Project表的外部鍵。
CREATE TABLE Dep_Pro(
dnumber INT ,
pnumber INT ,
PRIMARY KEY(dnumber,dnumber),
dnumber REFERENCES Department(dnumber),
pnumber REFERENCES Department(pnumber),
);
7創建索引:
1.在單列上創建索引:
在員工表id列上創建索引:
CREATE INDEX id_index ON Employee(id);
Select name,sex,id,salary from Employee;
查詢的結果會按照索引的順序進行排列。
2.在多列上創建索引:
CREATE INDEX name_salary_index ON Employee(name,salary);
在多列上創建索引時將按照列出的順序進行排列。先將按照name進行索引,然后在按照salary進行索引。
3.創建唯一索引:
唯一索引可以在單列也可以在多列上創建,唯一索引可以避免相同值的多個記錄的出現,唯一索引是指兩個記錄中沒有同一個索引值。
CREATE UNIQUE INDEX id_index ON Employee(id);
8.修改數據庫:
1.向表中添加列:
ALTER TABLE Tablename
ADD columnname datatype
[DEFAULT expression]
[REFERENCES Tablename(columnname)]
[CHECK constraint]
例如:如果要在 Department 表中添加city 列,默認部門所在城市為北京。
Alter table Department add city char(10) default '北京';
也可以添加新列的約束:例如,公司新規定每個項目的預計總收入不得少於10000.00元,
則可以為Project表中添加一個約束:
ALTER TABLE Project CONSTRAINT gross_check (gross > 10000.00);
2.修改已有列
ALTER TABLE Tablename
MODIFY columnname [datatype]
[DEFAULT expression]
[REFERENCES Tablename(columnname)]
[CHECK constraint]
例如,將Employee表中的name列的長度變成30個字符長:
ALTER TABLE Employee MODIFY NAME CHAR(30) ;
不能修改數據類型,即不能從int改到 char,可以減少字符串的長度,然而,
不能長度少於已有數據中長度最大的值。
也可以修改列所具有的約束:
例如,將 Employee表中sex列的默認值從“男”修改成“女”:
ALTER TABLE Employee MODIFY sex DEFAULT '女';
在SQL 中,也可以使用 ALTER TABLE 語句刪除表中已有的列。
例如從Employee表中刪除birthday:
ALTER TABLE Employee DROP birthday;
9.刪除索引:
Drop index indexname;
使用索引的原因總結:
使用索引是為了提高檢索數據的速度,創建索引后,我們就可以通過索引來查找數據,而不必掃描每個記錄。這好比書的目錄一樣,使我們很快就會定位到我們要找的那一頁。但是我們不能對每一列進行索引。因為,創建和維護索引需要占用數據庫的時間和空間的。
1.適合使用索引的情況:
(1)大量值:表中的記錄在該列上含有大量不同的值時,為表建立索引可以起到很好的作用。
(2)經常在查詢中使用:某列在查詢中使用的越多,在該列上創建的索引所能起到的加快速度的作用越明顯。
(3)查詢返回記錄相對較少時:當返回的記錄大大少於表中的記錄總量的時候,索引能很好的加快查詢速度。若總是返回大量的記錄,由於索引本身的開銷,索引並不能很好的提高檢索的速度。
(4)用於兩個表連接的操作:由於索引使每個表中的記錄按順序排列,所以使用被索引的列進行連接操作,可以提高連接速度。
2.不適和建立索引的情況:
(1)小型表:對於小型表,由於表中的記錄不多,而索引自身也會增加開銷,通過使用索引並不能提高性能,所以小型表不使用索引。
(2)只有很少值的列不適合建立索引。
(3)用戶查詢方式經常變化的表不適合建立索引。
(4) 在具有較多的NULL值的列不適合創建索引。
(5) 定期更新或者修改的列不斷的更新或者修改導致索引頁需要進行不斷的更新,額外的消耗過多。
10.多表連接查詢:
1.什么是連接?
定義:連接是將多個表的數據結合到一起的查詢,即連接操作可以在一個select語句中完成從多個表中查找和處理數據。使用連接時可以使用相同名字的列,例如可以使用pnumber連接Project表與Paccpter表;也可以使用不同名字的列進行連接,例如使用Employee表中的id列與Department的mgrid列進行連接。進行連接時用於連接的必須是可連接的列,即要求它們具有相同的數據類型。
一般來說,連接的語法可以分為二種:
(1) 傳統的連接語法:select from/where包含多個表的連接查詢
傳統的FROM/WHERE 連接語法基本格式如下:
SELECT select_list
FROM Table1name, [ Table2name, ...]
WHERE [Table1name.]column operator [Table2name.]column
用上面的表:
例如:查詢部門負責人的負責的部門號、負責人名字、id 號、性別及工資。
分析:需要連接連個表:Employee表和Department表
原因:在Employee表中並沒有存儲誰是什么部門的負責人,負責人的id 號存儲在Department 表中。(參照上面的表)
Select dnumber,name,id,sex,salary from Employee, Department where id=mgrid;
(2) SQL連接語法:join關鍵字來實現連接的操作JOIN CROSS JOIN及NATURAL
SELECT select_list
FROM Table1name [CROSS | NATURAL] JOIN Table2name
[ON [Table1name.]column operator [Table2name.]column]
[WHERE conditions]
● 第一行中的select_list仍然是選擇的列的名稱,但是需要注意的是,如果使用兩
個表中有相同名稱的列,則必須限定是哪個表中的列;
● 第二行中關鍵字CROSS與NATURAL 是可選項,可以使用也可以不使用。如果
選擇了CROSS或NATURAL 關鍵字,那么就不能使用ON關鍵字;
● 單獨使用JOIN 關鍵字時,需要使用ON關鍵字來設定連接的條件;
● 使用CROSS JOIN 時,不能使用關鍵字ON,因此必須使用WHERE子句設定連
接的條件。因為如果不設定連接條件,將返回表之間的每一種可能組合(即笛卡
爾積),連接結果將非常龐大;
● NATURAL JOIN 只 有在兩個表有相同名稱的列時才能使用,將在同名列上進行連
接。因此,不必使用關鍵字 ON 或 WHERE 子句設定連接條件。當然,使用 WHERE
子句限制查找的行仍然是可以的。
例如查詢:部門負責人的負責的部門號、負責人名字、id 號、性別及工資。
用join連接:
Select dnumber,name,sex,id,salary from Employee join Department on mgrid = id;
Results
dnumber name sex id salary
———— ————— ——— —— ————
6 魏成 男 6001 5000.00
1 林志千 男 1001 6000.00
2 陳廣海 男 2001 5000.00
3 張宇 男 3001 5000.00
4 張峰 男 4001 7000.00
5 李志深 男 5001 5000.00
用cross join連接:
SELECT dnumber, name, sex, id, salary FROM Employee CROSS JOIN Department
WHERE id = mgrid
結果是與上面相同的。
但是這里不能用NATURAL JOIN連接。雖然Employee的id列和Department表mgrid列的數據類型和存儲的內容相同,但是名稱不相同,所以不能用自然連接。
Project的表和Paccpter表中有兩個相同的列pnumber,則可以對這兩個表進行NATURAL JOIN連接。
Select pnumber,accepter,budget from Project NATURAL JOIN Paccpter;
Results
pnumber accepter budget
———— ———————— —————
101 藍科通訊公司 110000.00
102 華夏技術有限公司 140000.00
103 漢升咨詢公司 150000.00
104 神州發展有限公司 120000.00
105 四海貿易有限公司 100000.00
201 化天通訊公司 200000.00
202 日勝公司 220000.00
203 華田汽修公司 250000.00
204 東勝有限公司 240000.00
301 科華貿易公司 300000.00
302 新安有限公司 320000.00
303 華田汽修公司 360000.00
也可以用傳統的from/where循環代替:
Select pnumber,accepter,budget from Project,Paccpter where Project.pnumber = Paccpter.pnumber;
用join on代替:
Select pnumber,accepter,budget from Project join Paccpter on Project.pnumber = Paccpter.pnumber;
2處理連接:
兩個表有意義的連接到一起,必須有公共數據。
Project表:
SELECT pnumber, budget FROM Project;
Results
pnumber budget
———— —————
101 110000.00
102 140000.00
103 150000.00
104 120000.00
105 100000.00
201 200000.00
202 220000.00
203 250000.00
204 240000.00
301 300000.00
302 320000.00
303 360000.00
Paccepter 表:
SELECT pnumber, accepter FROM Paccepter;
Results
pnumber accepter
———— ———————
101 藍科 通訊公司
102 華夏 技術有限公司
103 漢升 咨詢公司
104 神州 發展有限公司
105 四海 貿易有限公司
201 化天通 訊公司
202 日勝公司
203 華田汽 修公司
204 東勝有 限公司
301 科華貿 易公司
302 新安有 限公司
303 華田汽 修公司
在理想的情況下,對數據庫中的表進行連接時使用表的主鍵與相應外部鍵。因為,設計數據庫時,主鍵與外部鍵在邏輯上就是互相聯系的,並且主鍵與外部鍵之間具有一致性,會保持主鍵列與外部鍵列在值上的一致。主鍵與外部鍵可以很好的保持數據庫完整性。
較好的連接應該符合以下要求:
● FROM 子句中必須包含用於連接的所有表,不能僅包含一部分用於連接的表;
● 進行連接的列名稱可以不同,除非要使用NATURAL JOIN,如果需要使用相同
名稱的列必須為其加上表名作為限制,不然會產生混淆;
● 用於連接的列必須有相同的數據類型,或可以自動進行類型轉換。不同類型的數
據是不能進行連接的。例如,不能使用Employee表中的birthday 列與Department
表中的dname 列進行連接;
● 用於連接的列必須具有相同的意義,這是最重要的一點,沒有相同意義的列的連
接是毫無用處的。例如,雖然Employee表中的name列與Department 表中的dname
列數據類型相同,但是這兩個列毫不相干,連接是沒有意義的。
查詢的時候必須指定查詢條件:
例如:查找正工作在與項目接收方所在城市相同的工作人員。
方法一:Select id,name,sex,city from Employee,Paccepter where Employee.city = Paccepter.city;
方法二: select id,name,sex,city from Employee join Paccepter where Employee.city = Paccepter.city;
如果沒有連接條件,查詢的結果將是兩個表的笛卡爾積。結果行數將大的驚人。
3.笛卡爾積
表一:
Results
A B C
—— —— ——
a b c
d e f
b c d
表二:
Results
D E
—— ——
d e
e f
則表一和表二的笛卡爾積為:
Results
A B C D E
—— —— —— —— ——
a b c d e
a b c e f
d e f d e
d e f e f
b c d d e
b c d e f
最后可以有:3*2=6條記錄。
用於指定連接的表越多,其笛卡爾積的結果就越驚人,越需要很好的指定連接條件。
由於連接過程中使用了笛卡爾積,因此連接操作會導致性能的下降。
使用連接時應該遵循一定的原則:
● 用於連接的列已經創建了索引。因為索引會單獨保存在磁盤上,且將數據按照一
定順序進行了排列,索引的使用可以加快訪問的速度;
● 用於連接的列具有相同的數據類型,包括是否允許空值。如果需要系統自動進行
類型轉換是需要花費較多時間的,特別是在表中記錄很多時,類型轉換所花費的
時間將會很多.
4.連接中運算符號的使用:
例如:項目Project 表中的項目完成時間penddate 列的值大於Paccepter 表中的項目
預計接收時間acceptdate列的值。
Select pnumber, accepter, penddate, acceptdate from Project,Paccepter where penddate > acceptdate AND Project.pnumber = Paccepter.pnumber;
Results:
pnumber accepter penddate accedate
———— —————— —————— ——————
201 化天通訊公司 2001-12-20 2001-12-15
303 華田汽修公司 2002-04-25 2002-04-15
[2rows]
例如:Project 表中的項目完成時間penddate 列的值不等於Paccepter 表中的項目預
計接收時間accedate 列的值。
Select pnumber, accepter, penddate, acceptdate from Project,Paccepter where penddate <> acceptdate AND Project.pnumber = Paccepter.pnumber;
Results
pnumber accepter penddate accedate
———— —————— —————— ——————
201 化天通訊公司 2001-12-20 2001-12-15
204 東勝有限公司 2002-08-01 2002-08-06
303 華田汽修公司 2002-04-25 2002-04-15
[3rows]
在進行連接的時候還可以使用where子句限制查找到的行。
例如,只需要查看項目號小於201 的所有項目的項目編號、接收方及項目成本。
方法一:
Select pnumber, accepter, budget from Project, Paccpeter where Project.pnumber = Paccpeter.pnumber AND Project.pnumber < 201;
方法二:
Select pnumber, accepter, budget from Project join Paccpeter on Project.pnumber = Paccpeter.pnumber where Project.pnumber < 201;
Results
pnumber accepter budget
———— —————— —————
101 科華貿易公司 110000.00
102 華夏技術有限公司 140000.00
103 科華貿易公司 150000.00
104 神州發展有限公司 120000.00
105 四海貿易有限公司 100000.00
[5rows]
5.多表的連接:
需要知道工作人員本身以及其所屬的部門和所參與的項目的詳細信息,
Employee表、Department 表、Project 表這三個表以得到所需的信息。
但是多個表連接或者多個表連接時引起的性能下降更加嚴重。
例如:有三個表,每個表都包含100行記錄,則三個表連接將產生100*100*100行的組合表。處理這樣的組合表要花費的時間將會長的多。
例如:將返回工作人員本身以及其所屬的部門和所參與的項目的詳細信息:
分析:需要連接三個表:Employee表,Department表,Project表。
Select id,name,dnumber,dname,mgrid,pnumber,pname,gross from Employee, Department, Project where dno = dnumber AND pno = pnumber;
數據庫設計時介紹了三種關系和數據庫連接的關系:
(1)一對一的關系:
例如:項目Project表和項目接收Paccepter表時一對一的關系:
可以通過項目號pnumber進行連接:
方法一:Select pnumber,accepter,budget from Project join Paccepter on Project.pnumber = Paccepter.pnumber where Project.pnumber = 102;
方法二:Select pnumber,accepter,budget from Project,Paccepter where Project.pnumber = Paccepter.pnumber AND Project.pnumber = 102;
Result:
pnumber accepter budget
———— —————— ————
102 華夏技術有限公司 140000.
[1row]
(2)一對多的關系:
一個表的一條記錄可以對應另一個表的若干條記錄:
查詢的時也可以對兩個表進行連接:例如:部門和工作人員之間就是一對多的關系。
希望由工作人員記錄得出其所屬的部門的信息就需要進行連接:
Select id,name,dnumber, mgrid from Employee,Department where dno = dnumber AND name = ‘lipeng’;
Select id,name,dnumber,mgrid from Employee join Department on dno = dnumber where name = ‘lipeng’;
Results
name id dnumber mgrid
————— —— ———— ———
李明 1002 1 1001
[1row]
(3) 多對多的關系:
無法對多對多的兩個表進行連接,則必須使用創建數據庫時專門為多對多的關系創建的連接表來實現。因此需要包含三個表的組合來連接數據。
例如:一個部門可能同時進行一個或者多個項目,一個項目可能由一個或者多個部門來配合才能很好的完成。
部門與項目間存在着多對多的關系。可以通過連接表來實現部門與項目的連接。
SELECT dnumber, mgrid, pnumber FROM Department JOIN Dep_pro
ON Department.dnumber = Dep_pro.dnumber Project JOIN Dep_pro ON Project.pnumber = Dep_pro.pnumber WHERE Project.pnumber = 301
SELECT dnumber, mgrid, pnumber FROM Department,Project,Dep_pro
WHERE Department.dnumber = Dep_pro.dnumber AND
Project.pnumber = Dep_pro.pnumber AND
Project.pnumber = 301
oracle導入導出,如何創建一個賬戶,並在這個賬戶中導入導出表
oracle導入導出,如何創建一個賬戶,並在這個賬戶中導入導出表
1.如何在數據庫中創建一個賬戶:
第一,啟動sql*puls
第二,以system/manager登陸
第三,create user 用戶名 IDENTIFIED BY 密碼 (例如:bione1/bione1)
第四,GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,
DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,
DBA,CONNECT,RESOURCE,CREATE SESSION TO 用戶名字
2.導入,導出
導入導出命令:
Oracle數據導入導出imp/exp就相當於oracle數據還原與備份。exp命令可以把數據從遠程數據庫服務器導出到本地的dmp文件, imp命令可以把dmp文件從本地導入到遠處的數據庫服務器中。 利用這個功能可以構建兩個相同的數據庫,一個用來測試,一個用來正式使用。
執行環境:可以在SQLPLUS.EXE或者DOS(命令行)中執行,
DOS中可以執行時由於 在oracle 10i 中 安裝目錄ora101BIN被設置為全局路徑,
該目錄下有EXP.EXE與IMP.EXE文件被用來執行導入導出。
oracle用java編寫,SQLPLUS.EXE、EXP.EXE、IMP.EXE這兩個文件有可能是被包
將D:\bione.dmp表中的數據導入到orcl數據庫中。
(1)當創建完用戶后,找到安裝oracle的bin目錄,例如C:\oracle\product\10.2.0\db_1\bin。
(2)打開cmd窗口,輸入cd C:\oracle\product\10.2.0\db_1\bin,然后再輸入:imp bione1/bione1@orcl file= D:\bione.dmp ignore=y;
(3)導入成功。
導出::
(1) 將數據庫TEST完全導出,用戶名system 密碼manager 導出到D:daochu.dmp中
exp system/manager@TEST file=d:daochu.dmp full=y
(2) 將數據庫中system用戶與sys用戶的表導出
exp system/manager@TEST file=d:daochu.dmp owner=(system,sys)
(3) 將數據庫中的表inner_notify、notify_staff_relat導出
exp aichannel/aichannel@TESTDB2 file= d:datanewsmgnt.dmp tables=(inner_notify,notify_staff_relat)
(4 )將數據庫中的表table1中的字段filed1以"00"打頭的數據導出
exp system/manager@TEST file=d:daochu.dmp tables=(table1) query=" where filed1 like '00%'"
上面是常用的導出,對於壓縮,既用winzip把dmp文件可以很好的壓縮。
也可以在上面命令后面 加上 compress=y 來實現。
Oracle sqlplus命令:
1.ed a
@a
通過記事本的方式編譯:
Set linesize 300;
Set pagesize 30;
@a
2.
可以通過@找到磁盤上的文件,現在d盤上有一個demo.txt文件,文件中也是查詢指令
(select * from emp)。執行的時候要指定路徑。“@d;\demo.txt”,執行這條命令后則找到文件,執行文件里面的語句。默認的后綴名為“*.sql”
3.在sqlplus中也可以使用其他用戶連接,例如之前了解過的sys和system用戶;
使用如下命令:conn 用戶名/密碼[AS SYSDBA/SYSOPER]
如果是超級管理員的話(sys),則在連接的最后必須寫上AS SYSDBA。以系統管理員的身份進行登錄。
例如:conn system/manager; 連接system用戶
Conn sys/change_on_install as sysdba; 連接sys用戶
4.如果在不同用戶(scott用戶/sys用戶)下面想訪問emp表的話,在必須加上用戶名。即:表的完整名稱:“scott.emp”
5.如果想知道當前連接的是哪個用戶怎么辦呢?
可以通過 show user ;顯示當前正在連接的用戶是哪一個。
使用select * from tab;查找數據庫中有多少個表
用desc+表名的形式查看表的結構。
6.你可以輸入一個“/”,表示重復執行上一條語句的操作。
7.上面的是在scott/tiger模式下面的操作,如果想進入hr模式,因為默認的hr模式已經被鎖定,就需要對該用戶模式解鎖。
對用戶模式解鎖的具體步驟如下:
(1)以system的身份連接到數據庫
Connect system/password;
(2)解鎖用戶賬號,並修改其登陸密碼。
Alter user hr account unlock;
Alter user hr identified by hr;
(3)連接到HR模式並查看該模式下面所包含的表
Connect hr/hr;
(4)查看表
Select * from tab;
(5)以DBA的身份進入。
/ as sysdba;
ORACLE 創建表空間
2011-11-29 22:27 by shungdawei, 70 閱讀, 0 評論, 收藏, 編輯1 --創建臨時表空間
2 create temporary tablespace data_temp
3 tempfile 'D:\oracle\oraudata\data_temp.dbf'
4 size 2000m
5 autoextend on
6 next 500m
7 extent management local;
8
9 --創建數據包空間
10 create tablespace data_data
11 logging
12 datafile 'D:\oracle\oraudata\data_data.dbf'
13 size 2000m
14 autoextend on
15 next 500m
16 extent management local;
17
18
19 --創建用戶並指定表空間
20
21 create user dbadmin identified by dbpass
22 default tablespace data_data
23 temporary tablespace data_temp;
24
25 --刪除用戶命令
26 --drop user dbadmin cascade
27
28 --給用戶授予權限
29 grant connect,resource to dbadmin
30
31 --撤權
32 --revoke connect,resource from dbadmin
Oracle查看所有表空間使用情況
2011-11-29 22:41 by shungdawei, 40 閱讀, 0 評論, 收藏, 編輯1 select
2 b.file_id FILEID,
3 b.tablespace_name TBSNAME,
4 b.bytes/1024/1024||'M' SIZES,
5 (b.bytes-sum(nvl(a.bytes,0)))/1024/1024||'M' USED,
6 sum(nvl(a.bytes,0))/1024/1024||'M' FREE,
7 100 - sum(nvl(a.bytes,0))/(b.bytes)*100||'%' PERCENTS
8 from dba_free_space a,
9 dba_data_files b
10 where a.file_id = b.file_id
11 group by b.tablespace_name, b.file_id, b.bytes
12 order by b.file_id;
