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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM