Oracle中的rownum和rowid

来源:https://www.cnblogs.com/hellohowlow/archive/2018/01/14/8283151.html
-Advertisement-
Play Games

--註意:rownum和rowid只有Oracle有,其它資料庫是不支持的 select * from scott.dept;--查詢的結果稱為'結果集' --rownum 偽列 '結果集'中產生的序列--在下麵的結果集中deptno為20的rownum為2select rownum,deptno, ...


--註意:rownum和rowid只有Oracle有,其它資料庫是不支持的

select * from scott.dept;
--查詢的結果稱為'結果集'

--rownum 偽列 '結果集'中產生的序列
--在下麵的結果集中deptno為20的rownum為2
select rownum,deptno,dname,loc from scott.dept;

--在下麵的結果集中deptno為20,30的rownum分別為1,2
select rownum,deptno,dname,loc from scott.dept where deptno in(20,30);
--rownum=1 1條數據
select rownum,deptno,dname,loc from scott.dept where rownum = 1;
--rownum=2 0條數據
select rownum,deptno,dname,loc from scott.dept where rownum = 2;
--rownum<3 2條數據
select rownum,deptno,dname,loc from scott.dept where rownum < 3;
--rownum>0 4條數據
select rownum,deptno,dname,loc from scott.dept where rownum > 0;
--rownum>1 正常理解是3條數據,但是結果沒有
--沒有第一條偽列,就沒有後面的偽列,偽列是從1開始遞增有順序的
select rownum,deptno,dname,loc from scott.dept where rownum > 1;

/*
行的標識稱為欄位
列的標識稱為欄位名

Oracle對rownum的處理,
rownum是在得到結果集的時候產生的,用於標記結果集中結果順序的一個欄位,
這個欄位被稱為“偽數列”,也就是事實上不存在的一個數列。
它的特點是按“順序標記”,而且是“逐次遞增”的,
換句話說就是只有存在rownum=1的記錄,才可能存在rownum=2的記錄。

假設我們的查詢條件偽rownum=2,那麼在查詢出的第一條記錄的時候,
oracle標記此條記錄rownum為1,結果發現和rownum=2的條件不符,於是結果集為空。
*/

--在Oracle中,利用rownum分頁,mysql:limit,sql:server top
select empno,ename from scott.emp;

--查詢emp中第6-10條
--in結果集在6,10
select rownum,empno,ename from scott.emp where rownum in (6,10);
--between 結果集在6,7,8,9,10(oracle)
--沒有1,不能查詢結果
select rownum,empno,ename from scott.emp where rownum between 6 and 10;
--有1,能查到結果
select rownum,empno,ename from scott.emp where rownum between 1 and 10;

--當前頁面數 1 每頁顯示數 5
--利用子查詢
--between
select * from(
select rownum as tempid,empno,ename
from scott.emp
)t1
where t1.tempid between 6 and 10;

--in
select * from(
select rownum as tempid,empno,ename
from scott.emp
)t1
where t1.tempid in (6,10);

--練習:提取scott.dept中第3條-第4條記錄
select * from(
select rownum as tempid,empno,ename
from scott.emp
)t1
where t1.tempid between 3 and 4;

/*
oracle還提供了另外一個數列:rowid
rowid和rownum不同,一般說來每一行數據對應一個rowid,而且是固定而且唯一的.
在這一行數據存入資料庫的時候就確定了。可以理解成java對象中的記憶體地址.
可以利用rowid來查詢記錄,而且通過rowid查詢記錄是查詢速度最快的查詢方法.
(有誰能記住18位長度的rowid字元?)
rowid只有在表發生移動(比如表空間變化,數據導入/導出以後),才會發生變化。
*/
--查詢dept表的rowid
select rowid,deptno,dname,loc from scott.dept;
--查詢rowid=AAAMgxAAEAAAAAQAAA的行數據
select * from scott.dept where rowid = 'AAAMgxAAEAAAAAQAAA';

--面試題

--刪除重覆數據
select * from tb_test;

create table tb_test(
name varchar(18),
age number
);
insert into tb_test(name,age)values('tom',22);
insert into tb_test(name,age)values('jack',21);
insert into tb_test(name,age)values('tom',22);
insert into tb_test(name,age)values('alice',22);
insert into tb_test(name,age)values('tom',22);
insert into tb_test(name,age)values('scott',18);
insert into tb_test(name,age)values('scott',18);

--使用DISTINCT 過濾重覆的欄位
SELECT distinct name from tb_test
/*
重覆數據:tom 22[3] scott 18[2]
1.刪除所有重覆數據
2.刪除重覆數據,但是保留一條(保留最大的rowid或者最小)
*/
--1
DELETE FROM tb_test
--此處WHERE nam IN將會把在子查詢語句中所得到的name都刪除掉
WHERE name IN(
SELECT name
FROM tb_test
GROUP BY name
HAVING COUNT(name)>1
);

--保留一條
--1.通過創建臨時表(ddl語句操作,很快)
--註意:使用distinct這種方式只能適用於重覆數據是所有列
--當欄位比較多(name,age,sex,address,phone...),但是判斷重覆只是name和age欄位,如果是sex呢?就不能使用distinct了
create table tb_tmp as select distinct name,age from tb_test;
--清空表記錄
--截斷
truncate table tb_test;
--將臨時表中的數據插回來
insert into tb_test(name,age) select name,age from tb_tmp;
select * from tb_tmp;

--查看tom的rowid
select rowid,name,age from tb_test where name='tom' and age=22;

--這裡max使用min也可以
--把不在最大唯一rowid的按照name,age分組的數據刪除掉
delete from tb_test where rowid not in(
--查詢唯一rowid
--按照最大的rowid,name,age分組,這樣分組後的數據都具有唯一性,不在分組內的數據都應該被刪除掉
select MAX(rowid) from tb_test group by name,age
);

delete from tb_test where rowid not in
(
select MIN(rowin) from tb_test group by name,age
);


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 查看mysql資料庫federated引擎是否開啟。 show engines; 若沒有開啟federated則在mysql配置文件my.cnf中mysqld中添加federated。 在遠程資料庫中添加遠程訪問資料庫的用戶 創建表 CREATE TABLE `work_step_apply_che ...
  • 前段時間,換了個27寸的4k顯示器。原始解析度下文字太小,眼睛估計得看瞎 放大dpi後,這問題,那問題,好多 百度知道,淘寶,這網頁文字顏色也非常的淺,看著眼睛很累人 看了半天是字體若的禍 暫時發現Arial與Tahoma字體,在dpi放大後,會出現這個問題 折騰了半天,我把微軟雅黑UI的字體改名, ...
  • 系統信息 arch 顯示機器的處理器架構(1) uname -m 顯示機器的處理器架構(2) uname -r 顯示正在使用的內核版本 dmidecode -q 顯示硬體系統部件 - (SMBIOS / DMI) hdparm -i /dev/hda 羅列一個磁碟的架構特性 hdparm -tT / ...
  • zabbix工具監控伺服器是以組的形式來管理,創建單個被監控伺服器之前需要先創建一個主機組,然後將被監控機添加到這個組中即可 1 創建主機群組: 2 向主機群組中添加主機 3 向主機中添加模板,選擇要監控哪些服務等 4 查看監控的內容以及數據成圖 ...
  • 本章目錄 1.1 Shell,Bash介紹 1.2 內部命令與外部命令 1.3 命令別名 1.4 命令歷史 1.5 Bash快捷鍵 1.1 Shell,Bash介紹 ◆Shell:Linux系統的用戶界面,提供了用戶與內核進行交互操作的一種介面。它接收用戶輸入的命令並把它送入內核去執行。 ◆Bash ...
  • 前言: Linux一般將文件可存取的身份分為三個類別,分別是 owner/group/others,根據許可權劃分,每個目錄都可以擁有相對身份的-rwx[可讀可寫可執行] 使用者與群組: Owner :文件擁有者,如jane擁有此文件所屬權,可對該文件進行相應許可權操作。 Group :文件擁有組,如一 ...
  • 概述 由於目前生產環境的mysql資料庫分佈在兩台伺服器,若從單一主從來看,配置很簡單,但是需要將兩台伺服器的資料庫同步到一臺從庫上面,需要進行更多配置和註意事項。多源複製有兩種方案,Binlog+Position和GTID,我們採用的是第一種方案Binlog+Position進行的多源複製。 安裝 ...
  • select * from scott.dept;select * from scott.emp; --dual 是 Oracle提供的一個虛表select length('hello') from dual; --常用函數--lower把大寫轉小寫 upper把小寫轉大寫select * from ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...