數據庫

一、 引入

1、sqlplus /nolog
conn / as sysdba
將scott用戶解鎖,設置密碼爲tiger
alter user scott identified by tiger account unlock;

sqlplus 命令行窗口客戶端
nolog 不產生日誌
sysdba oracle上的最高權限進入,認證系統,若是以administrator進入則不需要驗證密碼

2、sqlplus:oracle的客戶端工具(純字符界面)
pl/sql developer:oracle的客戶端工具(圖形界面)
D:\software\oracle11g_64\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora

客戶端->(IP)->硬件服務端->(端口)->對應軟件
客戶端的端口一般隨機產生,服務端的端口是固定的。

3、oracle是關係數據庫,用於存儲數據
關係型數據庫:體現關係非常的強烈
NOSQL數據庫:是能夠解決關係型數據庫不好解決的問題的數據庫(key value,列式)

與oracle平級的數據庫有mysql,db2, mariadb

二、oracle體系結構

oracle server = instance + database(單機下)
databse = data files + redo log files + control files + archived log files
instance = SGA(System Global Area 內存) + background process
SGA = database buffer cache + redo log buffer + shared pool + java pool + large pool
Instance = memory + background process
memory = SGA + PGA(Service自動生成)

dirty date : (髒數據)在Instance的SGA中上存在,但是磁盤還是不存在的數據。

CTL - Control files
DBF - Data files
LOG - Redo Log files

數據更新:
(數據)Database Buffer cache->(DBWR更新)->Data files
(日誌)Redo Log Buffer->(LGWR更新)->Redo Log files

Control files 記錄文件所在的位置
日誌文件通常是兩個,暫時稱爲1,2,每一個都會寫兩份一樣的且在不同的地方,提高容錯率,寫完1,再寫2,寫2的時候,對1進行歸檔。

Parameter files - 記錄 Control files 所在的位置,分區的大小
Library cache - 存儲sql的解析後的結果,即爲編譯解析後的sql語句
Data Dictionary Cache - 存放系統的表
SMON - 系統的一個進程,當服務端出現故障的時候,用以維護數據的完整性(系統監控,垃圾回收)
PMON - 監視進程(進程監控)
CRPT - 檢查,恢復數據時發揮作用,減少恢復的時間

三、SQL(structure query language)

增加(insert)
修改(update)
刪除(delete)
查詢(select)

行- 記錄 列- 字段
SELECT * FROM 表名
* 可以表示所有的列,也可以用單一的列名來代替,若是有多列,那麼在列名中間用逗號隔開。

關鍵字大寫,每行僅僅只寫一個關鍵字,其他的小寫,但是從嚴格意義上來說,可以不區分大小寫。
字符列左,日期數字列右。
空值等同 Java中的null,既不是空格,也不是0,任何包含空的運算的結果爲空。
as 別名 as可以用空格代替,重命名,可以使用漢字,當別名中有空格存在的時候,那麼需要用單引號括起來表示裏面是一個字符串,否則會報錯。
|| 連接符 字符串用單引號
DISTINCT 去重 SELECT DISTINCT ename
DESC 表名—— sqlplus的命令,不能直接在sql中運行,但是可以在sqlplus裏運行,例如cmd和Command裏面,需要用分號表示一句話的結束。

四、 優先級

這裏寫圖片描述
PS:AND 優先級 高於OR

五、基本知識

字符對於大小寫敏感
<> 亦或是 != 都表示 不等於,但是前者更加常見
IN(a,b) 表示的是a和b,不是a到b
WHERE ename LIKE ‘%\%%’ ESCAPE(‘\’) 表示查找ename含有%的所有
ESCAPE 表示括號內的東西爲 轉意符 ,可以隨意寫
排序 ORDER BY 升序ASC(可以省略) 降序DESC(sql語句)

PS:要先查詢再排序,即爲WHERE在ORDER BY 的前面,一個DESC只管最近的一個的倒序。

六、函數

單行函數:單進單出
多行函數:多進單出

要求掌握:LOWER UPPER INITCAP CONCAT LENGTH SUBSTR LPAD RPAD TRIM
SUBSTR:截取 (‘’,初始位置,截取長度):初始位置爲1或者0都表示從第一個開始, 當爲-1的時候表示從後面開始。

ROUND: 四捨五入
TRUNC: 截斷
MOD: 求餘
eg: ROUND(45.926, 2) 表示保留兩位小數,四捨五入,當後面的數字爲負數的時候,那麼 這個時候就會從個位數向前數。

同java一樣,若是知道需要轉換的類型,那麼就應當直接註明,變成顯式轉換,而不是讓其自己去判斷,這樣做非常消耗內存。

顯示轉換: TO_需要轉換成爲的類型名稱(‘’,‘格式’)

dual: 啞表 僞表 只有1列 一般用於計算
SYSDATE: 返回當前的日期時間。
NVL(列名,0): 當此列中的值爲空的時候,按0處理,不爲空就按照本身。
NVL2(1,2,3): 1不爲空,按照2來處理,1爲空的時候,按照3來處理。

IF - THEN - ELSE:(分爲以下兩種)
(1)
–CASE
SELECT empno,ename,job,sal,CASE job WHEN ‘SALESMAN’ THEN 1.2*sal
WHEN ‘CLERK’ THEN 1.5*sal
WHEN ‘ANALYST’ THEN 1.1*sal
ELSE sal end

FROM emp

(2)
–decode
SELECT empno,ename,job,sal,decode(job,’SALESMAN’,1.2*sal,
‘CLERK’,1.5*sal,
‘ANALYST’,1.1*sal,
sal)
FROM emp

七、多表查詢

笛卡爾集 和 叉集:多個表連接的時候,每一個表的每一行數據都會與其他表的每一行數據連接。(在連接表的時候首先應當需要注意的問題。)
避免措施:加入限制條件(WHERE、JOIN ON)

在oracle裏,在連接時對於少的那一個表,可以在其表名末尾加上一個(+),以完善數據。
但是並不能在兩邊都加上(+)已達到滿外連接的效果。

等值連接 非等值連接 外連接 外左連接 外右連接 自連接 滿外連接
LIFT (OUTER) JOIN 左邊多 / RIGHT (OUTER) JOIN 右邊多
FULL (OUTER) JOIN 兩邊多
–等值連接
SELECT e.,d.
FROM emp e,dept d
WHERE e.deptno=d.deptno

SELECT e.,d.
FROM emp e JOIN dept d ON e.deptno=d.deptno

–外連接
SELECT e.empno,e.ename,d.dname,d.loc
FROM emp e,dept d
WHERE e.deptno=d.deptno(+)

SELECT e.empno,e.ename,d.dname,d.loc
FROM emp e LEFT JOIN dept d ON e.deptno=d.deptno

SELECT e.empno,e.ename,d.dname,d.loc
FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno

SELECT e.empno,e.ename,d.dname,d.loc
FROM emp e FULL OUTER JOIN dept d ON e.deptno=d.deptno

–自連接
SELECT e.ename,m.ename
FROM emp e,emp m
WHERE e.mgr=m.empno(+)

八、分組函數

主要用於統計。
PS:所有的空都不參與計算。
常見的分組函數:AVG SUM MAX MIN COUNT

注意事項:
(1)出現在SELECT 後的字段(列),若是有分組函數的存在,若是沒有出現在分組函數中,就該出現在GROUP BY 中。
(2)但是出現在GROUP BY中的字段可以不必出現在SELECT中。
(3)分組函數加上限制條件來篩選的時候不能使用WHERE,而是應當使用HAVING。

格式順序:
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

九、Sqlplus

1.User process<- 鏈接 ->Server Process <- 會話 ->Oracle Process
2.使用 VERIFY 在 iSQL*Plus 中顯示變量被替代前和變量被替代後的SQL語句。
3.
(1)@ 路徑 執行文件內容的語句
(2)spool 路徑
文件語句(SELECT * FROM emp)
Spool off;
作用:將表裏面的信息全部放入到文件中去。

十、處理數據

1.sql語句分類:
(1)DML(數據操作語言) insert delete update
(2)DDL(數據定義語言) create drop alter
(3)DCL(數據控制語言) grant revoke
PS:select有的時候被分在DML中,有的時候被分在DQL中!
增加:INSERT INTO 表名 VALUES(值1,值2…)
INSERT INTO 表名(字段1,字段2…) VALUES(值1,值2…)
INSERT INTO 表名1(字段1,字段2…) SELECT 字段1,字段2… FROM 表名2
修改:UPDATE 表名 SET 字段1=值1 WHERE
UPDATE 表名 SET 字段1=值1,字段2=值2… WHERE
UPDATE 表1 SET 字段1=(SELCT 字段1
FROM 表2
WHERE 表1.關聯字段=表2.關聯字段)
WHERE
刪除: DELETE FROM 表名 WHERE
DELETE FROM 表1 WHERE 字段1=(SELCT 字段1
FROM 表2
WHERE 表1.關聯字段=表2.關聯字段)

2.查詢SELECT 有的分在DML上,有的分在DQL上。

3.每次操作DML的時候,需要在執行操作後提交或者是回滾(相當於撤銷),必須要避免鎖等。

4.事物(本地事務):是指作爲單個邏輯工作單元執行的一系列操作,要麼完整地執行,要麼完全地不執行。
(1)作用:保證數據一致
(2)特徵:ACID(atomicity,consistency,isolation,durability)
A:原子性(不可分) C:一致性(同時) I:隔離性(對外界隔離) D:持久性
(3)隔離級別
未提交讀
提交讀
可重複讀
串讀
(4)以下面的其中之一作爲結束:
COMMIT 或 ROLLBACK 語句
DDL 或 DCL 語句(自動提交)
用戶會話正常結束
系統異常終了

若是一個針對同一個表,A修改了裏面的數據,但是沒有提交,此時,B看到的表是沒有修改的,但是A看到的表是修改了的樣子。

5.鎖:
(1)排它鎖(x鎖,獨佔鎖,寫鎖):不可讀,也不可寫
(2)共享鎖(s鎖,讀鎖):可讀,不可寫

十一、創建和管理表

1.VARCHAR2(size),CHAR(size)的區別?
VARCHAR2:長度可變,輸入的是多長就是多長
CHAR:長度固定,不足的話以空格補齊,但是查詢的時候一般不需要自己補上空格,若是 不行,那麼就是用trim
PS:兩者都不可以接收超過size限制長度的字符串。

2.NUMBER(p,s)
P:整數部分的長度
S:小數部分的長度

3.LONG ,CLOB,BLOB的區別?
LONG:可變長字符數據,最大可達到2G,但是一張表裏面最多能有一個列是long 型的,只能存儲文本。
CLOB:字符數據,最大可達到4G,只能存儲文本。
BLOB:二進制數據,最大可達到4G,可以存儲文本,圖片,聲音。

4.rowid:隱藏的列,記錄了數據存在磁盤的具體位置。

5.
(1)增加列
ALTER TABLE 表名
ADD (列名 類型(size))
(2)修改列:可以修改列的數據類型, 尺寸, 和默認值,不可以修改列名
ALTER TABLE 表名
MODIFY (列名 類型(size))
(3)刪除列
ALTER TABLE 表名
DROP COLUMN 列名

6.改變對象的名稱(表的重命名):執行RENAME語句改變表, 視圖, 序列, 或同義詞的名稱。
RENAME dept TO detail_dept;
Table renamed.
必須是對象的擁有者

7.SET UNUSED 一般針對大數據,但是不能重新設置回可用,只能刪除
ALTER TABLE table
DROP UNUSED COLUMNS;

8.Delete drop truncate的區別?
Delete:可以回滾,刪除數據
Drop:不可以回滾,刪除表的結構和數據
Truncate:不可以回滾,刪除表的所有數據

PS:存儲數據的地方有一個叫做高水位線(high water),高水位線以後的部分是從來沒有存儲過數據的。除了本身要存儲數據所需要的空間外,通常還會有預留的空間,能夠滿足正常修改數據的需求,若是某一個數據更改的過大,那麼會導致 行遷移 ,效率極低,所以需要避免行遷移。DELETE刪除數據的時候是一行一行的刪除數據的,但是TRUNCATE刪除數據是直接把高水位線移到初始的位置,直接清除裏面所有的數據,所以效率比DELETE高很多。

9.(1)創建表
CREATE TABLE dept
(
deptno NUMBER(2),
dname VARCHAR2(14),
loc VARCHAR2(13)
);
(2)刪除表DROP TABLE dept80;

十二、約束

1.五種基本約束
(1)NOT NULL:
不能插入空值
create table T_CLASS
(
ID NUMBER not null,
NAME VARCHAR2(10)
)
(2)UNIQUE
UN_開頭 不能有兩行數據相同,但是可以兩個空值
alter table T_STUDENT
add constraint UN_T_STUDENT2 unique (NAME)
(3)PRIMARY KEY
PK_ 開頭,主鍵,不能爲空,唯一(一張表有且僅能有一個主鍵),但是可以創建聯合主鍵(多個列一起充當主鍵,全部都相同纔算作是相同)
alter table T_CLASS
add constraint PK_T_CLASS primary key (ID)
(4)FOREIGN KEY
FK_開頭,外鍵,一張表的一個列引用(指向,對應)另外的一個表的列,這個列需要有唯一約束,原來表的那個列就被叫做外鍵。在增加數據的時候,必須是另外一張表主鍵中有的值。主要體現在關聯之後,作用:是表中的數據更加有意義。
alter table T_STUDENT
add constraint PK_T_STUDENT1 foreign key (CLASS_ID)
references T_CLASS (ID);

references T_CLASS (ID) on delete cascade ;(級聯)
(5)CHECK
alter table T_CLASS
add constraint C_T_CLASS
check (id>0);

2.刪除約束:
(1)
ALTER TABLE employees
DROP CONSTRAINT emp_manager_fk;
(2)
ALTER TABLE departments
DROP PRIMARY KEY CASCADE;

3.無效化約束:
ALTER TABLE employees
DISABLE CONSTRAINT emp_emp_id_pk CASCADE;

4.激活約束:
ALTER TABLE employees
ENABLE CONSTRAINT emp_emp_id_pk;
PS:當定義或激活UNIQUE 或 PRIMARY KEY 約束時系統會自動創建UNIQUE 或 PRIMARY KEY索引

5.級聯約束:
(1)CASCADE CONSTRAINTS 子句在 DROP COLUMN 子句中使用
(2)在刪除表的列時 CASCADE CONSTRAINTS 子句指定將相關的約束一起刪除
(3)在刪除表的列時 CASCADE CONSTRAINTS 子句同時也刪除多列約束
Eg.1
ALTER TABLE test1
DROP (pk) CASCADE CONSTRAINTS;
Eg.2
ALTER TABLE test1
DROP (pk, fk, col1) CASCADE CONSTRAINTS;

6.查詢約束 USER_CONSTRAINTS 這是一個系統的表
查詢定義約束的列USER_CONS_COLUMNS

十三、視圖

1.常見的數據庫對象
(1)表——基本的數據存儲集合,由行和列組成。
(2)視圖——從表中抽出的邏輯上相關的數據集合。
(3)序列——提供有規律的數值。
(4)索引——提高查詢的效率
(5)同義詞——給對象起別名

2.創建視圖需要給權限,操作的時候基本上可以把視圖當做一個表
(普通視圖)
conn /as sysdba
grant create view to scott;
特點:
(1)視圖和原表是同一個行地址,表更新,視圖的數據也會更新。
(2)視圖也可以修改,改了原表的數據也會被修改,但是視圖不應該修改。
(3)視圖也可以創建視圖。
PS:在創建的視圖語句之後加上 with read only就可以讓視圖變成只讀。

3.Rownum
必須從1開始,通常情況下是在分頁的時候用的,若不是以1開始的話,那麼該條數據將會被丟棄,所以rownum>1永遠都找不到數據。
SELECT *
FROM(
SELECT rownum r,e.*
FROM v_emp e
WHERE rownum <= 10
) a
WHERE a.r >= 6

4.刪除視圖:DROP VIEW view;

5.物化視圖:數據和原表的數據存儲的位置(行地址)不同
作用:提高性能(利用查詢重寫)
PS:此時,需要打開查詢重寫開關!!!

十四、其他的數據庫對象

1 序列
(1)是什麼?
自動提供唯一的數值
共享對象
主要用於提供主鍵值(工作中一般不如此,例如訂單號通常等長度且複雜)
代替應用代碼
將序列值裝入內存可以提高訪問效率
(2)如何創建 CREATE SEQUENCE seq_名字
[INCREMENT BY n](步長)
[START WITH n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}](是否循環)
[{CACHE n | NOCACHE}];(是否存在緩存,若是緩存5,從1開始,那麼查看的下一個值就是6)
(3)NEXTVAL 和 CURRVAL
NEXTVAL 返回序列中下一個有效的值,任何用戶都可以引用
CURRVAL 中存放序列的當前值
NEXTVAL 應在 CURRVAL 之前指定 ,二者應同時有效

Eg.
SELECT dept_deptid_seq.CURRVAL
FROM dual;
(4)序列在下列情況下出現裂縫:
回滾
系統異常
多個表同時使用同一序列
(5)修改序列ALTER SEQUENCE
PS:
必須是序列的擁有者或對序列有 ALTER 權限
只有將來的序列值會被改變
改變序列的初始值只能通過刪除序列之後重建序列的方法實現
(6)刪除序列DROP SEQUENCE

2 索引
(1)是什麼?
一種數據庫對象
通過指針加速 Oracle 服務器的查詢速度(一般的索引都是有序的,order+索引)
通過快速定位數據的方法,減少磁盤 I/O
索引與表相互獨立(分盤,數據更新會影響索引效率)
Oracle 服務器自動使用和維護索引
(2)查看執行計劃
選中需要查看的語句,然後按下F5,cost(成本),主要是指CPU,內存,IO
(3)創建索引
CREATE INDEX index
ON table (column[, column]…);
自動創建: 在定義 PRIMARY KEY 或 UNIQUE 約束後系統自動在相應的列上創建 唯一性索引
手動創建: 用戶可以在其它列上創建非唯一的索引,以加速查詢
(4)以下情況可以創建索引:
列中數據值分佈範圍很廣
列中包含大量空值
列經常在 WHERE 子句或連接條件中出現
表經常被訪問而且數據量很大 ,訪問的數據大概佔數據總量的2%到4%
(5)下列情況不要創建索引:
表很小
列不經常作爲連接條件或出現在WHERE子句中
查詢的數據大於2%到4%
表經常更新
加索引的列包含在表達式中
(6)查詢索引
可以使用數據字典視圖USER_INDEXES 和 USER_IND_COLUMNS 查看索引的信息
(7)基於函數的索引
若是索引的後面接的不是直接的列,而是對某一個列使用的函數,那麼在進行WHERE的時候,若是直接使用列名是不會使用索引的,需要同時加上和索引後面相同的函數,此時,纔會使用索引。

3 同義詞
(1)使用
CREATE SYNONYM synonym
FOR object;
(2)作用
方便訪問其它用戶的對象
縮短對象名字的長度

十五、表的設計和範式

1 三大範式:
1NF:字段不可分
2NF:滿足第一範式的基礎上,表中要有主鍵列
3NF:滿足第二範式的基礎上,非主鍵列相互獨立
PS:通常情況下,需要滿足,但是在實際工作中很多時候都是違背了的,目的是提高效率。

2 表之間的關係:(至少兩張表,雙向來看)
(1)一對一:主鍵關聯 亦或是 外鍵關聯
(2)一對多:在多的一端增加外鍵
(3)多對多:引入中間表,聯合主鍵(其實拆開來看就是兩個一對多)

3 行列轉換(http://blog.sina.com.cn/s/blog_67be3b4501017hbc.html
第一部分:行轉列
新建一個表:
CREATE TABLE HANG2LIE
( “ID” NUMBER,
“NAME” VARCHAR2(20),
“COURSE” VARCHAR2(20),
“SCORE” NUMBER
)
數據列出來如下:
ID NAME COUR SCORE


1 name_1 語文 33
1 name_1 數學 63
1 name_1 英語 71
1 name_1 歷史 68
1 name_1 化學 94
2 name_2 語文 85
2 name_2 數學 4
2 name_2 英語 98
2 name_2 歷史 9
2 name_2 化學 12
3 name_3 語文 49
3 name_3 數學 96
3 name_3 英語 30
3 name_3 歷史 60
3 name_3 化學 2
要實現的行轉列的效果如下(或者類似的結果):
ID NAME SCORES


1 name_1 33,63,71,94,68
2 name_2 85,4,98,12,9
3 name_3 49,2,60,96,30

1、通過Oracle數據庫自帶的wm_concat()函數來實現:
select id,name,wm_concat(score) scores
from HANG2LIE
group by id,name;

2、通過decode函數:
select id,name,sum(decode(course,’語文’,score,null)) “語文”,
sum(decode(course,’數學’,score,null)) “數學”,
sum(decode(course,’英語’,score,null)) “英語”,
sum(decode(course,’歷史’,score,null)) “歷史”,
sum(decode(course,’化學’,score,null)) “化學”
from HANG2LIE
group by id,name;
得到的結果:
ID NAME 語文 數學 英語 歷史 化學


2 name_2 85 4 98 9 12
1 name_1 33 63 71 68 94
3 name_3 49 96 30 60 2
3、通過case表達式
select id,name,sum(case when course=’語文’ then score end) “語文”,
sum(case when course=’數學’ then score end) “數學”,
sum(case when course=’英語’ then score end) “英語”,
sum(case when course=’歷史’ then score end) “歷史”,
sum(case when course=’化學’ then score end) “化學”
from HANG2LIE
group by id,name;
得到的結果和第二種實際上是一樣的,其實語句也是一樣的,只不過把decode函數換成了case when表達式而已

列轉行
create table lie2hang as
select id,name,sum(case when course=’語文’ then score end) Chinese,
sum(case when course=’數學’ then score end) Math,
sum(case when course=’英語’ then score end) English,
sum(case when course=’歷史’ then score end) History,
sum(case when course=’化學’ then score end) Chemistry
from hang2lie
group by id,name;
結構如下:
ID NAME Chinese Math English History Chemistry


2 name_2 85 4 98 9 12
1 name_1 33 63 71 68 94
3 name_3 49 96 30 60 2
我們要實現如下的查詢效果:
ID NAME COUR SCORE


2 name_2 語文 85
1 name_1 語文 33
3 name_3 語文 49
2 name_2 數學 4
1 name_1 數學 63
3 name_3 數學 96
2 name_2 英語 98
1 name_1 英語 71
3 name_3 英語 30
2 name_2 歷史 9
1 name_1 歷史 68
3 name_3 歷史 60
2 name_2 化學 12
1 name_1 化學 94
3 name_3 化學 2
1、集合查詢
實現的SQL語句:
select id,name,’語文’ course,chinese score from lie2hang
union
select id,name,’數學’ course,math score from lie2hang
union
select id,name,’英語’ course,english score from lie2hang
union
select id,name,’歷史’ course,history score from lie2hang
union
select id,name,’化學’ course,chemistry score from lie2hang;
這就是比較常見的列傳行操作,主要原理是利用SQL的union集合查詢。
2、insert all操作
語句如下:
create table lie2hang_result(
id number,
name varchar2(20),
course varchar2(20),
score number
);
insert all
into lie2hang_result(id,name,course,score) values(id,name,’語文’,chinese)
into lie2hang_result(id,name,course,score) values(id,name,’數學’,math)
into lie2hang_result(id,name,course,score) values(id,name,’英語’,english)
into lie2hang_result(id,name,course,score) values(id,name,’歷史’,history)
into lie2hang_result(id,name,course,score) values(id,name,’化學’,chemistry)
select id,name,chinese,math,english,history,chemistry from lie2hang;

十六、其他知識

通常DBA才能用的上
1 控制用戶權限
(1)創建用戶
CREATE USER user
IDENTIFIED BY password;(設置密碼)
(2)給權限
GRANT create session, create table,
create sequence, create view
TO scott;
(3)角色:就是將權限打包,類似於 類與其各個屬性的關係
(4)修改密碼
ALTER USER scott
IDENTIFIED BY lion;
(5)分配具體的權限
GRANT select
ON employees
TO sue, rich;
(6)WITH GRANT OPTION 使用戶同樣具有分配權限的權利,能分配的權限是當前用擁有的權限。
(7)PUBLIC:若是不是TO 某一個對象或者是用戶且是爲public,那麼就是向數據庫中所有用戶分配權限。
(8)回收權限
REVOKE {privilege [, privilege…]|ALL}
ON object
FROM {user[, user…]|role|PUBLIC}
[CASCADE CONSTRAINTS];
(9)數據庫聯接
CREATE PUBLIC DATABASE LINK hq.acme.com
USING ‘sales’;

也可以先去tnsnames.ora中配置一個,修改IP地址,服務器的名稱,訪問的對象名稱,然後登陸自己的用戶到database links中new,其中NAME隨意(就是之後訪問需要@的東西),然後輸入想要訪問的用戶,對應的密碼,以及database(裏面填寫前面自己配置的訪問的對象名稱))

訪問:
SELECT *
FROM [email protected];

2 SET 運算符
(1)UNION 操作符返回兩個查詢的結果集的並集
Eg.
SELECT employee_id, job_id
FROM employees
UNION
SELECT employee_id, job_id
FROM job_history;
(2)UNION ALL 操作符返回兩個查詢的結果集的並集以及兩個結果集的重複部分(不去重)
(3)INTERSECT 操作符返回兩個結果集的交集
(4)MINUS 操作符返回兩個結果集的補集
通俗解釋:前者減去與後者相同的部分

3 數據小結
(1)ROLLUP:
GROUP BY ROLLUP(department_id, job_id)
先對department_id, job_id進行分組計算,然後再按照department_id進行小結計算。
(2)CUBE:
使用同ROLLUP,先整體分組計算,然後按照每一個進行小結。
(3)複合列
複合列是被作爲整體處理的一組列的集合ROLLUP (a,(b,c),d)
使用括號將若干列組成複合列在ROLLUP 或 CUBE 中作爲整體進行操作
在ROLLUP 或 CUBE中, 複合列可以避免產生不必要的分組結果

4 高級子查詢
(1)相關子查詢
Eg.1
SELECT column1, column2, ..
FROM table1 outer
WHERE column1 operator
(SELECT colum1, column2
FROM table2
WHERE expr1 =outer.expr2);
Eg.2
SELECT e.*
FROM emp e
WHERE EXISTS(SELECT d.–d.可以寫成常量,一般寫成“1”
FROM dept d
WHERE e.deptno = d.deptno)

插入:
INSERT INTO 表名1(字段1,字段2…) SELECT 字段1,字段2… FROM 表名2
修改:
UPDATE 表1 SET 字段1=(SELCT 字段1
FROM 表2
WHERE 表1.關聯字段=表2.關聯字段)
WHERE
刪除:
DELETE FROM 表1 WHERE 字段1=(SELCT 字段1
FROM 表2
WHERE 表1.關聯字段=表2.關聯字段)
(2)Exists
SELECT employee_id, last_name, job_id, department_id
FROM employees outer
WHERE EXISTS ( SELECT ‘X’
FROM employees
WHERE manager_id =
outer.employee_id);
基本上可以等同於in,但是執行的效率比之in要高很多。
(3)With
With
dept_costs AS (
SELECT d.department_name, SUM(e.salary) AS dept_total
FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY d.department_name),
avg_cost AS (
SELECT SUM(dept_total)/COUNT(*) AS dept_avg
FROM dept_costs)
SELECT *
FROM dept_costs
WHERE dept_total >
(SELECT dept_avg
FROM avg_cost)
ORDER BY department_name;
就相當於重命名。

5 分級查詢
(1)樹
有下級的 節點
沒有下級的 葉子節點
遍歷
SELECT employee_id, last_name, job_id, manager_id
FROM employees
START WITH employee_id = 101
CONNECT BY PRIOR manager_id = employee_id ;
左邊高就是底到頂,左邊低就是頂到底

Level和Lpad可以使得分級更加明顯
Eg.1
SELECT LPAD(last_name, LENGTH(last_name)+(LEVEL*2)-2,’_’)
AS org_chart
FROM employees
START WITH last_name=’King’
CONNECT BY PRIOR employee_id=manager_id
把level當做一個列來使用就可以了

6 外部表
(1)是什麼
外部表是隻讀的表,其數據存儲在數據庫外的平面文件中
外部表的各種參數在 CREATE TABLE 語句中指定
使用外部表, 數據可以存儲到外部文件或從外部文件中上載數據到數據庫
數據可以使用 SQL訪問, 但不能使用 DML 後在外部表上創建索引
(2)創建路徑
CREATE DIRECTORY emp_dir AS ‘/flat_files’ ;
Eg.
CREATE TABLE oldemp (
empno NUMBER, empname CHAR(20), birthdate DATE)
ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADER
DEFAULT DIRECTORY emp_dir
ACCESS PARAMETERS
(RECORDS DELIMITED BY NEWLINE
BADFILE ‘bad_emp’
LOGFILE ‘log_emp’
FIELDS TERMINATED BY ‘,’
(empno CHAR,
empname CHAR,
birthdate CHAR date_format date mask “dd-mon-yyyy”))
LOCATION (‘emp1.txt’))
PARALLEL 5
REJECT LIMIT 200;
外部表可以當做正常的表一樣的使用,但是並不能夠在oracle裏面直接對錶上的數據進行更改,不過可以在數據的源文件中去更改數據,此時,若是再次查詢這個表,那麼查詢到的是已經更改過後的數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章