Oracle系列第五六章合集 分頁和去重

2021-09-11 04:39:53 字數 3880 閱讀 5548

第五章 分頁和去重

5.1分頁介紹

為什麼會用到分頁呢,因為列表內容太多了,所以使用分頁進行顯示。資料過多單頁面無法顯示所有內容,則每一次只顯示一部分的資料。

分頁,是一種將所有資料分段展示給使用者的技術。使用者每次看到的不是全部資料,而是其中的一部分,如果在其中沒有找到自習自己想要的內容,使用者可以通過制定頁碼或是翻頁的方式轉換可見內容,直到找到自己想要的內容為止。其實這和我們閱讀書籍很類似。

實現分頁的解決方案有兩種:

(1)一次查詢出資料庫中的所有記錄,然後在每頁中顯示指定的記錄。

(2)對資料庫進行多次查詢,每次只獲得本頁的資料並顯示

如今**建設中的資料都是海量的,若按方案1執行:無疑會加大伺服器記憶體的負載,降低系統執行速度;若使用方案2執行,則可能回頻繁運算元據庫,也會影響響應效率;因而大家都會使用方案1+方案2來實現。

分頁的核心就是計算每頁多少記錄和總頁數以及第幾頁。每一頁的資料則只需計算起始的記錄和結束記錄即可。

5.1.1 rownum

rownum不是乙個真實存在的列,它是用於從查詢返回的行的編號,返回的第一行分配的是1,第二行是2,依此類推,這個偽欄位可以用於限制查詢返回的總行數。

由於rownum總是結果集的編號,所以無法直接查詢rownum>1的任何記錄,因為總是從1開始的嘛。

5.1.2 oracle 分頁實現

雖然ronum不能直接查詢大於1的記錄,但是我們可以自己新增偽列,將查詢的結果集中的rownum作為查詢的**,則此時**中的rownum變成了普通字段,再通過這個rownum來進行某段記錄的選取即可。

5.2 去除重覆記錄

5.2.1 rowid介紹

rowid是oracle中的乙個重要的概念。用於定位資料庫中一條記錄的乙個相對唯一位址值。通常情況下,該值在該行資料插入到資料庫表時即被確定且唯一。rowid它是乙個偽列,它並不實際存在於表中。它是oracle在讀取表中資料行時,根據每一行資料的實體地址資訊編碼而成的乙個偽列。所以根據一行資料的rowid能找到一行資料的實體地址資訊。從而快速地定位到資料行。資料庫的大多數操作都是通過rowid來完成的,而且使用rowid來進行單記錄定位速度是最快的。

有時繁雜的資料檢索時,普通檢索條件不能達到要求,可以利用rowid來精確檢索的結果 

oracle中如果要查詢某張表中多個字段,又只對某個欄位去重的時候用distinct或者group by都不行。distinct和group by會對要查詢的字段一起進行去重,也就是當查詢的所有欄位都相同,oracle才認為是重複的。這時用rowid是個不錯的選擇。

5.2.2 重覆記錄的查詢

題目場景:當我們表裡面出現了許多重覆記錄時,我們需要將重複的記錄找出來

實現步驟:

1、按照重複內容分組 

2、取出每一組中的一條並記錄保留(注意具有唯一性)

3、刪除未在保留範圍的資料

第六章 表連線

6.1 表連線介紹

當我們獲取的資料不是來自於同一張表而是來自於多張表時就需要使用到表連線。表連線就是乙個表的行根據指定的條件跟另乙個表的行連線起來形成新的行的過程。

簡單來講,我們將資料存在不同的表中,而不同的表有著它們自身的表結構,不同表之間可以是有關聯的,大部分實際使用中,不會僅僅只需要一張表的資訊,比如需要從乙個班級表中找出北京地區的學生,再用這個資訊去檢索成績表中他們的數學成績,如果沒有多表連線,那只能手動將第乙個表的資訊查詢出來作為第二個表的檢索資訊去查詢最終的結果,可想而知這將會是多麼繁瑣。

連線查詢:

1) 即查詢的時候同時需要多張表(特別是存在外來鍵關係的),此時需要多張表之間的值進行連線;

2) 目前sql標準提出過兩種連線查詢,第一種是較早的sql92標準,第二種是目前使用廣泛的較新的sql99標準;

3) 92形式簡單,但編寫較為冗長,99不僅在底層得到優化,而且形式看上去更加一目了然,邏輯性更強,一般建議使用99標準;

6.2 92語法

多張表需要全部放在from之後,所有的連線條件都放在where當中,因此sql92中的等值連線、非等值鏈結、外連線等等其實只是where條件的篩選

結構:select ... from table1, table2 ,table3 ... where...

很多時候需要為表取別名(1、簡化表名 2、可能存在自連線的情況)

連線的原理:按照from後面表的出現順序,前面的表作為記憶體的for迴圈,後出現的表作為外層的for迴圈

6.2.1 笛卡爾積

通過線性代數的人都知道,笛卡爾乘積通俗的說,就是兩個集合中的每乙個成員,都與對方集合中的任意乙個成員有關聯。

例如有個考勤記錄表,記錄著100個人的2023年4月的考勤資訊,理論上這些人應該每天都有記錄的。 但是實際上某些人在某些天上面的資料,缺少了。 一天一天的查詢,還是乙個人乙個人的查詢,都有些麻煩。 這種情況下,可以針對 每個人 與 每一天 做乙個 笛卡爾積 的處理。 然後與實際的表去關聯。就很容易查詢出結果了。

select ... from t1,t2

6.2.2 等值連線

在笛卡爾積的基礎上取條件列相同的值

查詢員工資訊和部門資訊

查詢員工姓名,部門名稱

6.2.3 非等值連線

!=、>、<、<>、between and

查詢員工姓名,工資及等級

6.2.4 自連線

特殊的等值連線(來自於同一張表)

找出存在上級的員工姓名

6.2.5 外連線

內聯接使用比較運算子根據每個表共有的列的值匹配兩個表中的行。

外聯接可以是左向外聯接、右向外聯接或完整外部聯接。

左向外聯接的結果集包括 left outer子句中指定的左表的所有行,而不僅僅是聯接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值。 

右向外聯接是左向外聯接的反向聯接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。

看『+』,帶『+』的表為從表,對立面的表為主表。

找出所有員工的姓名 以及他上級的名稱

找出所有上級的名稱以及其手下員工的名稱

找出所有部門的員工數 及部門名稱

找出所有有員工的部門名稱及員工數

6.3 99語法

6.3.1 cross join

交叉連線,實現笛卡爾積

6.3.2 natural join

需要有(同名列、主外建)

自然連線,做等值連線

查詢所有員工姓名及所在部門的名稱

6.3.3 join using (同名列)

using 連線 ,等值連線

查詢所有員工姓名及所在部門的名稱

6.3.4 join on

on 連線,可做等值連線、非等值連線、自連線,可以解決一切連線,關係列必須要區分

查詢所有員工姓名及所在部門的名稱

查詢所有員工的姓名,工資以及工資等級

6.3.5 outer join

外連線,有主表和從表一說

left [outer] join on

left [outer] join using

right [outer] join on

right [outer] join using

6.3.6 full join on| using

全連線,滿足則直接匹配,不滿足的相互補充null,確保所有的表記錄都至少出現一次。

6.4 集合操作

union、union all、intersect、minus 

union,並集(去重) 對兩個結果集進行並集操作,不包括重複行同時進行預設規則的排序;

union all,全集(不去重) 對兩個結果集進行並集操作,包括重複行,不進行排序 ;

intersect,交集(找出重複) 對兩個結果集進行交集操作,不包括重複行,同時進行預設規則的排序;

minus,差集(減去重複) 對兩個結果集進行差操作,不包括重複行,同時進行預設規則的排序

分頁和去重

軟體project 之第五 六章總結

軟體project的前幾章各自是軟體計畫 需求分析 軟體設計。整體的都規劃好了以後,就該著手去實踐了。所謂的理論體系足夠強大了以後,實踐就顯得尤為輕鬆。我們設計軟體,實踐當然就是用我已經計畫好的語言去編寫我們須要做的軟體,那麼,這個過程就叫做 程式編寫 總結下來就是首先我們編敲 之前要有一些主要的東...

作業系統第五 六章作業

補充題1 int put 10 orange 0 father 父親程序 while 1 daughter 女兒程序 while 1 son 兒子程序 while 1 補充題2 需要設定進出門程序,學生是否到齊程序,是否開始考試程序,考試結束程序 semaphore s door 能否進出門,初值1...

軟體工程 之第五 六章總結

軟體工程的前幾章分別是軟體計畫 需求分析 軟體設計。總體的都規劃好了以後,就該著手去實踐了。所謂的理論體系足夠強大了以後,實踐就顯得尤為輕鬆。我們設計軟體,實踐當然就是用我已經計畫好的語言去編寫我們需要做的軟體,那麼,這個過程就叫做 程式編寫 總結導圖 第六章概要 程式設計完成之後,我們的程式是不是...