資料庫rowid
① 教你刪除Oracle資料庫中重復沒用的數據
在對資料庫進行操作過程中我們可能會碰到這種情況 表中的數據可能重復出現 使我們對資料庫的操作過程中帶來很多的不便 那麼怎麼刪除這些重復沒有用的數據呢?
重復數據刪除技術可以提供更大的備份容量 實現更長時間的數據保留 還能實現備份數據的持續驗證 進步數據恢復服務水平 方便實現數據容災等 重復的數據可能有這樣兩種情況 第一種時表中只有某些欄位一樣 第二種是兩行記錄完全一樣 Oracle資料庫重復數據刪除技術有如下優勢 更大的備份容量 數據能得到持續驗證 有更高的數據恢復服務水平 方便實現備份數據的容災
一 刪除部分欄位重復數據
先來談談如何查詢重復的數據吧
下面語句可以查詢出那些數據是重復的
select 欄位 欄位 count(*) from 表名 group by 欄位 欄位 having count(*) >
將上面的>號改為=號就可以查詢出沒有重復的數據了
想要刪除這些重復的數據 可以使用下面語句進行刪除
delete from 表名 a where 欄位 欄位 in
(select 欄位 欄位 count(*) from 表名 group by 欄位 欄位 having count(*) > )
上面的語句非常簡單 就是將查詢到的數據刪除掉 不過這種刪除執行的效率非常低 對於大數據量來說 可能會將資料庫弔死 所以我建議先將查詢到的重復的數據插入到一個暫時表中 然後對進行刪除 這樣 執行刪除的時候就不用再進行一次查詢了 如下
create TABLE 暫時表 AS
(select 欄位 欄位 count(*) from 表名 group by 欄位 欄位 having count(*) > )
上面這句話就是建立了暫時表 並將查詢到的數據插入其中
下面就可以進行這樣的刪除操作了
delete from 表名 a where 欄位 欄位 in (select 欄位 欄位 from 暫時表);
這種先建暫時表再進行刪除的操作要比直接用一條語句進行刪除要高效得多
這個時候 大家可能會跳出來說 什麼?你叫我們執行這種語句 那不是把所有重復的全都刪除嗎?而我們想保留重復數據中最新的一條記錄啊!大家不要急 下面我就講一下如何進行這種操作
在oracle中 有個隱藏了自動rowid 裡面給每條記錄一個唯一的rowid 我們假如想保留最新的一條記錄
我們就可以利用這個欄位 保留重復數據中rowid最大的一條記錄就可以了
下面是查詢重復數據的一個例子
以下是引用片段 selecta rowid a *from表名awherea rowid!=(selectmax(b rowid)from表名bwherea 欄位 =b 欄位 anda 欄位 =b 欄位 )
下面我就來講解一下 上面括弧中的語句是查詢出重復數據中rowid最大的一條記錄
而外面就是查詢出除了rowid最大之外的其他重復的數據了
由此 我們要刪除重復數據 只保留最新的一條數據 就可以這樣寫了
deletefrom表名awherea rowid!=(selectmax(b rowid)from表名bwherea 欄位 =b 欄位 anda 欄位 =b 欄位 )
隨便說一下 上面語句的執行效率是很低的 可以考慮建立暫時表 講需要判定重復的欄位 rowid插入暫時表中 然後刪除的時候在進行比較
createtable暫時表asselecta 欄位 a 欄位 MAX(a ROWID)dataidfrom正式表aGROUPBYa 欄位 a 欄位 ;deletefrom表名awherea rowid!=(selectb dataidfrom暫時表bwherea 欄位 =b 欄位 anda 欄位 =b 欄位 );mit;
二 完全刪除重復記錄
對於表中兩行記錄完全一樣的情況 可以用下面語句獲取到去掉重復數據後的記錄
select distinct * from 表名
可以將查詢的記錄放到暫時表中 然後再將原來的表記錄刪除 最初將暫時表的數據導回原來的表中 如下
createTABLE暫時表AS(selectdistinct*from表名);truncatetable正式表; 注 原先由於筆誤寫成了droptable正式表; 現在已經改正過來insertinto正式表(select*from暫時表);droptable暫時表;
假如想刪除一個表的重復數據 可以先建一個暫時表 將去掉重復數據後的數據導入到暫時表 然後在從暫時表將數據導入正式表中 如下
insertINTOt_table_bakselectdistinct*fromt_table;
三 怎樣快速刪除oracle資料庫
最快的方法就進入注冊表 在運行 里輸入regedit
依次展開HKEY_LOCAL_MACHINE SOFARE
找到ORACLE節點 刪除
然後刪除ORACLE數據文件 安裝的時候選的路徑
lishixin/Article/program/Oracle/201311/18677
② 在ORACLE資料庫中什麼叫偽列
偽列的數據是由ORACLE進行維護和管理的,用戶不能對這個列修改,只能查看。
所有的偽列要得到值必須要顯式的指定。
最常用的兩個偽列:rownum和rowid。
1、
ROWNUM(迅模行號):是在查詢操作時由畝碼緩ORACLE為每一行記錄自動生成的一個編號。
每一次查詢ROWNUM都會重新生成。(查詢的結果中Oracle給你增加的一個編號,根據結果來重新生成)
rownum永遠按照默認的順序生成。(不受order by的影響)
rownum只能使用 <、 <= ,不能使用 > 、>= 符號,原因是:Oracle是基於行的資料庫,行號永遠是從1開始,即必須有第一行,才有第二行。
2、
ROWID(記錄編號):是表的偽列,是用來唯一標識表中的一條記錄,並且間接給出了錶行的物理位置,定位錶行最快的方式。
主鍵:標識唯一的一條業務數據的標識。主鍵是模好給業務給用戶用的。不是給資料庫用的。
記錄編號rowid:標識唯一的一條數據的。主要是給資料庫用的。類似UUID。
③ Oracle索引的索引的分類
在關系資料庫中,每一行都由一個行唯一標識RowID。RowID包括該行所在的文件、在文件中的塊數和塊中的行號。索引中包含一個索引條目,每一個索引條目都有一個鍵值和一個RowID,其中鍵值可以是一列或者多列的組合。(一)索引按存儲方法分類,可以分為2類:B*樹索引和點陣圖索引。(1)B*樹索引的存儲結構類似書的索引結構,有分支和葉兩種類型的存儲數據塊,分支塊相當於書的大目錄,葉塊相當於索引到的具體的書頁。Oracle用B*樹機制存儲索引條目,以保證用最短路徑訪問鍵值。默認情況下大多使用B*樹索引,該索引就是通常所見的唯一索引、逆序索引。(2)點陣圖索引存儲主要用於節省空間,減少oracle對數據塊的訪問。它採用點陣圖偏移方式來與表的行ID號對應,採用點陣圖索引一般是重復值太多的表欄位。點陣圖索引之所以在實際密集型OLTP(聯機事物處理)中用的比較少,是因為OLTP會對表進行大量的刪除、修改、新建操作。Oracle每次進行操作都會對要操作的數據塊加鎖。以防止多人操作容易產生的資料庫鎖等待甚至死鎖現象。在OLAP(聯機分析處理)中應用點陣圖有優勢,因為OLAP中大部分是對資料庫的查詢操作,而且一般採用數據倉庫技術,所以大量數據採用點陣圖索引節省空間比較明顯。當創建表的命令中包含有唯一性關鍵字時,不能創建點陣圖索引,創建全局分區索引時也不能用點陣圖索引。(二)索引按功能和索引對象分還有以下類型。(1)唯一索引意味著不會有兩行記錄相同的索引鍵值。唯一索引表中的記錄沒有RowID,不能再對其建立其他索引。在oracle10g中,要建立唯一索引,必須在表中設置主關鍵字,建立了唯一索引的表只按照該唯一索引結構排序。(2)非唯一索引不對索引列的值進行唯一性限制。(3)分區索引是指索引可以分散地存在於多個不同的表空間中,其優點是可以提高數據查詢的效率。(4)未排序索引也稱為正向索引。Oracle10g資料庫中的行是按升序排序的,創建索引時不必指定對其排序而使用默認的順序。(5)逆序索引也稱反向索引。該索引同樣保持列按順序排列,但是顛倒已索引的每列的位元組。(6)基於函數的索引是指索引中的一列或者多列是一個函數或者表達式,索引根據函數或表達式計算索引列的值。可以將基於函數的索引建立創建成點陣圖索引。另外,按照索引所包含的列數可以把索引分為單列索引和復合索引。索引列只有一列的索引為單列索引,對多列同時索引稱為復合索引。
④ 資料庫中的十種數據類型都是什麼
Character 數據類型
Character 數據類型用來存儲字母數字型數據。當你在oracle 中定義一個character 數據時,通常需要制定欄位的長度,它是該欄位的最大長度。ORACLE提供以下幾種character 數據類型:
CHAR() CHAR數據類型是一種有固定長度和最大長度的字元串。存儲在數據類型為CHAR欄位中的數據將以空格的形式補到最大長度。長度定義在1——2000位元組之間。
當你創建一個CHAR型欄位,資料庫將保證在這個欄位中的所有數據是定義長度,如果某個數據比定義長度短,那麼將用空格在數據的右邊補到定義長度。如果長度大於定義長度將會觸發錯誤信息。
VARCHAR() varchar型數據是varchar2型數據的快照。
VARCHAR2() varchar2數據類型是一種可變長度的、有最大長度的字母數字型數據。Varchar2類型的欄位長度可以達到4000位元組,Varchar2類型的變數長度可以達到32676位元組。
一個空的varchar2(2000)欄位和一個空的varchar2(2)欄位所佔用的空間是一樣的。
NCHAR() 和 NVARCHAR2() NCHAR() 和 NVARCHAR2()數據類型分別與CHAR() 和 VARCHAR2()類型是相同的,只不過它們用來存儲NLS(National Language Support)數據。
LONG LONG 數據類型是一個遺留下來的而且在將來不會被支持的數據類型。它將被LOB(Large Object)數據類型所代替。
比較規則 Varchar2和char數據類型根據尾部的空格有不同的比較規則。對Char型數據,尾部的空格將被忽略掉,對於Varchar2型數據尾部帶空格的數據排序比沒有空格的要大些。比如:
Char 型數據: 『YO』=『YO 』
Varchar2型數據: 『YO』<』YO 』
Numberic 數據類型
Numberic 數據類型用來存儲負的和正的整數、分數和浮點型數據,范圍在-1*10-103 和9.999…99*10125之間,有38位的精確度。標識一個數據超出這個范圍時就會出錯。
Number(
,) Number數據類型存儲一個有p位精確度的s位等級的數據。
DATE 數據類型
DATE 數據類型用來存儲日期和時間格式的數據。這種格式可以轉換為其他格式的數據去瀏覽,而且它有專門的函數和屬性用來控制和計算。以下的幾種信息都包含在DATE數據類型中:
Century
Year
Month
Day
Hour
Minute
Second
LOB 數據類型
LOB(Large Object) 數據類型存儲非結構化數據,比如二進制文件,圖形文件,或其他外部文件。LOB 可以存儲到4G位元組大小。數據可以存儲到資料庫中也可以存儲到外部數據文件中。LOB數據的控制通過DBMS_LOB 包實現。BLOB, NCLOB, 和CLOB 數據可以存儲到不同的表空間中,BFILE存儲在伺服器上的外部文件中。LOB數據類型有以下幾種:
BLOB: 二進制數據
CLOB: 字元型數據
BFILE: 二進制文件
其他數據類型
ROWID ROWID 數據類型是ORACLE數據表中的一個偽列,它是數據表中每行數據內在的唯一的標識。
⑤ Oracle資料庫中什麼欄位類型能保存'0'字元
目前Oracle 資料庫大概有26個欄位類型,大體分為六類,分別是字元串類型、數字數據類型、日期時間數據類型、大型對象(LOB)數據類型、RAW和LONG RAW數據類型、ROWID和UROWID數據類型。當然Oracle還提供用戶自定義的數據類型,但在我這篇不做討論。
字元串類型
Char
char數據類型存儲固定長度的字元值。一個CHAR數據類型可以包括1到2000個字元。如果對CHAR沒有明確地說明長度,它的默認長度則設置為1。 如果對某個CHAR類型變數賦值,其長度小於規定的長度,那麼Oracle自動用空格填充。
注意:如果給了一個比固定長度更長的值,其尾部帶有空格,則空格會被刪除到固定的長度。如果值太大Oracle會返回一個錯誤,
Varchar
用於保存變長的字元串數據。其中最大位元組長度由(size)指定。每行長度可變,最大長度為每行4000位元組。設置長度(size)前需考慮字元集為單位元組或多位元組。
注意:varchar是被廢棄的類型,oracle目前都推薦使用varchar2。雖然varchar也可以用,但不確保未來的版本是否還支持
Varchar2
用於保存變長的字元串數據。其中最大位元組長度由(size)指定。每行長度可變,最大長度為每行4000位元組。設置長度(size)前需考慮字元集為單位元組或多位元組。由於VARCHAR2數據類型只存儲為該列所賦的字元(不加空格),所以VARCHAR2需要的存儲空間比CHAR數據類型要小。
區別:varchar2把所有字元都占兩位元組處理(一般情況下),varchar只對漢字和全形等字元占兩位元組,數字,英文字元等都是一個位元組;VARCHAR2把空串等同於null處理,而varchar仍按照空串處理;大部分情況下建議使用varchar2類型,可以保證更好的兼容性。
Nchar
Unicode數據類型,根據字元集而定的固定長度字元串,最大長度2000bytes。
Nvarchar2
Unicode數據類型,根據字元集而定的可變長度字元串,最大長度4000bytes。
Long
可變長字元列,最大長度限制為2GB,用於不需要作字元串搜索的長串數據。
說明:此類型是一個遺留下來的而且將來不會被支持的數據類型,逐漸被BLOB,CLOB,NCLOB等大的數據類型所取代。
數字類型
Number
NUMBER數據類型精度可以高達38位,它有兩個限定符,如:column NUMBER(precision,scale)。precision表示數字中的有效位。如果沒有指定precision的話,Oracle將使用38 作為精度。scale表示小數點右邊的位數,scale默認設置為0。如果把scale設成負數,Oracle將把該數字取捨到小數點左邊的指定位數。
Decimal
Oracle只是在語法上支持decimal類型,但是在底層實際上它就是number類型,支持decimal類型是為了能把數據從Oracle資料庫移到其他資料庫中。
Float
FLOAT類型也是NUMBER的子類型。其格式Float(n),數 n 指示位的精度,可以存儲的值的數目。N 值的范圍可以從1 到 126。若要從二進制轉換為十進制的精度,請將n 乘以 0.30103。要從十進制轉換為二進制的精度,請用 3.32193乘小數精度。126 位二進制精度的最大值是大約相當於 38 位小數精度。
BINARY_FLOAT
BINARY_FLOAT 是一種 32 位,單精度浮點數字數據類型。每個 BINARY_FLOAT 值需要5 位元組存儲空間,其中 1位元組用於存儲數據值的長度。支持 NUMBER 數據類型所提供的基本功能。但採用二進制精度,而NUMBER 採用十進制精度。因此能夠提供更快的數學運算速度,且能減少佔用的存儲空間。
BINARY_DOUBLE
BINARY_DOUBLE 是一種 64 位,雙精度浮點數字數據類型。每個 BINARY_DOUBLE 值需要9 位元組存儲空間,其中1 位元組用於存儲數據值的長度。支持 NUMBER 數據類型所提供的基本功能。但採用二進制精度,而NUMBER 採用十進制精度。因此能夠提供更快的數學運算速度,且能減少佔用的存儲空間。
日期數據類型
Date
ORACLE最常用的日期類型,它可以保存日期和時間,常用日期處理都可以採用這種類型。DATE表示的日期范圍可以是公元前4712年1月1日至公元9999年12月31日。
date類型在資料庫中的存儲固定為7個位元組, 第1位元組:世紀+100、 第2位元組:年、第3位元組:月、第4位元組:天、第5位元組:小時+1、第6位元組:分+1、第7位元組:秒+1。
Timestamp
ORACLE常用的日期類型,它與date的區別是不僅可以保存日期和時間,還能保存小數秒,小數位數可以指定為0-9,默認為6位,所以最高精度 可以到ns(納秒),資料庫內部用7或者11個位元組存儲,如果精度為0,則用7位元組存儲,與date類型功能相同,如果精度大於0則用11位元組存儲。第1位元組:世紀+100、第2位元組:年、第3位元組:月、第4位元組:天、 第5位元組:小時+1、第6位元組:分+1、第7位元組:秒+1、 第8-11位元組:納秒,採用4個位元組存儲,內部運算類型為整形
註:TIMESTAMP日期類型如果與數值進行加減運算會自動轉換為DATE型,也就是說小數秒會自動去除。
TIMESTAMP WITH TIME ZONE
對TIMESTAMP進行了擴展,用於存儲時區。時間戳以及時區位移值,其中fractional_seconds_precision是數字在第二日期時間欄位的小數部分數字的所有值。可接受的值是0到9。默認是6。默認格式是確定明確的NLS_DATE_FORMAT參數或隱式的NLS_TERRITORY參數。大小固定為13位元組。此數據類型包含日期時間欄位YEAR,MONTH,日,小時,分鍾,秒TIMEZONE_HOUR和TIMEZONE_MINUTE。它有一個明確的分數秒和時區。
TIMESTAMP WITH LOCAL TIME ZONE
所有的TIMESTAMP WITH TIME ZONE值,但下列情況除外:數據標准化資料庫的時區時,存儲在資料庫中。當數據被檢索,用戶可以看到在會話時區中的數據。
默認格式是確定明確的NLS_DATE_FORMAT參數或隱式的NLS_TERRITORY參數。的大小不同的7至11個位元組,取決於精度。
INTERVAL YEAR TO MONTH
存儲期間年數和月的時間,其中year_precision是數字的年份日期時間欄位的數量。可接受的值是0到9。默認是2。大小固定為5個位元組。
INTERVAL DAY TO SECOND
其格式為:INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds)],是存儲一段時間以天,小時,分鍾和秒,其中day_precision是數字在DAY日期時間欄位的最大數量。可接受的值是0到9。默認是2。fractional_seconds_precision是數字中的第二個欄位的小數部分的數量。可接受的值是0到9。默認是6。大小固定為11個位元組。
INTERVAL YEAR TO MONTH
Oracle語法:INTERVAL YEAR [(year_precision )] TO MONTH,用來表示一段時間差, 只精確到年和月. year_precision是數字年的時間段,接受的值為0到9。默認值是2。大小固定為5個位元組。
大型對象(LOB)數據類型
Clob
最大4G,存儲單位元組字元型數據。適用於存儲超長文本。
Nclob
最大4G,存儲多位元組國家字元型數據。適用於存儲超長文本。
Blob
最大4G,存儲二進制數據。適用於存儲圖像、視頻、音頻等。
BFile
最大長度是4GB,在資料庫外部保存的大型二進制對象文件,最大長度是4GB。這種外部的LOB類型,通過資料庫記錄變化情況,但是數據的具體保存是在資料庫外部進行的。 Oracle 可以讀取、查詢BFILE,但是不能寫入,不參與事務。
RAW和LONG RAW數據類型
RAW
raw(n)格式,其中n=1 to 2000,可變長二進制數據,在具體定義欄位的時候必須指明最大長度n,Oracle 用這種格式來保存較小的圖形文件或帶格式的文本文件,如Miceosoft Word文檔。raw是一種較老的數據類型,將來會逐漸被BLOB、CLOB、NCLOB等大的對象數據類型所取代。
LONG RAW
最大長度是2GB。可變長二進制數據,最大長度是2GB。Oracle 用這種格式來保存較大的圖形文件或帶格式的文本文件,如Miceosoft Word文檔,以及音頻、視頻等非文本文件。在同一張表中不能同時有long類型和long raw類型,long raw也是一種較老的數據類型,將來會逐漸被BLOB、CLOB、NCLOB等大的對象數據類型所取代。
ROWID和UROWID數據類型
Rowid
ROWID為該錶行的唯一標識,是一個偽列,可以用在SELECT中,但不可以用INSERT, UPDATE來修改該值。ROWID列,Oracle使用ROWID列來建立內部索引。你可以引用ROWID的值,但ROWID並不存放在資料庫中,你可以創建一個表包含ROWID數據類型。但Oracle不保證該值是合法的rowids。用戶必須確保該rowid值是真實合法的。
Urowid
UROWID支持邏輯和物理的rowids,列UROWID類型可以存儲各種rowids, 從8.1以後的Oracle才有UROWID類型,它也可以用來保存以前的ROWID類型數據信息。
特殊數據類型
Xmltype
XMLType是Oracle從9i開始特有的數據類型,是一個繼承了Blob的強大存在,可以用來存儲xml並提供了相當多的操作函數,用來直接讀取xml文檔和管理節點。理論上可以保存2G大小的數據。作為XML數據的特殊存儲類型。Xmltype提供了適合的保存、檢索和操作的支持。
Xmlindex
XMLIndex 索引可用於 SQL/XML 函數 XMLExists()、XMLTable() 和 XMLQuery(),而且它在查詢的任何部分都有效;它並不限於用在 WHERE 子句中。而您可能用於 XML 數據的其他任何索引都無法做到這一點。
XMLIndex 因此可提高對 SELECT 列表數據和 FROM 列表數據的訪問速度,對 XML 片段提取尤為有用。基於函數的索引和 CTXXPath 索引。您無需預先了解將在查詢中使用的XPath 表達式。XMLIndex 完全是通用的,而基於函數的索引則不同。可將 XMLIndex 索引用於基於 XML 模式或非基於模式的數據。它可用於二進制 XML 和非結構化存儲模型。B 樹索引僅適用於以對象關系方式存儲(結構化存儲)的基於模式的數據;它對於存儲在二進制XML 或CLOB 實例中的基於 XML 模式的數據效率低下。可使用 XMLIndex 索引通過 XPath 表達式進行搜索,這些表達式的目標是集合(即文檔中出現多次的節點)。而函數索引則不然。