1. 程式人生 > >Oracle篇--04 Oracle SQL高階查詢、分頁查詢

Oracle篇--04 Oracle SQL高階查詢、分頁查詢

1.子查詢

子查詢是一條SELECT語句,但它是巢狀在其他SQL語句中的,為的是給該SQL提供資料以支援其執行操作。

檢視誰的工資高於CLARK?

select ename,sal from emp where sal>(select sal from emp where ename=’clark’)
檢視與CLARK 同職位的員工?

select ename,job from emp where job=(select job from emp where ename=’clark’)
檢視與CLARK 同部門的員工?

select ename,deptno from emp where deptno=(select deptno from emp where ename=’clark’)

建立表employee,表中欄位為:

empno,ename,job,sal,deptno,dname,loc

資料為現有表中emp和dept對應的資料

create table employee as

select e.empno,e.ename,e.job,e.sal,e.deptno,d.dname,d.loc

from emp e,dept d

where e.deptno=d.deptno(+)

建立表時若子查詢中的欄位有別名則該表對應的欄位就使用該別名作為其欄位名,當子查詢中一個欄位含有函式或表示式,那麼該欄位必須給別名

create table employee as

select e.empno id,e.ename name,e.job,e.sal,e.deptno,d.dname,d.loc

from emp e,dept d

where e.deptno=d.deptno(+)

CLARK所在部門的所有員工刪除

delete from employee where deptno=(select deptnp from employee where name=’clark’)

2.子查詢的型別

子查詢常用於SELECT 語句中,子查詢根據查詢結果集的不同分為:

單行單列子查詢:常用於過濾條件,可以配合=,>,>=,<,<=使用

多行單列子查詢:常用於過濾條件,由於查詢出多個值,在判斷=時要用IN,

判斷>,>=等操作要配合ANY,AOR

多行多列子查詢:常當作一張表來看待。

查詢與salesman同部門的其他職位的員工:

select ename,job,deptno from emp where deptno in(

select deptno from emp where job=’salesman’

) and job<>’salesman’

檢視比職位是clerk和salesman工資都高的員工

select ename,sal from emp where sal >ALL(

select sal from emp where job in(‘clerk’,’salesman’)

)

3.EXISTS關鍵字

exists後面跟一個子查詢,當該子查詢可以查詢出一條記錄時,則exists表示式成立並返回true。

select deptno,dname from dept d where exists(select *from emp e where  d.deptno=e.deptno)

檢視每個部門的最低薪水是多少?前提是該部門的最低薪水要高於30號部門的最低薪水。

老辦法:

(select min(sal),deptno from emp group by deptno )

(having min(sal>950))

新辦法:

select min(sal),deptno from emp group by deptno having min(

select min(sal) from emp group by deptno

)

檢視比自己所在部門平均工資高的員工?

老辦法:

(select avg(sal),deptno from emp group by deptno)

(select e.ename,e.sal,e.deptno from emp e,ttt t where e.deptno=t.deptno and e.sal>t.avg(sal))

新辦法:

select e.ename,e.sal,e.deptno from emp e,(select avg(sal) avg_sal,deptno from emp group by deptno) t where e.deptno=t.deptno and e.sal>t.avg_sal

SELECT 子句中使用子查詢,可以將查詢的結果當作外層查詢記錄中的一個欄位值顯示

select e.ename,e.sal,(select d.dname from dept d where d.deptno=e.deptno) dep from emp e

4.分頁查詢

分頁查詢是將查詢表中資料時分段查詢,而不是一次性將所有資料查詢出來。有時查詢的資料量非常龐大,這回導致系統資源消耗大,相應速度長,資料冗餘嚴重。為此當遇到這種情況時一般使用分頁查詢解決。資料庫基本都支援分頁,但是不同資料庫語法不同(方言)。

ORACLE中的分頁是基於偽列ROWNUM實現的。

ROWNUM不存在與任何一張表中,但是所有的表都可以查詢該欄位,該欄位的值是隨著查詢自動生成的,該欄位值即為該條記錄的的行號,從1開始,逐條遞增。

在使用ROWNUM對結果集進行編碼的查詢過程中不能使用ROWNUM做>1的數字判斷,否則將查詢不出任何數字。

select * from(select rownum rn,empno,ename,sal,job from emp) where rn between 6 and 10.

注意:先用rownum把號都編好,當成一張表

例子:檢視工資排名的6-10(巢狀兩套子查詢:排序、編號、查詢)

select *

from( select rownum rn, t.*

from (select empno,ename,sal from emp order by sal desc)t

)

where rn between 6 and 10

提高效率

select *

from(select rownum rn,t.*

from(select empno,ename,sal from emp order by sal desc) t

where rownum<=10)

where rn>=6

from(select rownum rn,t.*

from(select empno,ename,sal from emp order by sal desc) t

where rownum<=10)

where rn>=6

計算區間:

pageSize:每頁顯示IDE條目數

page:頁數

star:(page-1)*pageSize+1

end:pageSize*page;

5.DECODE函式

select ename,job,sal,

decode(job,’MANAGER’,sal*1.2,

‘ANALYST’,sal*1.1,

‘SALESMAN’,sal*1.15,

sal

) bonus

        from emp;

DECODE函式功能相似的有CASE語句

select ename,job,sal,

CASE job WHEN ’MANAGER’ THEN sal*1.2

WHEN‘ANALYST’THEN sal*1.1,

WHEN‘SALESMAN’THEN sal*1.15,

ELSE sal END

 bonus

        from emp;

DEOCE在GROUP BY分組中的應用可以將欄位值不同的記錄看做一組。

統計人數,將職位是“MANAGER”,“ANALYST”看做一組,其餘職業看做另外一組分別統計人數。

select

count(*),decode(job,

'MANAGER','VIP',

'AVALYST','VIP',

'OTHER')

 from emp

 group by decode(job,

'MANAGER','VIP',

'AVALYST','VIP',

'OTHER')

6.排序函式

排序函式允許對結果集按照指定的欄位分組,在組內再按照指定的欄位排序,最終生成組內編號。

ROW_NUMBER函式生成組內連續且唯一的數字:

檢視每個部門的工資排名?

select ename,sal,deptno,

row_number() over(

PARTITION BY deptno

ORDER BY sal DESC

  )rank

FROM emp

RANK函式,生成組內不連續也不唯一的數字,同組內排序欄位值一樣的記錄,生成的數字一樣。

檢視每個部門的工資排名?

select ename,sal,deptno,

RANK() over(

PARTITION BY deptno

ORDER BY sal DESC)

  )rank

FROM emp

 

DENSE_RANK函式生成組內連續但不唯一的數字。

select ename,sal,deptno

DENSE_RANK() OVER(

PARTITION BY deptno

ORDER BY sal DESC

)rank

from emp

7.高階分組函式

合併職位是'MANAGER'的員工和薪水大於2500的員工集合,檢視兩種方式的結果差別
select ename,job,sal from emp 
	where job='MANAGER'
	UNION	
select ename,job,sal from emp
	where sal>2500;
select ename,job,sal from emp
	where job='MANAGER'
	UNION ALL
select ename,job,sal from emp
	where sal>2500;
交集
SELECT ename,job,sal from emp
	where job='MANAGER'
	INTERSECT
SELECT ename,job,sal,from emp
	where sal>2500;
差集
SELECT ename,job,sal, from emp
	where job='MANAGER'
	MINUS
SELECT ename,job,sal from emp
	where sal>=2500;

高階分組函式用在GROUP BY 子句中,每個高階分組函式都有一套分組策略。

ROLLUP():分組原則,引數逐次遞減,一直到所有引數都不要,每一種分組都統計一次結果,並且並在一個結果集顯示。

CUBE():每種組合分一次組,分組次數:2的引數個數次方





相關推薦

Oracle--04 Oracle SQL高階查詢查詢

1.子查詢子查詢是一條SELECT語句,但它是巢狀在其他SQL語句中的,為的是給該SQL提供資料以支援其執行操作。檢視誰的工資高於CLARK? select ename,sal from emp wh

MySQL資料庫的使用方法(連表查詢查詢)

資料庫連表查詢 學生表student 老師表teacher 課程表course 選課表student_course 1 按“0001”號課程成績由高到低順序顯示所有學生學號、姓名、成績(二表連線); SELECT   &n

JDBC實現增刪改查模糊查詢查詢查詢以及體現單例設計模式連線資料庫

package com.csdn.dao; import java.io.IOException; import java.io.InputStream; import java.util.Properties; /** * 單例模式 *

表的複雜查詢----多表查詢兩表的條件連線內連線(自連線)左外連線右外連線查詢查詢

基於兩個或兩個以上的表或檢視的查詢。例如:emp和dept是兩張表。(這兩張表的deptno是共同欄位)    ①通過什麼條件把兩張表關聯(如果不使用條件關聯將產生行數乘積的合集---笛卡爾集)例子:emp表字段包含:每行有自己的名字和id以及自己的上級的id,同時自己的上級

Oracle總結【SQL細節多表查詢分組查詢

前言 在之前已經大概瞭解過Mysql資料庫和學過相關的Oracle知識點,但是太久沒用過Oracle了,就基本忘了…印象中就只有基本的SQL語句和相關一些概念….寫下本博文的原因就是記載著Oracle一些以前沒注意到的知識點…以後或許會有用… 例項與資料

JAVAEE——BOS物流項目04:學習計劃datagrid查詢批量刪除修改功能

報錯 datagrid config exce this 調整 bject ephone 窗口 1 學習計劃 1、datagrid使用方法(重要) n 將靜態HTML渲染為datagrid樣式 n 發送ajax請求獲取json數據創建datagrid n 使用easyUI提

Oracle查詢相關內容(包含TOP-N查詢查詢)

職位 oracle子查詢 員工 having 信息 不同 group 最大 mount 本節介紹Oracle子查詢的相關內容: 實例用到的數據為oracle中scott用戶下的emp員工表,dept部門表,數據如下: 一、子查詢 1、概念:嵌入在一個查詢中的另一個

SpringBoot:SpringData JPA:進階查詢—JPQL/原生SQL查詢處理部分欄位對映查詢

上一篇介紹了入門基礎篇SpringDataJPA訪問資料庫。本篇介紹SpringDataJPA進一步的定製化查詢,使用JPQL或者SQL進行查詢、部分欄位對映、分頁等。本文儘量以簡單的建模與程式碼進行展示操作,文章比較長,包含查詢的方方面面。如果能耐心看完這篇文章,你應該能使用SpringDataJ

Oracle (05)外來鍵約束.序列.索引.檢視.查詢技術.排序查詢.資料庫表格設計正規化

外來鍵約束 (完整性約束)(fk) ***** 牽扯到兩個表格: 概念: 1. 外來鍵約束, 是存在兩個表格的操作 ! 2. 一張表格我們稱為主表(父表) , 另一張叫做從表(子表) , 定義了外來鍵約束的表格屬於從表 ! 3. 從表的外來鍵欄位, 是在參考主表中的主鍵

SpringData JPA 詳解(自定義查詢事務控制)

簡介 SpringData JPA是 JPA的一種實現,極大的簡化了JPA的開發,原始JPA的開發,需要建立實體管理工廠,使用實體管理器定義各種查詢進行CRUD操作,而SpringData JPA只需要通過核心介面Repository和它的子類就能很方便的操作資料庫。

Jest客戶端索引新增資料查詢例項

/** * 〈一句話功能簡述〉操作ES的Jest客戶端<br> * 〈功能詳細描述〉 * * @author wangzha * @see [相關類/方法](可選) * @since [產品/模組版本] (可選) */ @Se

索引查詢(索引查詢查詢) C語言實現

1、基本概念 索引查詢又稱分級查詢。 索引儲存的基本思想是:首先把一個集合或線性表(他們對應為主表)按照一定的函式關係或條件劃分成若干個邏輯上的子表,為每個子表分別建立一個索引項,由所有 這些索引項構成主表的一個索引表,然後,可採用順序或連結的方式來儲存索引表和每個子表。

ssm框架實現條件查詢【親測】

0.用到了jquery、AJAX(前端)、ssm框架 1. input輸入框和查詢按鈕 <input id="queryText" type="text" placeholder="請輸入查詢條件">   <button id

springboot-動態查詢和排序

/** * 獲取企業集合 * * @return */ public List<Qy> getQy(String qymc, Intege

4 Springboot中使用redis儲存集合資料,並模擬條件查詢讀取

前面幾篇講了使用redis儲存單個物件,自動快取、更新、刪除的做法,在實際專案中,更常用的是分頁查詢集合資料,條件查詢(譬如按照新增時間倒序排列)。 redis本身是不提供條件查詢的,因為是一個非關係型資料庫,那麼其實通過一些手段,也是能完成條件查詢的,尤其是有順序的條件查

基於Metronic的Bootstrap開發框架經驗總結(16)-- 使用外掛bootstrap-table實現表格記錄的查詢排序等處理

在業務系統開發中,對錶格記錄的查詢、分頁、排序等處理是非常常見的,在Web開發中,可以採用很多功能強大的外掛來滿足要求,且能極大的提高開發效率,本隨筆介紹這個bootstrap-table是一款非常有名的開源表格外掛,在很多專案中廣泛的應用。Bootstrap-table外掛提供了非常豐富的屬性設定,可以實現

ASP.NET MVC搭建專案後臺UI框架—6客戶管理(新增修改查詢

目錄 接著之前未寫完的繼續,本篇,我將講解在此UI框架中和ASP.NET MVC4進行結合開發。效果如下: 這裡,我將新增和修改用了兩個不同的檢視,當然也可以把新增和修改放到同一個檢視中,但是要寫一些業務邏輯程式碼來區分當前呼叫的是修改還是新增,根據新增和修改的不同,而對介面進行不同的操作。 新

靜態查詢表:順序查詢折半查詢查詢

引言:        除去各種線性和非線性的資料結構外,還有一種在實際應用中大量使用的資料結構——查詢表。查詢表是由同一型別的資料元素構成的集合。        對查詢表經常進行的操作有:1、查詢某個"特定的"資料元素是否在查詢表中;2、檢索某個"特定的"資料元素的

c# linq的高階用法:查詢和匯出Excel共用一個方法

我們的查詢資料的介面往往需要整合匯出功能, 查詢、匯出的資料來源及資料格式基本相同, 主要區別在於查詢往往需要分頁, 而匯出是匯出所有查詢結果,不需要分頁。 如果兩個方法分開寫就會有很多相同的程式碼, 下面的方法將兩者合併形成一個通用方法/// <summary>

Entity Framework4.1實現動態多條件查詢和排序

EF通用的分頁實現: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 2