SQL 語句:結構化查詢語言: Structured Query Language
oracle數據庫有三級結構:
關係模式,稱爲“基本表”
存儲模式(內模式)稱爲 “存儲文件”
子模式 稱爲視圖(view)元組稱爲行(row),屬性稱爲列(column)
oracle 體系
“實例”(instance),數據庫文件,
用戶進程(user process)和服務器進程(server process)
其它文件,如:參數文件(parameter file),密碼文件和歸檔日誌文件(archived log file)
物理結構文件是指數據庫文件:由 數據文件,控制文件和重做日誌文件組成。
Instance:實例
包括內存區(SGA)和後臺進程。啓動實例就是啓動這些進程和內存。
一個實例對應一個數據庫,一個數據庫可以有多個實例。
三種連接方式:
連接是指用戶進程與數據庫服務器之間的通訊途徑,一個連接可以有多個會話。
過程是: 用戶進程 連接 服務器進程 再連接 數據庫實例
1、Host-Based方式:服務器和客戶端在同一臺主機上,用戶直接連接數據庫服務器。
2、C/S方式:客戶端通過網絡遠程管理數庫服務器。
3、三層訪問方式:用戶先訪問應用服務器,由應用服務器連接數據庫服務器。
SGA 內存結構
共享池:
共享SQL或者PL/SQL代碼,由庫高速緩存和數據字典高速緩存組成。
重做日誌高速緩衝區:
當用戶執行了INSERT,UPDATE,DELETE等操作後,數據發生了變化,
這些變化了的數據寫入數據庫高速緩存之前會先寫入重做日誌緩衝區,
同時變化之前的數據也放入重做日誌高速緩存,
這樣在數據恢復時,oralce就知道那些需要前滾,那些需要後滾。
大池(large pool)和Java池-------可選的內存區
大池 :在共享服務器環境下,oracle在共享池中分配額外的空間用於存儲用戶進程和服務器進程之間的會話信息,但是用戶進程區域UGA的大部分將在大池中分配,這樣就減輕了共享池的負擔。在大規模的輸入和輸出及備份過程也需要大池作爲緩存空間。
流池(streaming pool)------------流內存,數據共享,可以通過參數動態調整。
SGA PGA UGA
PGA:進程全局區,存儲了服務器進程或單獨的後臺進程的數據信息和控制信息。它隨着服務器進程的創建而被分配內存,隨着進程的終止而釋放內存。與SGA不同,它不是一個共享區域,而是服務器進程專有的區域,在專有的服務器(與共享服務器相對的概念)配置中包括如下組件:排序區,會話信息,遊標狀態,堆棧區。
UGA:用戶全局區,它是共享服務器模式下的概念,指用戶的會話狀態,這部分內存會話總可以訪問,UGA存儲在每個共享服務器都可以訪問SGA中,這樣任何服務器都可以使用用戶會話的數據和其它信息。而在專有服務器模式下,永華會話狀態不需要共享,用戶進程和服務器進程是一一對應的關係,所以,UGA總是在PGA中分配。
後臺進程:
系統監控進程(SMON):數據庫實例恢復。分三步:前滾----打開數據庫-----回滾未提交的事物。
進程監控進程(PMON):在進程失敗獲知連接異常發生時該進程負責一些清理工作。
回滾沒有提交的事務,釋放進程佔用的SGA資源,監視其它oracle進程,監視其它oracle的後臺進程,向oracle TNS監聽器註冊剛啓動的實例。
數據庫寫進程(DBWR):髒數據是指用戶更改了的但沒有提交的數據庫中的數據,因爲數據庫的數據文件與數據庫高速緩存中的數據不一致,稱爲髒數據。寫進程的作用就是把髒數據在特定的條件下寫入到數據文件中。
爲什麼不直接提交髒數據呢?爲了減少I/O次數。當髒數據達到一定數量或條件時才一次性提交髒數據。
歸檔日誌進程(ARCH):它是可選進程,不是在實例啓動時自動啓動,作用是把寫滿的重做日誌文件的數據寫入到一個歸檔日志中,這個歸檔日誌用作介質故障時的數據庫恢復。
校驗點進程:校驗點是一個事件。
SQL語句的介紹
按照功能可以分爲五類:
數據查詢語句:如select
數據操作語句(DML):
如 INSERT 向表中添加紀錄,UPDATE更新表中的數據,通常和WHERE條件語句一起使用。
DELETE語句刪除表中的數據。
數據定義語句(DDL):
CREATE :創建數據庫對象,如:表、索引、視圖等。
ALTER: 改變系統參數,如改變SGA的大小等
DROP:刪除一個對象,如刪除一個表,索引或者序列號
RENAME:重命名一個對象。
TRUNCATE:截斷一個表
事務控制語句
COMMIT:用於提交由DML語句操作的事務。
ROLLBACK: 用於回滾DML語句改變不了的數據。
數據控制語句(DCL):
GRANT: 用於授予用戶訪問某對象的特權
REVOKE:用於回收用戶訪問某對象的特權
空值(NULL)與空值處理函數:
空值是特殊的值,不能說它不存在,也不能說它爲零。空值表示一類沒有定義的值,具有不確定性。當然對於控制的運算也具有特殊性,因爲不確定性的值是無法和一類具有確定性的值進行邏輯或算數運算的,oracle提供了一類空值處理函數,通過這些函數實現空值(NULL)的運算。
分組函數:
AVG和SUM函數
MAX和MIN函數,可以操作的字符類型有數字型,字符型和日期型
COUNT函數 返回經過計算得到的返回的行數,包括空行和重複的行
GROUP BY 句子
HAVING 子句:在分組函數中,不能使用WHERE子句限制分組函數,所以Oracle設計了HAVING 子句對分組函數的某些限制。
分組函數的嵌套使用
簡單查詢之SELECT語句的用法
SELECT * | {[DISTINCT] column | expression [alias] , .......} FROM talbe;
| 表示或的關係,[] 表示可選
SELECT 選擇一個列或多個列
*選擇表中所有的列
DISTINCT去掉列種重複的值
Column | expression選擇列的名字或表達式
Alias爲指定的列設置不同的標題
FROM table 指定要選擇的列所在的表,即對那個表進行數據檢索
SQL> SELECT * FROM SCOTT.EMP; 查詢SCOTT用戶中EMP表中所用的數據
SQL> SELECT deptno,loc from scott.dept 查詢這個表中deptno, loc 這兩列
SQL>SELECT * FROM dept WHERE is NULL 查詢這個表中爲空值的行
別名機制:
在使用SELECT語句時,SQL*PLUS 使用選擇的列名作爲列標題,並且採用大寫的方式,由於表中的列名是數據庫開發人員或程序員設計的,是爲了編程的需要。但是這樣的列標題可能不具備描述性質而難以理解,Oracle提供了列別名更改列標題的顯示方式。
創建Oracle數據庫方式
1、使用DBCA(數據庫配置助手)
2、使用CREATE DATABASE 指令
3、在安裝數據庫軟件時創建數據庫
臨時表:
臨時表是特殊的表,它只對當前用戶的當前會話有效,創建臨時表的目的就是使得某些操作的效率更高,臨時表中的數據只對當前的會話的用戶有效,是當前會話的私有數據,當前會話只操作自己的數據,沒有數據鎖的爭用,這極大提高了歷史表操作的效率。
對錶中的數據可以進行:維護列,修改列,刪除列
刪除表和截斷表的區別:是否保留表結構。
oracle 數據字典
數據字典是在數據庫的創建過程中創建的,它是由oracle數據庫服務器管理,存儲在系統表空間中,它是一個集合,這個集合由只讀表和視圖組成,提供所有和數據庫相關的信息。數據字典由兩大類組成。
基表:基表無法讀取,必須通過數據字典視圖才轉化爲可讀的表。
數據字典視圖:是可讀的數據字典,也是DBA經常使用的數據字典。它由以下兩種對象組成:
靜態數據字典表:它基於基表而創建,容易閱讀,通過使用一個名爲catalog.sql腳本文件創建。如 user_tables,dba_objects等
動態性能視圖:它在數據庫運行期間存在,它讀取內存或控制文件的內容,提供了數據的動態性能信息。如:v$logfil, v$database , v$instance 等等。
三種主要的靜態數據字典表:dba_XXX , all_XXX , user_xx
查詢該用戶所擁有的數據庫對象信息:
user_tables , user_indexes (索引), user_views(視圖)
動態性能視圖以V$開頭,它只存在於運行的數據庫中,它是一組虛表。
V$instance , V$database , V$controlfile , V$log , V$logfil
視圖的概念:
視圖是一個虛表,不佔用存儲空間,不存儲數據,數據字典中只有視圖的定義,視圖可以通過DML語言操作,但是有一定的限制,因爲操作視圖最終還是操作創建視圖的底層表。
如:我們爲每一個部門創建一個視圖,這樣不同的部門只要使用視圖就可以完成查詢,而不再使用多表連接和WHERE條件語句來限制查詢的部門。
例子:create or replace view research_view
(“employee_name”,”job”,”hiredate”,”salary”,”dep_name”)
as
select e.ename,e.job,e.hiredate,e.sal , d.dname
from dept d,emp e
where e.deptno = d.deptno
and d.deptno = 20
with read only;
使用視圖的WITH子句:with read only 子句
刪除視圖:drop view emp_view;
驗證是否刪除成功:select 語句
事務的概念:
事務的由來:銀行取款的例子
如果用戶A要給用戶B從銀行轉賬10000元,此時我們考慮ATM機的行爲,把ATM機的行爲作爲一個事務。ATM機的實施步驟如下:
從用戶A的賬號減少1萬元
從用戶B的賬戶增加一萬元。
上述兩個步驟必須都成功執行,如果兩個步驟任何一個出現了問題,我們說ATM機沒有正確的完成這次轉賬行爲。誰也不希望在自己的賬戶上白白丟失一萬元。此時ATM機的兩個執行步驟是不可分割的行爲,要麼執行成功,要麼不執行(回滾所有更改的數據),ATM機的兩個操作在邏輯上就可以看作是一個完整的事務。
事務是一組邏輯工作單元,它有一條或多條SQL語句組成。一個事務可以在操作的數據庫對象上執行一個或多個操作,事務可以作爲程序的部分功能而執行。
事務開始於一條可執行的SQL語句,繼續執行事務主體,然後結束以下的一種情況發生:
1、顯示提交COMMIT:當事務遇到COMMIT指令時,將結束事務並永久保存所有更改的數據到數據庫文件中。
2、顯示回滾ROLLBACK:當事務遇到這個指令時,也結束事務的執行,但是此時它回滾所有更改的數據到其原始值,即取消所有更改。
3、DDL語句:一旦用戶在使用數據定義語言時,如CREATE、DROP等,則之前的所有DML語言操作都作爲事務的一部分而提交,此時稱爲隱式提交。
4、正常結束程序,如果oracle 數據庫應用程序正常結束,如使用 SQL*PLUS工具更改了數據,而正常退出該工具程序,則oralce自動提交事務。
5、非正常結束程序:當程序崩潰或意外中止時,所有數據更改都被回滾,類似於顯示回滾操作的結果,這裏是隱式回滾的,因爲沒有用戶參與。