1. oracle資料庫如何查看錶的表分區的信息(每個表分區的名字和所屬表空間)
這樣SELECT TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME
FROM USER_TAB_PARTITIONS
註:
USER_TAB_PARTITIONS:可查看分區表的名字、歸屬表空間以及表的詳細分區情況。
USER_PART_TABLES:可查看用戶所有的分區表,以及分區方式。
(1)oracle資料庫小組功能擴展閱讀:
分區表的作用
Oracle的表分區功能通過改善可管理性、性能和可用性,從而為各式應用程序帶來了極大的好處。通常,分區可以使某些查詢以及維護操作的性能大大提高。此外分區還可以極大簡化常見的管理任務,分區是構建千兆位元組數據系統或超高可用性系統的關鍵工具。
分區功能能夠將表、索引或索引組織表進一步細分為段,這些資料庫對象的段叫做分區。每個分區有自己的名稱,還可以選擇自己的存儲特性。從資料庫管理員的角度來看,一個分區後的對象具有多個段,這些段既可進行集體管理,也可單獨管理,這就使資料庫管理員在管理分區後的對象時有相當大的靈活性。
但是,從應用程序的角度來看,分區後的表與非分區表完全相同,使用 sql DML 命令訪問分區後的表時,無需任何修改。
2. oracle資料庫在創建後都會有四個默認資料庫用戶,簡要說明它們的功能
我安裝oracle一般就三個用戶,sys,system,scott。三者許可權大小依次遞減,sys是有資料庫操作員許可權sysdba,可以授權或收回其他用戶許可權。system有dba許可權,多用於管理資料庫,查看、殺掉會話,建用戶,賦許可權什麼的。scott作為測試用戶,測試資料庫是否可以正常使用。
3. oracle個人版,標准版和企業版的區別
標准版One(Oracle Database Standard Edition One)在使用、運行能力、性能方面提供了空前的靈活性,應用於工作組、部門和web應用。從較少業務的單伺服器環境到多方面的分布環境,Oracle Database Standard Edition One為重要業務應用提供了所有必須的功能。
標准版(Oracle Database Standard Edition)除了提供了Oracle Database Standard Edition One的功能之外,它還支持多機器的集群服務Real Application Clusters,在Oracle Database 10g之前版本的標准版中不包含Real Application Clusters,在早期版本也不是有效的option。
企業版(Oracle Database Enterprise Edition)為重要任務應用提共了性能、有效性、可測量性和安全性等需求,如高吞吐量的聯機事務處理(OLTP)應用,密集查詢的數據倉庫,要求嚴格的網路應用。Oracle Database Enterprise Edition包含了所有的Oracle資料庫組件,具有更加強大的功能,更多優勢的選擇,詳細描述見 Chapter 2 "Options and Packs"
個人版(Oracle Database Personal Edition)提供了單用戶的開發和部署環境,它的需求與Oracle Database Standard Edition One、Oracle Database Standard Edition、Oracle Database Enterprise Edition全兼容。
Personal Edition包含所有包含在企業版中的組件,也包括企業版中所有有效的option,除了Oracle Real Application Clusters,該option不能用於個人版。個人版在以下平台中有效:Windows 2000,Windows NT,Windows XP,Windows Server 2003 (32-bit 和 64-bit 版本)。管理包不包含在個人版中。
4. Oracle資料庫基本操作步驟是怎樣的呢
e資料庫伺服器就足夠了,這時你已經擁有oracle客戶端的功能。(1)你可以通過第三方軟體:如
plsql
developer(非常強大的oracle資料庫操作軟體)來操作oracle資料庫;(2)當然裝完oracle資料庫伺服器以後,你也可以通過控制台來操作,步驟如下:開始-〉運行-〉cmd(打開控制台窗口)-〉敲入
sqlplus
->輸入正確的用戶名密碼(如scott/tiger)就可以操作了。
裝完oracle資料庫伺服器以後,如果你還裝oracle客戶端(client),那麼你在連接資料庫的時候記得加上完整的資料庫服務名:如scott/[email protected]:1521/yourinstancename
這樣也能保證正確的操作資料庫了。
另外,虛機團上產品團購,超級便宜
5. oracle數據管理功能有哪些
Oracle Database,又名Oracle RDBMS,或簡稱Oracle。是甲骨文公司的一款關系資料庫管理系統。
到目前仍在資料庫市場上佔有主要份額。作為一個通用的資料庫系統,它具有完整的數據管理功能;作為一個關系資料庫,它是一個完備關系的產品;作為分布式資料庫它實現了分布式處理功能。但它的所有知識,只要在一種機型上學習了ORACLE知識,便能在各種類型的機器上使用它。
主要應用的企業:現在基本大型的企業都是用的oracle資料庫,如公安局的身份證數據信息存儲、中國銀行的數據信息存儲、淘寶數據存儲等等。這些企業基本都有一個共同特點:數據量大,要求數據准確,要求系統性能高。
6. Oracle系統的結構
ORACLE資料庫系統為具有管理ORACLE資料庫功能的計算機系統。每一個運行的ORACLE資料庫與一個ORACLE實例(INSTANCE)相聯系。一個ORACLE實例為存取和控制一資料庫的軟體機制。每一次在資料庫伺服器上啟動一資料庫時,稱為系統全局區(SYSTEM GLOBAL AREA)的一內存區(簡稱SGA)被分配,有一個或多個ORACLE進程被啟動。該SGA 和 ORACLE進程的結合稱為一個ORACLE資料庫實例。一個實例的SGA和進程為管理資料庫數據、為該資料庫一個或多個用戶服務而工作。
在ORACLE系統中,首先是實例啟動,然後由實例裝配(MOUNT)一資料庫。在松耦合系統中,在具有ORACLE PARALLEL SERVER 選項時,單個資料庫可被多個實例裝配,即多個實例共享同一物理資料庫。
進程結構和內存結構
進程是操作系統中的一種機制,它可執行一系列的操作步。進程是由多個線程組成的。在有些操作系統中使用作業(JOB)或任務(TASK)的術語。一個進程通常有它自己的專用存儲區。ORACLE進程的體系結構設計使性能最大。
ORACLE實例有兩種類型:單進程實例和多進程實例。
單進程ORACLE(又稱單用戶ORACLE)是一種資料庫系統,一個進程執行全部ORACLE代碼。由於ORACLE部分和客戶應用程序不能分別以進程執行,所以ORACLE的代碼和用戶的資料庫應用是單個進程執行。
在單進程環境下的ORACLE 實例,僅允許一個用戶可存取。例如在MS-DOS上運行ORACLE 。
多進程ORACLE實例(又稱多用戶ORACLE)使用多個進程來執行ORACLE的不同部分,對於每一個連接的用戶都有一個進程。
在多進程系統中,進程分為兩類:用戶進程和ORACLE進程。當一用戶運行一應用程序,如PRO*C程序或一個ORACLE工具(如SQL*PLUS),為用戶運行的應用建立一個用戶進程。ORACLE進程又分為兩類:伺服器進程和後台進程。伺服器進程用於處理連接到該實例的用戶進程的請求。當應用和ORACELE是在同一台機器上運行,而不再通過網路,一般將用戶進程和它相應的伺服器進程組合成單個的進程,可降低系統開銷。然而,當應用和ORACLE運行在不同的機器上時,用戶進程經過一個分離伺服器進程與ORACLE通信。它可執行下列任務:
對應用所發出的SQL語句進行語法分析和執行。
從磁碟(數據文件)中讀入必要的數據塊到SGA的共享資料庫緩沖區(該塊不在緩沖區時),將結果返回給應用程序處理。
系統為了使性能最好和協調多個用戶,在多進程系統中使用一些附加進程,稱為後台進程。在許多操作系統中,後台進程是在實例啟動時自動地建立。一個ORACLE實例可以有許多後台進程,後台進程的名字為:
DBWR資料庫寫入程序
LGWR日誌寫入程序
ARCH歸檔
RECO 恢復
LCKn 封鎖 。
7. oracle 分組函數里可以嵌套嗎
可以 ,但最多隻能兩層。
Oracle分組與組函數
一、求和與求平均
1、什麼是組函數
組函數就是我們前面我說過的多行函數。它主要針對表進行操作。因為只有表中,才有多行數據。下面我們以SUM和AVG這兩個組函數為例,先從它們開始,介紹組函數的特性。 www.2cto.com
2、SUM 求和函數
gyj@OCM> select sum(salary) from t1;
SUM(SALARY)
-----------
315888
ORACLE在執行SUM()函數時,會從SALARY列取出每一行,把結果累加到一起。我們在講單行函數和多行函數時就說過,對於單行函數,將列中每一行數據看作一個個體,單行函數分別對每個個體進行計算。而多行函數則把列中所有行數據看作一個整體,多行函數對這個整體中的所有元素,統一的做求和、求平均、統計最大或最小值等運算,無論此整體中包含多少行,最終返回的結果只有一個。一個總的和或平均值,或最大值,或最小值,等等。單行函數對每一行單獨進行處理,每一行它都返回一個結果。
gyj@OCM> select id,sum(salary) from t1;
select id,sum(salary) from t1
*
ERROR at line 1:
ORA-00937: not a single-group group function
www.2cto.com
這是很容易理解的,id(編號)列有10行數據,而SUM(salary)只有一行結果。一個10行,一個只有一行,Oracle沒辦法將這兩個列組合在一起。列可以和單行函數組合使用,因為單行函數每一行都返回一個結果,列中有10行,就返回10個結果。如:
gyj@OCM> select id,round(salary,1) from t1;
ID ROUND(SALARY,1)
---------- ---------------
2 8000
3 10000
4 15000
5 0
7 12000
6 12000
1 12000
3、WHERE 條件 與組合函數
在沒有條件時,組合函數默認對列中所有行數據進行處理。我們可以使用條件,限制求和的行數。比如,我現在只想求一下姓名都為Joe的月薪的總和。
gyj@OCM> select sum(salary) from t1 where name='Joe';
SUM(SALARY)
-----------
22000
4、VAG求平均值
AVG和SUM的用法完全相同,它是在SUM求後和,再除以行數,就得到一個平均值。例如:
gyj@OCM> select avg(salary) from t1;
AVG(SALARY)
-----------
17549.3333
5、DISTINCT
DISTINCT的俢作用是去除重復值,這我們在上一課有過描述。它也可以用在組函數中,下面我們看看效果:
gyj@OCM> select sum(distinct salary) from t1;
SUM(DISTINCTSALARY)
-------------------
162888
6、NULL值的影響
首先,對於SUM()函數來說,多了個NULL值不會有任何的影響。SUM()函數僅僅是忽略NULL值。
gyj@OCM> insert into t1 values(26,'rose',null,null);
1 row created.
gyj@OCM> commit;
Commit complete.
gyj@OCM> select sum(salary) from t1;
SUM(SALARY)
-----------
315888
結果仍是315888。剛才沒有添加NULL值前,求和的結果也是315888。
對來求平均函數來說,它是先求和,再除以行數。那麼,NULL值應不應該被計算進行數內呢。也就是說,現在salary列中有22行,其中有4行為NULL。求和的結果是315888,那麼,在求平均時,是用總和數315888除以22呢,還是應該除以18。在默認情況下,是除以18。也就是說,ORACLE的組函數中,對於NULL值通常採取的都是不理不採,直接跳過,忽略它。我們來看一下求平均的結果:
gyj@OCM> select avg(salary) from t1;
AVG(SALARY)
-----------
17549.3333
再來看看這個結果是不是315888除以18:
gyj@OCM> select 315888/18 from al;
315888/18
----------
17549.3333
的確,是315888除以18。空值被簡單的忽略了,就好像從來沒有它
但有時我們不能簡單的忽略空。空值也是一行數據。它可能剛剛加入,還沒有產生業績等數據,但它也是一行數據。有時不能把他從行中剔除。這個時候,NVL()函數就派上用場了。先用NVL()函數,把空值轉換為0,再進行組函數的計算,空值就不會被忽略了,使用形式如下:
gyj@OCM> select avg(nvl(salary,0)) from t1;
AVG(NVL(SALARY,0))
------------------
14358.5455
函數的嵌套,我們在前面也說過。也處理里層的函數,將處理結果傳給外層,由外層處理。當遇到空值時,先由NVL將之轉換為0,再由AVG()將0納入到求平均的計算中。空會被AVG忽略,而0是不會被忽略的。
下面再驗證一下:
gyj@OCM> select 315888/22 from al;
315888/22
----------
14358.5455
315888除以22,結果就是14358.5455。空值已經不被忽略了。
二、最大值 MAX 與最小值 MIN
在掌握前面兩個函數的基礎上,這兩個函數的使用就非常簡了。
gyj@OCM> select max(salary),min(salary) from t1;
MAX(SALARY) MIN(SALARY)
----------- -----------
30000 0
SALARY列中的最大值是30000,最小值是0。NULL值不算。組函數都會忽略NULL值。當然,我們可以使用NVL將空值轉換為非空:
gyj@OCM> select max(salary),min(nvl(salary,0)) from t1;
MAX(SALARY) MIN(NVL(SALARY,0))
----------- ------------------
30000 0
三、COUNT 統計函數
統計某列中滿足條件行的數目。比如:
gyj@OCM> select count(salary) from t1 where salary>5000;
COUNT(SALARY)
-------------
17
統計SALARY列大於5000的行的數目。COUNT(salary)括弧中的salary列,可以換為* :
gyj@OCM> select count(*) from t1 where salary>5000;
COUNT(*)
----------
17
換為*後,是統計t1表中,滿足salary>5000這個條件的行的數目。這和COUNT(salary)是差不多的。有一點不同,下面我們把條件去掉:
gyj@OCM> select count(*) from t1;
COUNT(*)
----------
22
這將統計t1表中總共有多少行。*號表示,這個統計,是針對所有列的。而如果將COUNT(*)換為COUNT(salary),如下:
gyj@OCM> select count(salary) from t1;
COUNT(SALARY)
-------------
18
這將只統計SALARY列有多少行數據。和其他函數一樣,COUNT將忽略空值。
在COUNT中,也可以使用DISTINCT去掉重復值,只統計非重復行的數目:
gyj@OCM> select count(distinct salary) from t1;
COUNT(DISTINCTSALARY)
---------------------
11
在salary列,的確只有11種值。當然,空值仍然不被計算在內,但可以使用NVL將空值轉換為0。
四、分組與組函數
1、分組 GROUP BY
分組的語法是:GROUP BY 列名1,列名2,……
分組的作用是根據某些列的值,將這些列值相同的行分為一組。這就是分組。分組和組函數和在一起,可以完成非常強大的功能。組函數從名字上就表現出來了,「組」(重讀)函數嗎,針對分組的函數。下面我們看一下t3測試表:
gyj@OCM> select * from t3;
ID NAME SALARY
---------- ---------- ----------
1 gyj1 5000
1 gyj11 5000
2 gyj2 6000
2 gyj22 6000
3 gyj3 7000
3 gyj33 7000
4 gyj4 8000
4 gyj44 8000
gyj@OCM> select id,sum(salary) from t3 group by id;
ID SUM(SALARY)
---------- -----------
1 10000
2 12000
4 16000
3 14000
先對t3表的id列進行分組,分組後兩個1合並成一個1,兩個2合並成一個2,兩個3合並成一個3,兩個4合並成一個4,所有重復的值都被合並為一個。在分組的同時,使用SUM(SALARY),計算每個小組中薪水的總和。
我們可以在分組時使用所有的組函數,對每一個小組內的數據,分別求和、求平均、最大值、最小值,和統計行數:
gyj@OCM> select id,sum(salary),avg(salary),max(salary),min(salary),count(*) from t3 group by id;
ID SUM(SALARY) AVG(SALARY) MAX(SALARY) MIN(SALARY) COUNT(*)
---------- ----------- ----------- ----------- ----------- ----------
1 10000 5000 5000 5000 2
2 12000 6000 6000 6000 2
4 16000 8000 8000 8000 2
3 14000 7000 7000 7000 2
這個命令中,我使用了我們所講過的每一個組函數。
在分過組後,非分組列是不能直接顯示的,比如:
gyj@OCM> select id,salary from t3 group by id;
select id,salary from t3 group by id
*
ERROR at line 1:
ORA-00979: not a GROUP BY expression
分組後ID被合並成四行,行值分別是1、2、3、4,而SALARY列仍有8行值。這樣的話,ORACLE沒辦法把這兩個列組合到一起。因此,就報出了錯誤。
通常在分組後,在SELECT 和 FROME之間的列名表中,只能出現分組列。要想出現其他列,必須用組函數把列中的行值處理一下,就像上面的例子,SALARY有8行,必須使用組函數,將8行也處理為4行。
gyj@OCM> select id,salary from t3 group by id,salary;
ID SALARY
---------- ----------
1 5000
2 6000
3 7000
4 8000
2、在Group by中使用函數
gyj@OCM> select name from t3 group by substr(name,1,4);
select name from t3 group by substr(name,1,4)
*
ERROR at line 1:
ORA-00979: not a GROUP BY expression
這個命令報出了錯誤,但是ORACLE已經指出了,錯誤不在我們的分組子句中,分組子句是對的,分組中可以使用函數。將NAME的前4個字元截取出來,根據這4個字元進行分組,Oracle可以實現這樣的功能。錯在SELECT 後的列名表NAME上,分組後只剩4個值,而NAME卻有8個值。正確的形式是:
gyj@OCM> select substr(name,1,4),count(*) from t3 group by substr(name,1,4);
SUBSTR(N COUNT(*)
-------- ----------
gyj4 2
gyj2 2
gyj1 2
gyj3 2
我同時用COUNT(*)計算一下分組後,每個小組中的行數。
SELECT後的列名表,除了組函數,其他內容必須和GROUP BY的分組表達式一樣!!!
3、條件
有兩種方法限制分組的行,一是在分組前,使用WHERE,過濾掉不滿足條件的行,只對滿足條件的行分組。二是,在分組後使用HAVING,只顯示滿足條件的分組結果。
先說WHERE。
(1)WHERE 條件
我想對薪水大於5000的員工以ID進行分組
gyj@OCM> select id,count(*) from t3 where salary>5000 group by id;
ID COUNT(*)
---------- ----------
2 2
4 2
3 2
和普通的分組沒什麼兩樣,只是在GROUP BY前加了個條件而已。
注意,WHERE中條件的判斷,優先於分組的執行。先判斷條件,對滿足條件的行分組。
(2)HAVING 條件
HAVING是在分組後,只顯示滿足條件的行。
接著前面的例子,比如說,在分組後,只查id大於的信息:
gyj@OCM> select id,count(*) from t3 where salary>5000 group by id having id>2;
ID COUNT(*)
---------- ----------
4 2
3 2
HAVING後的條件不能挪到WHERE中,因為在執行到WHERE時,ORACLE還沒有開始分組,此時執行組函數SUM,將會報錯。
而HAVING的使用,也有限制,HAVING是在分組後執行。分組後,原表中的列除分組列外,都將不能直接使用。
gyj@OCM> select id,count(*) from t3 group by id having salary>5000;
select id,count(*) from t3 group by id having salary>5000
*
ERROR at line 1:
ORA-00979: not a GROUP BY expression
我將上面WHERE後的條件salary>5000,挪到了HAVING之後,報出了錯誤。在HAVING後,和SEELCT … FROM這間的列一樣,只能有分組列,和經過組函數處理過的其他列。
4、GROUP BY中不能使用別名
gyj@OCM> select id,count(*) from t3 where salary>5000 group by 1;
select id,count(*) from t3 where salary>5000 group by 1
*
ERROR at line 1:
ORA-00979: not a GROUP BY expression
id在第一列,用id分組,在group by中我用1表示用第一列id分組,不能用這種方式和order by不一樣!!!
gyj@OCM> select id bh,count(*) from t3 where salary>5000 group by bh;
select id bh,count(*) from t3 where salary>5000 group by bh
*
ERROR at line 1:
ORA-00904: "BH": invalid identifier
我把ID列設為別名為bh,然後用bh分組報錯
gyj@OCM> select id bh,count(*) from t3 where salary>5000 group by id;
BH COUNT(*)
---------- ----------
2 2
4 2
3 2
我把ID列設為別名為bh,然後用id分組沒問題,這個地方要注意!
五、組函數的嵌套
單行函數和和組函數可以嵌套使用,組函數和組函數也可以嵌套使用。例如:
gyj@OCM> select sum(salary) from t3 group by id;
SUM(SALARY)
-----------
10000
12000
16000
14000
我根據id對表分組,並計算出每一組的總薪水。現在我想在此基礎上,求出哪一組的總薪水最高:
gyj@OCM> select max(sum(salary)) from t3 group by id;
MAX(SUM(SALARY))
----------------
16000
這就是組函數的嵌套使用。ORACLE中規定,組函數嵌套只能嵌兩層。其實多層嵌套並沒有實際的用途,因此ORACLE沒有提供組函數的多層嵌套。但是,單行函數是可以多層嵌套的。
8. oracle 查詢一個小組下的人都滿足一個條件時返回一個值
select 欄位名
from 表名
where not exists
(select 欄位名
from 表名
where 欄位 = 未完成任務的狀態
)
最裡面的括弧查詢的是 未完成狀態的小組
然後嵌套進去 前面有個 not exists 代表不包括
就是查詢不包括未完成狀態的小組 那就是查詢 完成狀態的小組