子查詢目標
子查詢是一種把查詢的結果作為參數返回給另一個查詢的一種查詢
子查詢可以讓你將多個查詢綁定在一起
嵌套子查詢
多層子查詢
相關子查詢
可接受外部的引用
exists/any/all
any:與子查詢中的每一行與主查詢進行比較並對子查詢中的每一行返回一個true值
some結果與any一樣
all子查詢結果都滿足條件才會返回true
DML
數據庫插入
insert value
insert select
updateupdate table set col=value
delete
DDL
創建和操作表
create
存儲參數 storage(initial sizenext sizeminextents valuepctincrease value)初始分配空間追加的長度最小追加長度每次追加的百分比或進行下一次追加
用已存在的表創建新表
create table new_t(numnameamount) as(select * from old_t where amount<)
alter
加入一列到已經存在的表中
修改已經存在的表中的某一列
ALTER TABLE BILLS MODIFY NAME CHAR();將表中某字段改為長度個字符
ALTER TABLE NEW_BILLS ADD COMMENTS CHAR();向表中加一列
alter不能用於對一個數據庫增加或刪除字段但可以將某列由not null改為null
drop
drop table table_name;
創建視圖和索引
視圖常被稱為虛表create view視圖是一個數據庫對象他允許用戶從一個表或一組表中建立一個虛表它本身沒有數據僅僅是一條查詢語句它可以方便的在各個表中進行聯合查詢這對用戶來說是很方便的其次可以增加安全性屏蔽一些不想讓無權限的用戶看一些表中的數據即隱藏了基本表這同時也可以隱藏著其中的復雜性有時更改起來也很方便而不必涉及到應用程序如一個表中有列數據我只想讓其他用戶看到列這時候視圖就會顯得十分方便如表school 有IDnamelesson三項我只需要顯示其中項實例如下
子查詢目標
子查詢是一種把查詢的結果作為參數返回給另一個查詢的一種查詢
子查詢可以讓你將多個查詢綁定在一起
嵌套子查詢
多層子查詢
相關子查詢
可接受外部的引用
exists/any/all
any:與子查詢中的每一行與主查詢進行比較並對子查詢中的每一行返回一個true值
some結果與any一樣
all子查詢結果都滿足條件才會返回true
DML
數據庫插入
insert value
insert select
updateupdate table set col=value
delete
DDL
創建和操作表
create
存儲參數 storage(initial sizenext sizeminextents valuepctincrease value)初始分配空間追加的長度最小追加長度每次追加的百分比或進行下一次追加
用已存在的表創建新表
create table new_t(numnameamount) as(select * from old_t where amount<)
alter
加入一列到已經存在的表中
修改已經存在的表中的某一列
ALTER TABLE BILLS MODIFY NAME CHAR();將表中某字段改為長度個字符
ALTER TABLE NEW_BILLS ADD COMMENTS CHAR();向表中加一列
alter不能用於對一個數據庫增加或刪除字段但可以將某列由not null改為null
drop
drop table table_name;
創建視圖和索引
視圖常被稱為虛表create view視圖是一個數據庫對象他允許用戶從一個表或一組表中建立一個虛表它本身沒有數據僅僅是一條查詢語句它可以方便的在各個表中進行聯合查詢這對用戶來說是很方便的其次可以增加安全性屏蔽一些不想讓無權限的用戶看一些表中的數據即隱藏了基本表這同時也可以隱藏著其中的復雜性有時更改起來也很方便而不必涉及到應用程序如一個表中有列數據我只想讓其他用戶看到列這時候視圖就會顯得十分方便如表school 有IDnamelesson三項我只需要顯示其中項實例如下
所以在適當的時候十分有必要在眾多表中建立視圖
索引索引是與磁盤上數據的存儲方式不同的另外一組數據的方法索引的特例是表中記錄一句其在磁盤上的存儲位置顯示索引可以在表內創建一個列或列的組合通過對正確的特定的兩個表的歸並字段進行索引可以獲得明顯的好處create index
ps視圖和索引是兩個完全不同的對象但有一點是相同的它們都與一個表或數據庫相關聯盡管每一個對象只能與一個特定的表相關聯但它們還是通過對數據的預排序和預定義顯著地提高了表的工作性能
使用視圖create view view_name(colcol……) as select table_name(colcol……) from table_name;
select規則不能使用union 不能使用order by但使用group by有其相同功能
DML的規則對於多表視圖不能使用delete
除非非空列都出現在視圖中否則不能使用insert
對於一個歸並(merger)的表插入或更新所有被更新的記錄必須屬於同一個物理表
如果創建視圖時使用dintinct子句就不能插入或更新這個視圖
不能更新視圖中 的虛擬列(它是用計算字段得到的)
刪除視圖:drop view view_name;
使用索引
索引可以讓存儲於磁盤上的數據進行重新排序
使用索引的原因在使用unique關鍵字時前執行的保證數據的完整性
可以容易的用索引字段或其他字段進行排序
提高查詢執行速度
索引的概念
兩種方法從數據庫中獲得數據順序訪問方式需要sql檢查每一個記錄以找到與之匹配的此法效率很低但它是使記錄准確定位的唯一方法 使用索引的的直接訪問方式sql采用樹形結構來存儲和返回所以數據用以指示的數據存儲在樹的最末端(也就是葉子)它們被稱為結點(也可以叫葉 子)每個結點中有一個指向其他結點的指針結點左邊的值只是它的雙親結點結點右邊的值則是孩子結點或葉子sql將從根結點開始找到所需的數據
ps當查詢沒有使用索引的表時查詢通常是全表搜索後才會得到結果全表搜索會讓數據庫服務程序遍歷過表中的所有記錄然後返回給定條件的記錄索引可以讓數據庫服務程序快速的定位到表中的確定行
create index index_name on table_name(column_name[column_name]);
SQL Server 和ORACLE允許你創建成簇的索引Informix和ORACLE允許你指明列名是按升序排列還是按降序排列
使用索引不會對表中的物理存儲造成影響
order by和索引的區別
使用order by子句時每次運行它都需要重新進行排序而使用索引時數據庫會建立一個物理索引對象(樹結構)每次運行查詢時都訪問同一個索引
當表被刪除時所有與之相關的索引也將被刪除
使用索引的技巧
對於小表來說使用索引對於性能不會有任何提高
當你的索引列中有極多的不同數據和空值時索引會使性能有極大的提高
當查詢要返回的數據很少時(少於全部數據的%)索引可以優化你的查詢如果要返回的數據很多時索引會加大系統開銷
索引可以提高數據的返回速度但它使得數據的更新操作變慢(對記錄和索引進行更新時請不要忘記先刪除索引當執行完更新操作後恢復索引即可對於一次特定的操作 系統可以保存刪除的索引個小時在這個時間內數據更新完成後你可以恢復它)
索引會占用數據庫空間
可以提高歸並速度
大多數數據庫系統不允許對視圖使用索引
不要對經常需要更新或修改的字段創建索引否則會降低性能
不要將索引與表存儲在同一個驅動器上分開存儲會去掉訪問沖突從而使結果返回的更快
復合索引
對多個字段進行索引(一個索引包含多個列)
CREATE INDEX ID_CMPD_INDEX ON BILLS( ACCOUNT_ID AMOUNT );盡量將經常在查詢中使用的字段放在最前邊
復合索引的性能與單個字段的索引相比是無法判定的
創建索引時使用unique關鍵字
復合索引通常使用unique關鍵字來防止有相同數據的多個記錄多次出現(oracle不支持從i開始支持)
索引與歸並
當查詢中使用了復雜的歸並時你的select語句會好用很長時間
在歸並時對字段創建索引可以顯著得提高查詢反應速度但創建太多的索引會使性能下降而不是提高
作為一個規則你應該對表中的唯一屬性的字段或你用以歸並操作的字段來創建索引
群集(簇)的使用
當 使用群集索引時數據在表中的物理排序方式會被修改使用群集索引通常比傳統的不使用群集索引速度要快ORACLE 中群集的概念與此不同當使用ORACLE 關系數據庫系統時群集就是一個像數據或表一樣的對象群集一般是存儲了表的共有字段以提高對表的訪問速度
oracle的例子
CREATE CLUSTER [schema]cluster (column datatype [column datatype] )
[PCTUSED integer] [PCTFREE integer] [SIZE integer [K|M] ]
[INITRANS integer] [MAXTRANS integer] [TABLESPACE tablespace]
[STORAGE storage_clause] [!!under!!INDEX | [HASH IS column] HASHKEYS integer]
你隨後創建的其於該表的群集的索引會被加入到群集中然後把表也加入群集中你應該只將經常需要歸並的表加入到群集不要向群集中加入只需要用簡單的SELECT 語句進行個別訪問的表
事務處理控制
事務控制
事務控制(事務處理)指關系數據庫系統執行數據庫事務的能力(邏輯分組它有自己的開始和結束)
事務邏輯上必須完成的一命令序列的單位
單元工作期事務的開始和結束時期
開始事務處理
SET TRANSACTION {READ ONLY | USE ROLLBACK SEGMENT segment}
可以在下列語句中使用READ ONLY選項SELECTLOCK TABLESET ROLEALTER SESSIONALTER SYSTEM
有些數據庫支持SET AUTOCOMMIT [ON | OFF]
結束事務處理
COMMIT [WORK][ COMMENT text| FORCE text [ integer] ] ;
COMMIT (TRANSACTION | TRAN | WORK) (TRANSACTION_NAME)
取消事務處理
這必須是在COMMIT 之前ROLLBACK 語句必須在一個事務之中運行它可以一直撤消到事務的開始
在事務中使用保存點
SAVEPOINT savepoint_name;
ROLLBACK TO SAVEPOINT savepoint_name;
數據庫安全
技巧要帶著下邊的問題去規劃你數據庫系統的安全性
誰應該得到數據庫管理員權限?
有多少個用戶需要訪問數據庫系統?
每個用戶應該得到什麼樣的權限與角色?
當一個用戶不再訪問數據庫時應該如何去刪除它?
oracle使用三個結構來實現安全性用戶角色權限
用戶
CREATE USER user
IDENTIFIED {BY password | EXTERNALLY}
[DEFAULT TABLESPACE tablespace]
[TEMPORARY TABLESPACE tablespace]
[QUOTA {integer [K|M] | UNLIMITED} ON tablespace]
[PROFILE profile]
如 果選擇了EXTERNALLY 選項ORACLE 將會依賴於你登錄進入計算機系統的用戶名和密碼也就是說當你登錄進行計算機時你就已經登錄進行了ORACLE我們推薦你使用IDENTIFIED BY 子句強制用戶在登錄進行系統時輸入密碼IDENTIFIED BY PASSWORD
角色
GRANT role TO user [WITH ADMIN OPTION];
REVOKE role from user;
使用視圖同義詞等提高安全性
From:http://tw.wingwit.com/Article/program/Oracle/201311/16734.html