1. 程式人生 > 其它 >Oracle簡介與簡單使用

Oracle簡介與簡單使用

技術標籤:oracle

一、Oracle簡介

3 0.oracle 前傳 oracle資料庫的特點
        1.支援多使用者, 大事務量的事務處理
        2.在保持資料安全性和完整性方法效能優越
        3.支援分散式資料處理,將分佈在不同物理位置的資料庫用通訊網路連線起來,在分散式資料庫管理系統的控制下,組成一個邏輯上統一的資料庫,完成資料處理
        4.具有可移植性.oracle 可以再windows,linux等多個作業系統平臺上使用, 而sql server只能在windows平臺上執行.

1.Oracle資料庫管理系統

1.Oracle公司的核心產品


目前最流行的資料庫
主要版本Oracle8i/9i(internet)、Oracle10g/11g(grid)
基於C/S系統結構
2.Oracle(甲骨文)公司

  • 1977年,三人合夥創辦(Software Development Laboratories,SDL)
  • 1979年,更名為Relational Software Inc.,RSI
  • 1983年,為了突出核心產品 ,RSI更名為Oracle
  • 2002年04月26日,啟用“甲骨文”作為中文註冊商標
    Oracle 主要元件

Oracle基本概念

二、安裝Oracle

1.安裝oracle服務端
2.安裝pl/sql oracle客戶端
3.配置監聽與網路服務


開啟服務

在這裡插入圖片描述

3.建立oracle資料庫
4. 連線資料庫
SYS和SYSTEM使用者
SYS和SYSTEM使用者都是Oracle 的系統使用者,都使用SYSTEM表空間,SYS擁有更大的許可權
1.使用sqlplus 登入: System/[email protected]
使用者名稱/密碼@資料庫名
sys/[email protected] as sysdba
2.使用pl sql 登入 ( oracle的 管理工具) 在這裡插入圖片描述
使用者型別:Normal 普通使用者
SYSDBA:資料庫管理員 開啟關閉資料 日誌等…
sysOper:資料庫操作員 開啟關閉資料庫 恢復備

一、表空間


在這裡插入圖片描述
基於應用效能和管理方面的考慮,最好為不同的子系統建立獨立的表空間
通過CREATE TABLESPACE命令建立表空間
1. 建立表空間 TABLESPACE
語法:CREATE TABLESPACE 表空間名字
DATAFILE ‘表空間路徑+檔名’ [ SIZE integer [ K | M ] ]
[ AUTOEXTEND [ OFF | ON ] ] ;
}

data: 資料
date: 時間

create tablespace tp_test  datafile  'D:\java_lyl\WORKSPACE\oracle\tp_test01.dbf' size 60M;

2.修改表空間

1.調整表空間大小  
                   alter database datafile 'D:\java_lyl\WORKSPACE\oracle\tp_test01.dbf' resize 80M;
                或者  向表空間新增檔案
                    alter tablespace tp_test add datafile 'D:\java_lyl\WORKSPACE\oracle\tp_test02.dbf' size 20M autoextend on;
  3.更改表空間狀態只讀
                 alter tablespace tp_test read  only;
                 alter tablespace tp_test read write;  可讀寫  
4.刪除表空間
                刪除表空間前先備份再刪除
                 drop tablespace tp_test including contents;   包含內容一起刪除,  但是資料檔案還是存在的

二、登入管理後臺
1.SYS和SYSTEM使用者都是Oracle 的系統使用者,它們都使用SYSTEM表空間,SYS擁有更大的許可權
在這裡插入圖片描述
sys/[email protected] as sysdba
System/[email protected]

在這裡插入圖片描述
進了公司, 組長會給你 註冊oracle 登入賬號
SQL> create user lyl identified by 123456 default tablespace tp_test;
建議:為使用者指定預設表空間或臨時表空間
1.更改使用者密碼
SQL> alter user lyl identified by root;
2.刪除使用者 cascade 即使有模式物件(表,索引)也會刪除
drop user lyl cascade;

三、許可權和角色

1.許可權指執行特定型別SQL 命令或訪問其他物件的權利
系統許可權和物件許可權
系統許可權允許使用者執行某些資料庫操作
物件許可權允許使用者對某一特定物件(表)執行特定的操作

2. 角色是具有名稱的一組許可權的組合
常用系統預定義角色:
CONNECT:臨時使用者 connect
RESOURCE:更為可靠和正式的使用者 連線, 建立表等…
DBA:資料庫管理員角色,擁有管理資料庫的最高許可權
自定義的角色:

總經理:是一個角色, 有 以下兩個許可權
許可權: 發工資, 批假

使用者: lzh --> 總經理這個 角色給了lzh , lzh 這個賬號就有了發工資,還有批假的權利了
連線oracle
建立表
1.系統許可權
常用系統許可權: create session (連線到資料庫),
create table ,
create view ,
create sequence;(建立序列)

2.物件許可權(使用者獲取資料庫許可權的方式)
1).管理員直接向用戶授予許可權
2).管理員將許可權授予角色,然後再將角色授予一個或多個使用者

最常見的角色有:
connect角色, 需要連線資料的使用者,特別是不需要建立表的使用者
resource角色:更為可靠和正式的資料庫使用者, 可以建立表,觸發器,過程等
dba 角色等, 此角色具有系統許可權,並且可以給其他使用者,角色授權

**3、建立角色
角色,即許可權的集合,可以把一個角色授予給使用者
1、建立角色
create role myrole;
2、賦權
grant create session to myrole;–將建立session的許可權授予給角色myrole
3、賦角色給使用者
grant myrole to zhangsan;–授予zhangsan使用者myrole的角色
4、刪除角色
drop role myrole;

–分配許可權或角色 (重新登入)
GRANT privileges or role TO user;
–撤銷許可權或角色
REVOKE privileges or role FROM user;

  1. grant connect ,resource to lyl;
    2.revoke connect,resource from lyl;
    3.grant update on scott.emp to lyl;
    4.grant select on scott.emp to lyl;
    資料庫使用者安全設計原則
    1.資料使用者許可權授權按最小分配原則
    2.資料使用者分為管理,應用,維護,備份四大使用者
    3.不允許使用Sys和System 使用者建立資料庫應用物件.
    4.禁止 grant dba to user;

四、序列 單獨的標識列
序列是用於生成唯一、連續序號的物件
序列可以是升序的,也可以是降序的
使用CREATE SEQUENCE語句建立序列
1.建立序列
START WITH 10 :從10開始
INCREMENT BY 10: 每次增長10
MAXVALUE 2000:最大值為 2000
MINVALUE 10:最小值為10
NOCYCLE : 當序列在達到最大值或者最小值後, 將不能繼續生成值,預設
CACHE 10; 不快取序列化, 預設快取 20個序列號**

   要求 建立從 10到2000的序列

   10  20 30 ...        2000


create sequence seq1 start with 10  increment by 1  maxvalue 200 minvalue 1 nocycle cache 30;

2.訪問序列
序列名.nextval

    seq1.nextval  建立序列後第一次使用nextval時 ,將返回該序列的初始值,以後使用就是返回下一個

    seq1.currval: 返回序列的當前值

insert into toys(toyid,toyname,toyprice) values(seq1.nextval,‘張三’,25);
select seq1.currval from dual; 檢視當前序列

. create table toys(
toyid int primary key,
toyName varchar2(20),
toyprice number(10,0)
);
刪除表格
drop table system.toys;

3.更改序列

        1.不能更改序列的初始值

                 select seq1.currval from dual; 修改了 增量



   alter sequence  seq1
INCREMENT BY 10 
MAXVALUE 2000 
MINVALUE 10 
NOCYCLE : 
CACHE 10; 


4.刪除序列

        > DROP SEQUENCE seq1;

五.同義字 synonym
同義詞是現有物件的一個別名

簡化SQL語句
隱藏物件的名稱和所有者
提供對物件的公共訪問
同義詞共有兩種型別
私有同義詞只能在其模式內訪問,且不能與當前模式的物件同名
公有同義詞可被所有的資料庫使用者訪問

為玩具表建立一個同義詞別名, 並且預設是私有的
create or replace synonym 別名 for 表名;

 刪除同義詞   drop synonym t;

建立公有同義詞


  小結:公有同義詞與私有同義詞的區別

    1.私有同義詞只有在當前模式有用, 且不能與當前表名相同

    2.公有同義詞可被所有的資料庫使用者訪問.
  其他使用者依然需要授權才能訪問


    grant select on toys to lyl;  授權







六.索引
    1.索引分類  為什麼要索引 
    https://www.cnblogs.com/huangye-dream/archive/2013/03/13/2957049.html



    2.B 樹索引結構 
        https://blog.csdn.net/shuilovejie/article/details/84320423


            
            create [unique]  index indexName on 表名(列名)[tablespace    name];  只能建立一個同類型的索引
            unique:唯一鍵  預設為非唯一索引
           


    3.反向索引

             與常規的B樹索引相反, 反向鍵索引在儲存順序的同時反轉索引列的位元組.反向鍵索引通過反轉索引鍵的資料值來實現. 其優點是對於連續增長的索引列,反轉索引列可以將索引資料分散在多個索引塊鍵,減少 ,I/O瓶頸的發生.

                以便建立在連續增長的列上,如系統生成的員工編號,但不能執行範圍搜尋.

    建立反向索引

https://www.cnblogs.com/tracy/archive/2011/09/16/2178486.html

4.點陣圖索引 https://blog.csdn.net/zhou920786312/article/details/72790171 **優點:適用於低基數列(有限的列)

1.對於大批量即時查詢時,可以減少響應時間
2.佔用空間少
3.對硬體 沒什麼要
5.其他索引 (函式索引)
組合索引**
create bitmap index index_bitmap on toys_221(toyid);
– 這個索引 應用在 toyName列上的大寫 函式索引
create index index_name on toys_221(upper(toyName));

建立索引的原則

表中匯入資料後再建立索引,否則每次表中插入資料時都必須更新索引
在適當的表和欄位上建立索引
如果經常檢索的資料少於表中的15%,需要建立索引
限制表中索引的數目
索引越多,在修改表時對索引做出修改的工作量越大**

1.頻繁搜尋的列可以作為索引
2.經常排序,分組的列可以作為索引
3.經常用作連線的列(主鍵/外來鍵) 可以作為索引
4.將索引放在一起單獨的表空間站,不要放在有回退段,臨時段和表的表空間中
5.對大型索引而言,考慮使用nologging位元組建立大型索引
6.根據業務資料發生頻率,定期重新生成或重新組織索引,並進行碎片整理
7.僅包含幾個不同值得列不寬裕穿件為B樹索引,可根據需要建立點陣圖索引
8.不要在僅包含幾行的表中建立索引.

一個原則: 在資料多的時候, 給用的多的列 建立索引

七.表分割槽

    1.允許使用者將一個表分成多個分割槽
    2.使用者可以執行查詢,只訪問表中的特定分割槽
    3.將不同的分割槽儲存在不同的磁碟,提高訪問效能和安全性
    4.可以獨立地備份和恢復每個分割槽             
範圍分割槽
            以表中的一個列或一組列的值的範圍分割槽  建立表的時候分割槽
          PARTITION BY RANGE (column_name)

(
  PARTITION part1 VALUE LESS THAN (range1),
  PARTITION part2 VALUE LESS THAN (range2),
  ...
  [PARTITION partN VALUE LESS THAN (MAXVALUE)]
);


select * from 表名  partiton(part2 )

案例 季度

create table fenqu1(
       fenqu_id number,
       fenqu_name nvarchar2(10),
       fenqu_birthday date not null
)
partition by range (fenqu_birthday)
(
          partition p1 values less than  (to_date('2018-04-1','yyyy-mm-dd')),
          partition p2 values less than (to_date('2018-07-1','yyyy-mm-dd')),
          partition p3 values less than (to_date('2018-10-1','yyyy-mm-dd')),
          partition p4 values less than (to_date('2019-01-1','yyyy-mm-dd')),
          partition p5 values less than (maxvalue)          
);


drop table fenqu1;

insert into fenqu1 values(1,'張三',to_date('2018-11-1','yyyy-mm-dd'));
insert into fenqu1 values(2,'張三2',to_date('2018-07-1','yyyy-mm-dd'));

select * from fenqu1 partition(p4);

以列的值的範圍來作為分割槽依據
間隔分割槽

實現範圍分割槽的自動化, 根據資料的增加, 會自動更新增加分割槽
PARTITION BY RANGE(column_name)
INTERVAL((nNUMTOYMINTERVAL, ‘interval_unit’))
(PARTITION P1 VALUES LESS THAN (range1));
INTERVAL代表“間隔”,按照後面括號中的定義間隔新增分割槽
NUMTOYMINTERVAL(n, ‘interval_unit’) 函式
將n轉換成interval_unit所指定的值
interval_unit可以為: YEAR, MONTH

– 建立間隔分割槽

create table fenqu2(
       fenqu_id number,
       fenqu_name nvarchar2(10),
       fenqu_birthday date not null
)
partition by range(fenqu_birthday)
        interval(numtoyminterval(3,'MONTH'))
(partition p1 values less than(to_date('2013-04-1','yyyy/mm/dd')));

– 插入資料

insert into fenqu2 values(1,'張三',to_date('2018-8-1','yyyy-mm-dd'));

– 獲取分割槽情況

select table_name,partition_name from user_tab_partitions where table_name=upper('fenqu2');
select * from fenqu2 partition(SYS_P21);

– 為沒有建立分割槽的表格 建立分割槽

create table fenqu3 partition by range(fenqu_birthday)
interval(numtoyminterval(3,'MONTH'))
(partition p1 values less than(to_date('2013-04-1','yyyy/mm/dd')))
    
as select * from fenqu2;

– fenqu2 為已建立有資料的表

;

select table_name,partition_name from user_tab_partitions where table_name=upper('fenqu3');
select * from fenqu3 partition(SYS_P22);