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' ;