1. 程式人生 > >什麼是資料倉庫?什麼是聯機分析?什麼是資料探勘?什麼是叢集技術?

什麼是資料倉庫?什麼是聯機分析?什麼是資料探勘?什麼是叢集技術?

關係型資料:是以關係數學模型來表示的資料。它以二維表的形式來描述資料

關係型資料庫系統:硬體(客戶機、伺服器)、作業系統、關係型資料庫管理系統和資料庫、關係型資料應用系統、使用者

什麼是資料倉庫

什麼是聯機分析

什麼是資料探勘

什麼是叢集技術

oracle2種工作模式:C/S和B/S

資料庫伺服器體系結構

程序結構(使用者程序、伺服器程序)

記憶體結構(系統全域性區SGA(使用者程序和伺服器程序共用),程式全域性區PGA(使用者程序私用))

資料庫邏輯結構(資料庫、表空間、邏輯物件(表、索引、檢視)、資料段(資料段、索引段、臨時段、回滾段)、資料區間、資料塊)

資料儲存結構(資料庫、物理檔案(資料檔案、控制檔案、日誌檔案)、物理塊)

注:

資料塊 Data  Block

資料區間 Data Extent

資料段 Data Segment

邏輯物件 Logic Object

表空間 TableSpace

資料庫發展歷史

網狀資料庫、層次資料庫、關係資料庫。

關係資料庫的3個含義

1.在關係資料庫中,資訊被存放在二維結構表中

2.這些表之間是相互關聯的

3.資料庫不僅僅包含表,而且還包含了其他資料庫物件

關係資料庫的特點

關係(二維表)

元組(記錄)

屬性(欄位)

域(屬性的取值範圍)

候選碼(關係中能唯一標識元組的最小的屬性集合)

主碼(一組可以唯一標識元組的屬性)

關係模式(指對關係的描述,通常稱為表結構)

完整性

域完整性(欄位屬性的約束)

實體完整性(記錄的唯一性)

參照完整性(對外來鍵的約束)

資料庫正規化

第一正規化(每一列不可分割)

第二正規化(非主屬性要完全依賴主屬性,所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性(複合主鍵),如果存在,那麼這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關係。)

第三正規化(非主屬性之間不能相互依賴,屬性不依賴於其它非主屬性[消除傳遞依賴] )

關係資料庫

通常包括:客戶端應用程式、資料庫伺服器、資料庫

資料庫

一系列物理檔案(資料檔案、控制檔案、聯機日誌)的集合或與之對應的邏輯結構(表空間、段等)被稱為資料庫

表空間

資料庫結構提供對資料檔案的邏輯對映,允許不同型別的資料分開儲存,這些邏輯劃分稱做表空間。

資料庫例項

SGA(System Global Area)儲存結構,用來儲存最近從資料庫中查詢的資料。

資料塊快取區和sql共享池是SGA最大的組成部分。

資料庫例項也叫伺服器,是用來訪問資料庫檔案集的儲存結構及後臺程序的集合。在oracle並行伺服器選項下,一個數據庫可以被多個例項訪問。

 sql子語言

資料定義語言(Data Definition Language)DDL

資料查詢語言(Data Query Language)DQL

資料操縱語言(Data Manipulation Language)DML(增加修改刪除等操作)

資料控制語言(Data Control Language)DCL(設定或者更改資料庫使用者或角色許可權的語句)

事務控制語言(Transaction Control Language)TCL

PL/SQL基本語法

PL/SQL不區分大小寫

所有保留字都採用大寫、使用者定義的基本採用駱駝命名法。

分隔符(一句可以分多行)

引用字串(注意:數字不用單引號,以及單引號轉義) 

括號

PL/SQL資料型別

標量、複合、引用、LOB

》標量型別

1.數字型別

NUMBER(p,s)

NUMBERIC(p,s)

FLOAT

DEC

DECIMAL

INT/INTEGER

BINARY_INTENER

PLS_INTEGER

SMALLINT

SIMPLE_INTEGER

REAL

DOUBLE_PRECISION

BINARY_DOUBLE

BINARY_FLOAT

2.字元型別

CHAR(size) 最大2000B

NCHAR(size) 最大1000B

VARCHAR2(size) 最大4000B

NVARCHAR2(size) 最大2000B

LONG

RAW(size)

LONG RAW

3.日期型別

DATE(定義日期和時間)

TIMESTAMP(定義日期和時間,不僅顯示日期還會顯示時間和上下午標記)

INTERVAL(儲存2個TIMESTAMP之間的時間差異)

4.行識別符號

ROWID(支援物理行標識,不支援邏輯行標識)和UROWID (支援物理行標識,也支援邏輯行標識)

5.布林型別BOOLEAN

值有:TRUE、FALSE、NULL

(注意:它是PL/SQL資料型別,不支援表列資料型別)

》複合型別

PL/SQL記錄、PL/SQL集合

其中PL/SQL集合包含:聯合陣列、巢狀表、VARRAY(變長陣列)   3種複合資料型別

PL/SQL記錄語法

TYPE name IS RECORD(定義成員列表)

聯合陣列

TYPE  table_type_name  IS TABLE OF scalar_type  INDEX BY index_datatypes;

巢狀表

TYPE table_name IS TABLE OF  table_type [NOT NULL]

 VARRAY(變長陣列)

TYPE type_name IS [VARRAY | VARYING ARRAY] (max size) OF element_type [NOT NULL]

》引用型別

REF CURSOR型別、REF型別

》LOB型別

CLOB 儲存單位元組字元資料

BLOB 儲存非結構化的二進位制資料

NCLOB 儲存定寬Unicode多位元組字元資料

BFILE 儲存大型二進位制文字的指標

 PL/SQL基本結構

宣告部分、執行部分(必需的部分)、異常處理部分 

 變數

 變數名 型別識別符號 [NOT NULL]:=值

TYPE%

ROWTYPE%

常量

常量名 CONSTANT 型別識別符號 [NOT NULL]:=值

 表示式

 數值表示式:+ ,-, *, /, **(乘方)

字元表示式: ||(連結運算子)

關係表示式:<,>,=,<=,>=,!=,ALL,

ANY,SOME,

BETWEEN,

EXISTS

IN

IS

LIKE

邏輯表示式:NOT、AND,OR ,優先次序為 NOT、AND,OR

集合運算子:INTERSECT、MINUS、UNION、UNIONALL

行運算子:ALL,DISTINCT、PRIOR

流程控制

IF condition THEN

......

END IF

IF...THEN...ELSE

IF...THEN...ELSEIF

CASE(有2種)

LOOP 語句 END LOOP

其中包含EXIT或EXIT ...WHRN 跳出2種方式

迴圈標籤(增強可讀性)

WHTN...LOOP

FOR...LOOP

FOR i IN 1...3 LOOP

執行語句體

END LOOP

注意:i不能被賦值(即計數器不能被賦值)

注意:REVERSE反轉

注意:迴圈的邊界可以是文字,變數,表示式,但它們必須都是數字。否則PL/SQL會丟擲預定義異常。

GOTO語句,要設定標籤名(略)

NULL語句,本身並不做什麼,只是簡單地將控制權轉交給下一個語句而已。

PL/SQL常用語句

DDL,DQL,DML,DCL,TCL

其中DCL用於實現許可權授予(GRANT)和撤銷(REVOKE)

PL/SQL常用的部分許可權

CREATE USER

DROP USER

SELECE ANY TABLE

CREATE ANY TABLE

DROP ANY TABLE

CREATE VIEW

CREATE SEQUENCE

CREATE PROCEDURE

如:GRANT CREATE ANY TABLE TO USER1

REVOKE CREATE ANY TABLE FROM USER1

TCL事務控制語句

1.提交事務COMMIT

出現以下情況時會自動提交事務

執行DDL語句,執行DCL語句,退出SQL*PLUS

2.設定事務回滾點(也叫事務儲存點)SAVEPOINT

如SAVEPOINT A;或EXEC DBMS_TRANSACTION.SAVEPOINT('A');

3.回滾事務(ROLLBACK)

指定回滾到某個事物儲存點

ROLLBACK TO A或EXEC DBMS_TRANSACTION.ROLLBACK_SAVEPOINT('A');

回滾全部事務

ROLLBACK或EXEC DBMS_TRANSACTION.ROLLBACK

遊標、過程、函式(與過程類似,但必須有一個返回型別)

包:DBMS_OUTPUT,DBMS_TRANSACTION等

集合:即是前面介紹的聯合陣列,巢狀表,可變陣列

EXCEPTION:分為編譯時錯誤和執行時錯誤

引發異常有2種方法

發生ORACLE錯誤自動觸發

RAISE顯式地觸發異常

注意:OTHERS子句

PL/SQL異常又分:預定義異常和非預定義異常(標準的異常和程式設計師定義的異常需要使用raise顯式觸發)

注意:使用Raise_Application_Error

如Raise_Application_Error(-20001,‘表中已經存在該記錄’)

其中-20001必須在-20000到-20999之間,防止與oracle的任何錯誤碼發生衝突,後一個引數不超過2KB
注意在WHEN OTHERS中使用:SQLCODE或SQLERRM

 常用開發工具SQL*PLUS和SQL Developer

設定執行格式、顯示格式(略)

 在Oracle內部,每個資料表都有一個偽列ROWID,用於存放ROWID型別的二進位制值。每個ROWID代表了一行資料的儲存地址。物理ROWID 能夠標識普通資料表中的一行資訊,而邏輯ROWID能夠標識索引組織表(index-organized table)中的一行資訊。其中ROWID型別只能儲存物理內容,而UROWID(universal rowid)型別可以儲存物理或者邏輯ROWID。

建議:只有在舊的應用程式中,為了相容性我們才使用ROWID資料型別。對於新的應用程式,應該使用UROWID資料型別。
    水平分割槽將表分為多個表。每個表包含的列數相同,但是行更少。例如,可以將一個包含十億行的表水平分割槽成 12 個表,每個小表表示特定年份內一個月的資料。任何需要特定月份資料的查詢只需引用相應月份的表。
    而垂直分割槽則是將原始表分成多個只包含較少列的表。

    表雜湊與水平分割相似,但沒有水平分割那樣的明顯分割界限,
    
    
    據表基本操作

資料庫的資料邏輯上是儲存在表空間中,物理上是儲存在資料檔案中。

建立資料表

CREATE TABLE TABLE1(ID NUMBER(3) NOT NULL,NAME VARCHAR2(20) NULL);

CREATE TABLE TABLE1 AS SELECT ID,NAME FROM TABLE2;

注意:如果查詢涉及到Long資料型別,那麼CREATE TABLE ...AS SELECT 不會工作。

修改資料表

增加列

ALTER TABLE TABLE1 ADD createDate DATE;

修改列

ALTER TABLE TABLE1 MODIFY NAME VARCHAR(30); 

注意:大部分時候列的值為空才能修改。

刪除資料列

ALTER TABLE TABLE1 DROP COLUMN NAME ;

更改表名

RENAME oldname TO newname;

刪除表

DROP TABLE  TABLE1;

清空表資料

TRUNCATE TABLE  TABLE1;

注意區別

區別
1。delete from後面可以寫條件,truncate不可以
2。delete from記錄是一條條刪的,所刪除的每行記錄都會進日誌,而truncate一次性刪掉整個頁,因此日至裡面只記錄頁釋放,簡言之,delete from更新日誌,truncate基本不,所用的事務日誌空間較少
3。delete from刪空表後,會保留一個空的頁,truncate在表中不會留有任何頁
4。當使用行鎖執行 DELETE 語句時,將鎖定表中各行以便刪除。truncate始終鎖定表和頁,而不是鎖定各行。
5。如果有identity產生的自增id列,delete from後仍然從上次的數開始增加,即種子不變,而truncate後,種子會恢復初始
6。truncate不會觸發delete的觸發器,因為truncate操作不記錄各個行刪除

約束

非空約束 NO TNULL(簡單不用演示)

唯一 UNIQUE

column_name data_type constraint 約束名 unique//單列資料

constraint 約束名(多列) unique using index tablespace(table_name) storage(stored clause)

新增約束

alter table 表名 add constraint 約束名 unique(列名) using index tablespace 表空間名

主鍵 PRIMARY

列名後面直接加上主鍵約束

itemid varchar2(20) constraint pk_items primary key

如果主鍵約束保護多個列,必須作為一個表約束建立

constraint pk_items primary key(itemid,itemname)  using index tablespace(table_name) storage(stored clause)

禁用或刪除

alter table items drop primary key;

alter table items disable primary key

外來鍵 FOREIGN KEY

alter table invency

add constraint fk_invency_items

foreign key(itemid) references items(itemid);

條件 CHECK

 條件列約束不保護log資料型別和資料列和物件、巢狀表、varry、ref等

constraint chk_status check(status in('正常','出差','休假'));

約束的維護

禁用約束 alter table 表名 disable constraint 約束名

啟用約束 alter table 表名 enable constraint 約束名

刪除約束 alter table 表名 drop constraint 約束名 

序列的建立

create sequence sequence1

increment by 1 

start with 1

maxvalue 10000

minvalue 1

nocycle

cache 20或nocache

noorder //不指定排序

sequence1.currval

sequence1.nextval

drop sequence sequence1;

--------------------------------------------------------------------------------------------

索引

如果沒有建立索引的話,那麼查詢該表的任何記錄都會通過順序地逐行掃描得到,這會導致大量的磁碟i/o,從而會大大降低資料庫系統的效率,索引通常用於提高查詢效率。當然過多的索引也會使更新、插入、刪除操作花費更多的時間。

B-tree索引(如唯一索引、主鍵索引)也就是B-樹索引。基本上這些索引儲存的是所在的列值以及用來查詢自身行的指向實際資料表的指標。

注意:如果索引是建立在多個列上的話,那麼第一列非常重要。第一列會單獨掃描。後面列不會。

函式索引(基於函式建立的)

反轉鍵索引(不能對點陣圖索引和索引組織表進行反轉鍵索引)

點陣圖索引(為相異值很少的列建立的),一般而言,只有當對錶中值相宜度較小的多個不同的列都使用點陣圖索引,這樣點陣圖索引才會有用。

點陣圖連線索引

壓縮索引

降序索引(可以顯著優化order by x,y,z desc子句查詢)

分割槽索引

其他:索引組織表、簇索引、域索引、隱藏索引、虛擬索引等

建立索引

建立不唯一索引

create index idx_itemname on item(name) tablespace 表空間名;

建立唯一索引

create unique index idx_itemid on item(id) tablespace 表空間名;

建立點陣圖索引

create bitmap index idx_itemsdeleted on item(isdeleted) tablespace 表空間名;

建立反轉鍵索引

create unique index reidx_delivey on delivey(did,date) tablespace 表空間名 reverse;

建立函式索引(既可以是普通的B-樹索引,也可以是點陣圖索引)

create index idx_sub on item(substr(itemid,1,4))tablespace 表空間名;

注意:

匯入資料後再建立索引

不需要為很小的表建立索引

對於取值範圍很小的欄位(如性別)應當建立點陣圖索引

限制表中的索引數目

為索引設定合適的pctfree值

儲存索引的表空間最好單獨設定

使用索引

全表掃描(Full table scan):就是順序地訪問表中的每條記錄。oracle採用一次讀入多個數據塊的方式優化全表掃描。

索引掃描(index scan):可以採用基於rowid的方式訪問以提高訪問表的效率。rowid包含了表中記錄的物理位置。oracle採用索引實現了資料和存放資料的物理位置rowid之間的聯絡。通常索引提供了快速訪問rowid的方法,因此基於索引列的查詢就可以得到效能上的提高。

索引唯一掃描(index unique scan)

索引範圍掃描(index range scan)使用於2種情況:範圍的索引、非唯一性的索引

注意:全表掃描需要讀入的資料塊數等於該表的實際資料塊數

oracle評價使用索引的代價時有2個重要的資料

CF:每讀入一個索引塊要對應讀入多少個數據塊

FF:sql語句所選擇的結果集佔總的資料量的百分比

一般的估算公式是:FF*(CF+索引塊個數)

索引不是越多越好

很多時候,單列索引不如複合索引

用於多表連線的欄位,加上索引列會很有用

----------------------------------------------------------------------------------

Meger更新

meger into t1 using t on(條件)

when matched then ××××

when not matched then ××××

 oracle常用函式和命令

  1、set linesize 100;  設定長度
 2、set pagesize 30;   設定每頁顯示數目
 3、em a.sql  開啟記事本 
 4、@ a 執行檔案a中的程式碼,可指定檔案的路徑 @d:a.txt
 5、conn 使用者名稱/密碼  根據使用者名稱和密碼連線資料庫 如果連線超級管理員(sys) 則應加上as sysdba;
 6、show user; 顯示當前連線的使用者
 7、select * from tab;  得到當前使用者下的所有表
 8、desc temp; 查看錶結構
 9、/  繼續執行上一個查詢語句
    clear scr;  清屏

字元函式
10、select upper('coolszy') from dual; 將小寫字母轉換成大寫,dual 為一虛表
11、select lower('KUKA') from dual; 將大寫字母轉換成小寫
12、select initcap('kuka') from dual; 將首字母大寫
13、select concat('Hello',' world') from dual; 連線字串,但沒有||好用select concat('Hello','world') from dual;
14、select substr('hello',1,3) from dual; 擷取字串
15、select length('hello') from dual; 求字串長度
16、select replace('hello','l','x') from dual; 替換字串
17、select substr('hello',-3,3) from dual; 擷取後三位

補充:trim、lpad、rpad、instr

數值函式
18、select round(789.536) from dual; 四捨五入,捨去小數
19、select round(789.536,2) from dual; 保留兩位小數
20、select round(789.536,-1) from dual; 對整數進行四捨五入
21、select trunc(789.536) from dual; 捨去小數,但不進位
22、select trunc(789.536,2) from dual;
23、select trunc(789.536,-2) from dual;
24、select mod(10,3) from dual; 返回10%3的結果

補充:abs、ceil、floor、power、rand、sqrt、

日期函式
25、select sysdate from dual; 返回當前日期
26、select months_between(sysdate,'16-6月 -08') from dual; 返回之間的月數
27、select add_months(sysdate,4) from dual; 在日期上加上月數
28、select next_day(sysdate,'星期一') from dual; 求下一個星期一
29、select last_day(sysdate) from dual; 求本月的最後一天

補充、trunc、round

其中sysdate的格式

CC:世紀

WW:為一年中的周

W:為一個月中的周

D:為星期幾

DDD:為一年中的第幾天

YEAR:為年

MONTH:為月

DAY:為日


轉換函式
30、select to_char(sysdate,'yyyy') year,to_char(sysdate,'mm'),to_char(sysdate,'dd') from dual;
31、select to_char(sysdate,'yyyy-mm-dd') from dual;
32、select to_char(sysdate,'fmyyyy-mm-dd') from dual; 取消月 日 前面的0
33、select to_char('20394','99,999') from dual; 分割錢 9表示格式
34、select to_char('2034','L99,999') from dual; 加上錢幣符號
35、select to_number('123')*to_number('2') from dual;
36、select to_date('1988-07-04','yyyy-mm-dd') from dual;

其中日期格式

YYYY:完整的年份號碼

YEAR:當前的年份拼出來

RR:年份中阿拉伯數字的最後2位

MM:2位數的月份

MONTH:當前的月份拼出來

MON:月份的前3個字母

DY:用3個字母來表示當前的星期數

DAY:當前星期數的全拼

DD:數字的月份日期值

HH24:二十四進位制的小時數

MM:分鐘數

SS:秒數

數字的顯示格式

9 :代表一個數字

L:強制顯示一個當地的貨幣符號

0:強迫0顯示

.:顯示一個小數點

$:顯示美元符號

,:顯示一個千位分隔符號

to_number函式

to_date函式

decode函式

decode(exp,sl,r1,s2,r2....sn,rn)可以理解成增強型的if else

greatest(n1,n2,n3,...n)返回序列中最大的值

least(n1,n2,n3,...n)返回序列中最小的值

nullif(c1,c2)如果兩個指定的表示式相等,則返回空值。

nvl(c1,c2)如果c1為NULL,則NVL函式返回c2的值,否則返回c1的值。

注意事項:c1和c2必須為同一資料型別,除非顯示的使用TO_CHAR函式。

nvl2(c1,c2,c3)如果引數表示式c1值為NULL,則NVL2()函式返回引數表示式c3的值;如果引數表示式c1值不為NULL,則NVL2()函式返回引數表示式c2的值。

通用函式
37、select nvl(null,0) from dual; 如果為null,則用0代替
38、select decode(1,1,'內容是1',2,'內容是2',3,'內容是3') from dual; 類似於 switch...case...

事務處理
39、commit;  提交事務
40、rollback; 回滾事務


41、select rownum from table; 在沒一列前面顯示行號
42、drop table 表名 cascade constraint
    on delete casecade 當父表中的內容被刪除後,子表中的內容也被刪除

43、desc表名 顯示錶的結構
44、create user [username] identified by [password] 建立新的使用者
45、grant 許可權1、許可權2...to 使用者  給建立使用者許可權
 ex:grant create session to [username] 此時只能連線到資料庫
    grant connect,resource to [username] 此時許可權能滿足要求
46、alter user [username] identified by [password] 修改使用者密碼
47、alter user [username] password expired 下次登入時提示修改密碼
48、alter user [username] account lock  鎖住使用者
49、alter user [username] account unlock  解鎖鎖使用者
50、grant select,delete on scott.emp to [username] 把scott下emp表的兩個許可權給使用者
51、revoke select ,delete on scott.emo from [username] 回收許可權

 定量謂詞

some、any、all

in 不如 exists 不如 連線查詢

概念

子查詢(標量子查詢、比較子查詢、相關子查詢、巢狀子查詢)

集合操作(union、union all、intersect、minus)

注意

對於blob、clob、bfile、varry或巢狀表型別的列,不能使用集合操作符

對於long型別的列,不能使用集合操作符union、intersect、minus

多表連線

基本連線(多個表之間用逗號隔開)

交叉連線(cross join)實際就是一個 inner join on true

自連線(對同一個表進行多次的引用)

自然連線 natural join

條件連線(有on條件)主要有內連線、外連線(左外、右外)、全外連線

層次化查詢

select [level],exp......

from table_name

[where 條件]

[start with 開始條件]

[connect by prior 連線的條件]