Oracle子查詢相關內容(包含TOP-N查詢和分頁查詢)

来源:https://www.cnblogs.com/loveleaf/archive/2018/08/13/9467237.html
-Advertisement-
Play Games

本節介紹Oracle子查詢的相關內容: 實例用到的數據為oracle中scott用戶下的emp員工表,dept部門表,數據如下: 一、子查詢 1、概念:嵌入在一個查詢中的另一個查詢語句,也就是說一個查詢作為另一個查詢的條件,這個查詢稱為子查詢。 那麼可以使用子查詢的位置有select後面、from後 ...


本節介紹Oracle子查詢的相關內容:

實例用到的數據為oracle中scott用戶下的emp員工表,dept部門表,數據如下:

 

 

一、子查詢

1、概念:嵌入在一個查詢中的另一個查詢語句,也就是說一個查詢作為另一個查詢的條件,這個查詢稱為子查詢。

那麼可以使用子查詢的位置有select後面、from後面、where後面以及having後面。

2、分類:(1)單行子查詢:查詢結果只返回一行數據

      (2)多行子查詢:查詢結果返回多行數據,多行子查詢的操作符有IN,ALL,ANY,具體用法實例中說明。

3、示例說明:

 Example1:查找每個部門的員工數量:

select deptno,dname,(select count(*) from emp e where e.deptno=d.deptno) amount from dept d;

此處子查詢位於select後面,是每個部門的員工總人數。

Example2:查找工資大於部門平均工資的員工

select ename,sal,e.deptno from emp e,(select deptno,avg(sal) avgsal from emp group by deptno) m 
where e.deptno=m.deptno and e.sal>m.avgsal;

此處子查詢位於from後面,是每個部門的平均工資,將這個結果看做一張新表m,再加上查詢條件即可。

Example3:查找和scott相同職位的員工信息

select * from emp where job=(select job from emp where ename='SCOTT');

此處子查詢位於where條件中,是和scott員工一樣的職位。

Example4:查詢部門平均工資大於30號部門最高工資的部門信息。

select deptno,avg(sal) from emp group by deptno having avg(sal)>(select max(sal) from emp where deptno=30);

此處子查詢位於having子句中,是30號部門的最高工資。

Example5:查詢部門是開發部或銷售部的員工信息

select * from emp where deptno in(select deptno from dept where dname='RESEARCH' or dname='SALES');

此處用到了多行子查詢的IN操作符用來獲取RESEARCH和SALES部門的部門號,用來限制一個範圍。

Example6:獲取工資大於30號部門所有員工工資的信息。

select ename,sal,deptno from emp where sal>all(select sal from emp where deptno=30);

此處用到了多行子查詢中的ALL操作符,用於獲取30號部門的所有工資信息,這裡all起的主要作用是為了獲得30號部門的最大工資,大於所有的意思就是大於最大的即可。

Example7:獲取工資大於30號部門任意員工工資的信息。

select ename,sal,deptno from emp where sal>any(select sal from emp where deptno=30);

此處用到了多行子查詢中的any操作符,用於獲取30號部門的工資信息,這裡any的作用和all不同,主要取最小工資,任意就是說大於這些工資裡面任意一個也就是大於最小的工資即可。

 二、oracle中TOP-N查詢:

概念:用於獲取一個查詢中的前N條記錄,需要藉助rownum偽列來實現,rownum偽列,oracle為每個查詢自動生成的偽列,物理上並不存在,查詢中經常涉及多個表,但每個查詢只有一列偽列。

Example:查找部門號為20和30的工資最高的5個員工信息

select * from (select * from emp where deptno in(20,30) order by sal desc) where rownum<=5;

這裡在from後加了一個子查詢,那麼有個問題出現了,為什麼這裡不直接寫而是要引入一個子查詢呢,先來看看不加的結果:

select * from emp e where e.deptno in(20,30) and rownum<=5 order by e.sal desc;

很明顯3000才是最高的工資,那是什麼原因導致了這樣的結果呢?是因為oracle中對select查詢語句的執行順序是先where條件後order by排序,也就是說先取了5行在對這5行進行排序,而正確的順序應該是所有20,30部門的員工工資先進行排序在取5行

 三、Oracle分頁查詢的應用:

 概念:分頁查詢,顧名思義,控制查詢結果的範圍,得到我們想要的部分數據。

Example:獲取員工表中20,30部門按工資降序以後的第4頁也就是第7,8兩條數據

select * from (select rownum rowline,emp1.* from (select * from emp where deptno in (20,30) 
order by sal) emp1 where rownum<=10) emp2 where emp2.rowline>=7 and emp2.rowline<=8;

這裡或許稍微有點複雜,首先為什麼不這樣寫

select * from (select * from emp where deptno in(20,30) order by sal desc) where rownum>=7 and rownum<=8;

這個查詢永遠也不會有數據生成,為什麼呢,因為當內層查詢產生第一條記錄時,oracle為其偽列賦值rownum=1,

外層查詢判rownum>=7 and rownum<=8不符合條件去除記錄,當第二條記錄產生時,oracle仍然會為其偽列賦值rownum=1,

外層判斷仍然不會通過,這樣無論內層查詢產生多少數據都會因為外層查詢的條件不符合記錄而流失數據。

 

而想要避免這樣的情況發生,就需要將偽列當成一個查詢中的欄位,將它不在看做“偽列”,而是真正的一個欄位,

這樣就需要在外面在嵌套一層查詢將偽列做成一個物理上存在的欄位,而最後我們只需要將外層查詢的條件改為內層查詢中“真實”存在的偽列即可。

 

 

 

 

子查詢的相關內容總結完畢,有不明處請多多指教。                                                                                           2018-08-13    15:51:41

 


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

-Advertisement-
Play Games
更多相關文章
  • 1、首先新建用戶,adduser命令 sudo adduser hadoop passwd hadoop 輸入密碼之後,一路 y 確定。 2、添加用戶組 在創建hadoop用戶的同時也創建了hadoop用戶組,下麵我們把hadoop用戶加入到hadoop用戶組下麵 sudo usermod -a - ...
  • 為什麼要有索引?就像為什麼書要有目錄一樣。 索引是什麼東西?和目錄一樣成為書的一部分。 索引是由什麼組成的?原文中具有代表性的一部分。 索引有三種添加方式: 1. 在創建表的時候,直接在列名後面添加 或在後面單獨定義 2. 在表外為其創建 3. 外界進行修改時添加 索引有五種分類: 普通索引, 關鍵 ...
  • 占座 ...
  • Oracle Concepts 11gr2是介紹oracle資料庫的基礎概念的入門書籍,學習這些概念方便於學習其他更深層次的知識。 ...
  • 使用SSMS資料庫管理工具修改數據 修改任意一條或者多條都可以 1:打開資料庫,選擇數據表,右鍵點擊-》編輯所有行(如未配置,點擊編輯前200行)。 2、編輯需要修改的數據-》編輯完成後,右鍵點擊空白處-》選擇執行SQL即可編輯成功。 使用T-SQL腳本修改數據 修改單表中一行單列或者多列數據 語法 ...
  • Flume – 初識flume、source和sink 目錄基本概念常用源 Source常用sink 基本概念  什麼叫flume? 分散式,可靠的大量日誌收集、聚合和移動工具。  events 事件,是一行數據的位元組數據,是flume發送文件的基本單位。  flume配置文件 重命名flum ...
  • 1. innodb_lock_wait_timeout mysql 可以自動監測行鎖導致的死鎖併進行相應的處理,但是對於表鎖導致的死鎖不能自動監測,所以該參數主要用於,出現類似情況的時候等待指定的時間後回滾。系統預設值是50秒。用戶可以根據業務自行設置。生產環境不推薦使用過大的 innodb_loc ...
  • 1、若你用的Linux系統是CentOS的話,這是一個坑: 它會提示你JAVA_HOME找不到,現在去修改文件: 這是CentOS的一個大坑,手動配置JAVA_HOME環境變數。 2、啟動後無NameNode進程 如果在啟動Hadoop,start-all.sh之後一切正常。但是Jps查看進程時發現 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...