一、用戶管理
1、用戶信息
用戶名/密碼 | 登錄身份 | 說明 |
sys/change_on_install | SYSDBA或SYSOPER | 不能以NORMAL登錄,可以作爲默認的系統管理員 |
system/manager | SYSDBA或NORMAL | 不能以SYSOPER登錄,可以作爲默認的系統管理員 |
sysman/oem_temp | sysman | 爲oms的用戶名 |
scott/tiger | NORMAL | 普通用戶 |
aqadm/aqadm | SYSDBA或NORMAL | 高級隊列管理員 |
Dbsnmp/dbsnmp | SYSDBA或NORMAL | 複製管理員 |
ALTER USER user
IDENTIFIED BY password;
說明:
如果想查看當前用戶所擁有的表和視圖:Select * form tab;
如果想查看當前用戶:select user from dual;
2、創建用戶
創建用戶的語法爲:
CREATE USER user
IDENTIFIED BY password;
而給用戶授權爲:
GRANT privilege [ ,privelege...]
TO user [,user...];
其中privilege表示系統限權,例如,create session、create table等,舉例如下:
CREATE USER us1
IDENTIFIED BY 1234;
GRANT create session
TO us1;
有時候創建用戶過於麻煩,可以先創建角色,然後在給用戶授權如下:
CREATE ROLE managers;
GRANT create session、create table TO managers;
GRANT managers TO us1;
附加,授予系統權限:
- create session:連接到數據庫
- create table:創建表
- create sequence:創建序列
- create view:創建視圖
- create proceduer:創建程序
而如果想撤銷用戶的權限,則:
revoke create table from us1;
二、數據庫的啓動與關閉
以下用SQL plus來實現啓動和關閉數據庫(以數據庫orcl,用戶爲sys【連接身份爲sysdba】)爲例,首先以scott身份登錄後,再轉爲以sys身份連接:
conn sys as sysdba;
startup open orcl;
而關閉數據庫:
- shutown:也就是shutdown normal。在一般情況下關閉數據庫,數據庫會等待所有連接的用戶離線,不再讓新的用戶連接,之後dismount(卸載)數據庫,再關閉數據庫。
- shutdown immediate: 立即關閉數據庫,不會等到用戶離線,先關閉數據庫,卸載數據庫後再關閉例程,數據庫重啓時,不必還原例程。
- shutdown abort:直接關閉數據庫和例程,數據庫重啓時,需要還原例程。
- shutdown transaction:交易式關閉數據庫,會等到有交易連接的用戶完成後再關閉數據庫,卸載數據庫後,再關閉例程。
三、表空間、表和視圖的基本操作
1、表空間
首先創建表空間的語法如下:
CREATE [UNDO | TEMPORARY] TABLESPACE tablespace
DATAFILE | TEMPFILE 'FILE_SPEC'
[MINIMUM EXTENT n [K|M] ]
[AUTOEXTEND
OFF
ON NEXT n KIM MAXSIZE UNLIMITED | n [K|M] ]
[LOGGING | NOLOGGING]
[ONLINE | OFFLING]
[DEFAULT (storage_clause) ] (N/A IfTEMPORARY above)
[EXTENT MANAGEMENT
DICTIONAR (Must be LOVAL for TEMPFILE)
LOCAL
AUTOALLOCATE
UNIFORM [SIZE n [ K|M] ]
[SEGMENT SPACE MANAGEMENT MANUAL|AUTO]
註釋:
- FILE_SPEC:數據文件或臨時文件的名稱
- MINIMUM EXTENT:最小延伸數
- AUTOEXTEND:自動延伸數,ON表示打開,OFF表示關閉
- MAXSIZE:最大數
- UNLIMITED:無限制
- LOGGING:在表空間中,設置表、索引和切割區的紀錄屬性
- NOLOGGING:在表空間中,不設置紀錄屬性,也就是不會產生Unod和Redo紀錄文件
- ONLINE:連線狀態,可以使用
- OFFLINE:離線狀態,不可以使用
- DEFAULT:系統自動產生的默認值
- EXTENT MANAGEMENT:指定庫充的管理方式
- SEGMENT SPACE MANAGEMENT:區段空間的管理
舉例,創建表空間TS1:
create tablespace TS1 datafile
'E:\testdb\TEST_DB02.dbf' SIZE 100M
autoextend on next 100M maxsize 1024M
default storage (initial 10M next 1M)
permanent
online
logging;
如果想修改表空間TS1:
alter tablespace ts1
nologging;
如果想在表空間TS1中添加文件則爲:
alter tablespace TS1 add datafile
'E:\TEST_DB01.dbf' size 10M reuse
autoextend on next 10M maxsize unlimited;
如果想刪除表空間TS1:
drop tablespace ts1;
如果在刪除表空間的同時刪除其數據:
drop tablespace ts1 including contents and datafiles;
2、表
1.表的創建
首先創建表的語法如下:
CREATE TABLE [ schema_name . ] table_name
{ column datatype [NOT NULL] }
[ TABLESPACE tablespace_name]
註釋:
- schema_name:模式名稱,最常使用的是擁有者
- table_name:表的名稱
- column:字段的名稱
- datatype:數據類型
- NOT NULL:不能爲空
- TABLESPACE:表空間
- tablespace_name:表空間的名稱
舉例,在表空間(TS1)中創建customer表:
create table customer
(custID varchar2(10) default '00',
custname varchar2(10)
)
tablespace ts1;
此時可以使用describe命令查看錶結構:
describe customer;
如果想將創建的表繼承其它表的結構可以(emp2的表結構和emp相同):
create table emp2
as
select * from emp where 1=2;
如果想將創建的表繼承其它表的結構以及數據(創建表,保存20號部門的員工):
create table emp20
as
select * from emp where deptno=20;
如果繼承的不是單表結構可以:
create table empinfo
as
select e.empno,e.ename,e.sal,e.sal*12 annsal,d.dname
from emp e, dept d
where e.deptno=d.deptno
2.表的修改
如果想修改表customer:
- 修改字段類型, 將表的custname字符類型由VARCHAR2(10)改爲CHAR(15)其命令爲:
ALTER TABLE customer
MODIFY (CustName CHAR(15));
- 向表中添加一個字段,在表customer後面添加custsex:
Alter table customer ADD(ENOTE CHAR(30));
- 如果想刪除一個字段,先設置其無法還原,然後在將其刪除:
alter tabe customer -- 先設置表無法還原
set unused(CustName);
alter tabe customer --再將其刪除
drop unused columns;
- 如果想修改表的名稱:
rename customer to cust;
3.表的刪除
如果想刪除表中的數據:
truncate table customer;
而要刪除表則爲:
drop table customer;
如果刪除表時:
Drop table customer cascade constraints;
將會同時刪除參照該表的外鍵約束
在Oracle中當刪除一個表時,實際上該表並沒有被真正刪除,而是被添加到回收站(普通用戶,如果是管理員就真正刪除了),如果想查看回收站的內容可以:
show recyclebin;
如果想要清空回收站可以:
purge recyclebin;
如果想從回收站中恢復刪除過的表可以:
flashback table customer to before drop;
4.表的約束條件
- 默認值
hiredate date default sysdate
- 唯一建
Constraint emp_uk UNIQUE (EMPID)
- 主建
語法爲:
Constraint Constraint_name PRIMARY KEY (column);
舉例,將EMPID設置爲主鍵:
constraint emp_pk PRIMARY KEY(EMPID));
或者:
alter table EMP
add constraint EMP_emp_pk PRIMARY KEY(empid);
- 外鍵
用來將表中的一個字段設置成外鍵,以參照鏈接到相同或不同的表中的另一個字段,這兩個有關係的字段可以相同也可以不同。不可以直接刪除父表。語法爲:
constraint constraint_name Foreign Key (column) references table_name (column);
- 非空值
直接在類型後面加上NOT NULL:
EMPID VARCHAR2(10) NOT NULL;
- 檢查
語法爲:
Constraint Constraint_name CHECK (condition);
舉例:
部門代碼(deptno)必須在1~99之間:
constraint deptno_ck check (deptno between 1 and 99));
創建一個學生信息表:
create table student
(
sid number constraint student_pk primary key,
sname varchar2(20) constraint student_name_notnull not null,
gender varchar2(2) constraint student_gender check (gender in ('男','女')),
email varchar2(40) constraint student_email_unique unique
constraint student_email_notnull not null,
deptno number constraint student_fk references dept(deptno) on delete set null
);
3、視圖
首先創建視圖的語法如下:
CREATE [OR REPLACE] [FORCE | NOFORCE] View view
[alias [,alias]...]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint ] ]
[WITH READ ONLY [CONSTRAINT] ];
註釋:
- OR REPLACE:將已存在的視圖再建一遍
- FORCE:無論基礎表格是否存在,皆會建立視圖
- NOFORCE:只有基礎表格存在時,纔會建立視圖
- view:視圖的名稱
- alias:使用別名,已供視圖在查詢字段時使用
- subquery:爲完整的select敘述
- WITH CHECK OPTION:只有未被指定的數據列纔可以通過視圖進行新增或者修改操作
- constraint:賦予WITH CHECK OPTION的名稱
- WITH READ ONLY:保證不能在視圖中執行DML,加入此句後就不會修改數據本身
舉例,創建視圖emp_dep1
create view emp_dep1
as select empid,empname
from emp
where deptno=21;
而如果想修改視圖,則爲:
create or replace view emp_dep1(id,name,no)
as select empid,empname,deptno
from emp
where deptno=21;
而如果想刪除視圖:
drop view emp_dep1;
四、數據的基本操作
1、添加
語法爲:
Insert INTO table [(column [,column...])]
VALUES (Value [,Value..]);
舉例,向EMP中添加一條數據:
insert into emp(empid,empname)
values('001','abel');
如果想進行批量插入,如一次性將emp中,所有10號部門的員工插入到emp10中:
insert into emp10 select * from emp where deptno=10;
附加,在Oracle中如果想進行海量數據的拷貝可以採用如下方式:
- 數據泵(datapump) ---> plsql
- SQL*Loader
- (數據倉庫)外部表
- 可傳輸的表空間
2、查詢
語法爲:
select * from table_name where column=‘查詢值’
如果想在查詢時去掉重複(針對所有列):
select distinct * from table_name where column=‘查詢值’
如果想在查詢時加上排序功能,需要再在查詢添加後面加上
order by + 列,表達式,別名,序號+asc/desc【默認爲asc,從小到大】
如查詢員工信息 按照月薪排序
select * from emp order by sal;
而如果想進行多個列排序,如即按照部門編號(先、主)又按照月薪(後、次)排序
select * from emp order by deptno,sal;
上面的多列排序是默認從小到大排的(每個列都是),但是如果寫出這樣
select * from emp order by deptno,sal desc;
將會deptno按升序排,然後sal按降序排,即desc只作用於離他最近的列,如果每列都是降序:
select * from emp order by deptno desc,sal desc;
如果在排序過程中有空值存在,如按獎金多少排序(可能沒有),在Oracle中null爲最大,即如果按照升序排列,null在最下面,而如果按降序排,null在最上面,但是一般我們都希望空值一直在最下面出現,這時可以:
select * from emp order by comm desc nulls last
3、修改
語法爲:
UPDATE table
SET column =value[,column=value,...]
[where condition]
4、刪除
語法爲:
delete from EMP where EMPName ='Abel';
此外如果想要刪除整張表中的所有數據除了可以使用delete,
delete from testdelete;
還可以使用truncate操作
truncate table testdelete;
delete和truncate的區別::
- delete逐條刪除;truncate先摧毀表,再重建
- (根本)delete是DML,truncate是DDL
- delete可以回滾,truncate不可以回滾
- delete不會釋放空間,truncate會
- delete可以閃回,truncate不可以
- delete會產生碎片,truncate不會
5、複製
語法爲:
INSERT INTO table [column (,column) ] subquery;
舉例,將EMP中EMPID開頭爲001的編號複製到manager中:
insert into manager (EMPID,EMPName,HireData,COMM,DeptNO)
select EMPID,EMPName,HireData,COMM,DeptNO
from EMP
where empid like '001%';