【Oracle基礎】分組統計,多表查詢,子查詢,Rownum與分頁查詢

【Oracle基礎】分組統計,多表查詢,子查詢,Rownum與分頁查詢


數據使用的是scott用戶下自帶的表。

1. 分組統計

  • 語法
SELECT * |列名 FROM 表名 {WEHRE 查詢條件} {GROUP BY 分組字段} ORDER BY 列名 1 ASC|DESC,列名 2...ASC|DESC
  • 示例
--分組查詢
--查詢出每個部門的平均工資
--分組查詢中,出現在group by後面的原始列,才能出現在select後面
--沒有出現在group by後面的列,想在select後面,必須加上聚合函數。
--聚合函數有一個特性,可以把多行記錄變成一個值
select e.deptno,avg(e.sal)
from emp e
group by e.deptno;

在這裏插入圖片描述

--查詢出平均工資高於2000的部門信息
select e.deptno,avg(e.sal)
from emp e
group by e.deptno
having avg(e.sal)>2000;
--所有條件都不能使用別名來判斷

--查詢出每個部門工資高於800的員工的平均工資
select e.deptno,avg(e.sal) asal
from emp e
where e.sal > 800
group by e.deptno
--where是過濾分組前的數據,having是過濾分組後的數據。
--查詢出每個部門工資高於800的員工的平均工資,然後再查詢出平均工資高於2000的部門
select e.deptno,avg(e.sal) sal
from emp e
where e.sal>800
group by e.deptno
having avg(e.sal)>2000;
  • 注意:
  1. 如果使用分組函數, SQL 只可以把 GOURP BY 分組條件字段和分組函數查詢出來,不能有其他字段。
  2. 如果使用分組函數,不使用 GROUP BY 只可以查詢出來分組函數的值
    在這裏插入圖片描述
    在這裏插入圖片描述

2. 多表查詢

2.1 多表連接基本查詢

  • 語法
SELECT {DISTINCT} *|列名.. FROM 表名 別名,表名 1 別名 {WHERE 限制條件 ORDER BY 排序字段 ASC|DESC...}
  • 查詢員工表和部門表
select * 
from emp e,dept d;

在這裏插入圖片描述
我們發現產生的記錄數是 56 條,我們還會發現 emp 表是 14 條,dept 表是 4 條, 56 正是 emp表和 dept 表的記錄數的乘積,我們稱其爲笛卡爾積。

如果多張表進行一起查詢而且每張表的數據很大的話笛卡爾積就會變得非常大,對性能造成影響,想要去掉笛卡爾積我們需要關聯查詢。

在兩張表中我們發現有一個共同的字段是 depno, depno 就是兩張表的關聯的字段,我們可以使用這個字段來做限制條件,兩張表的關聯查詢字段一般是其中一張表的主鍵,另一張表的外鍵。

--等值連接
select * 
from emp e,dept d
where e.deptno=d.deptno;

在這裏插入圖片描述
關聯之後我們發現數據條數是 14 條,不在是 56 條。

在這裏插入圖片描述

2.2 內連接

--內連接
select * 
from emp e inner join dept d
on e.deptno = d.deptno;

在這裏插入圖片描述

2.3 外連接

當我們在做基本連接查詢的時候,查詢出所有的部門下的員工,我們發現編號爲 40 的部門下沒有員工,但是要求把該部門也展示出來,我們發現上面的基本查詢是辦不到的

--查詢出所有部門,以及部門下的員工信息。[外連接]
select * 
from emp e right join dept d
on e.deptno = d.deptno;

在這裏插入圖片描述
當然,上面是普通寫法,Oracle有專用外連接寫法

select * 
from emp e,dept d
where e.deptno(+) = d.deptno;

在這裏插入圖片描述

  • 表示補充,即哪個表有加號,這個表就是匹配表。如果加號寫在右表,左表就是全部顯示,所以是左連接。
--查詢出員工姓名,員工領導姓名
--自連接:自連接其實就是站在不同的角度把一張表看成多張表。
select  e1.ename,e2.ename
from emp e1,emp e2
where e1.mgr=e2.empno

--查詢出員工姓名,員工部門名稱,員工領導姓名,員工領導部門名稱
select  e1.ename,d1.dname,e2.ename,d2.dname
from emp e1,emp e2, dept d1,dept d2
where e1.mgr=e2.empno
and e1.deptno=d1.deptno
and e2.deptno=d2.deptno

3. 子查詢

在一個查詢的內部還包括另一個查詢,則此查詢稱爲子查詢。

Sql的任何位置都可以加入子查詢。

--子查詢返回一個值
--查詢出工資和SCOTT一樣的員工信息
select * from emp where sal in (select sal from emp where ename = 'SCOTT')

在這裏插入圖片描述

--子查詢返回一個集合
--查詢出工資和10號部門任意員工一樣的員工信息
select * from emp where sal in (select sal from emp where deptno = 10);

在這裏插入圖片描述

--子查詢返回一張表
--查詢出每個部門最低工資,和最低工資員工姓名,和該員工所在部門名稱
select t.deptno,t.msal,e.ename,d.dname
from (select deptno, min(sal) msal
      from emp
      group by deptno) t,emp e,dept d
where t.deptno = e.deptno
and t.msal = e.sal
and e.deptno = d.deptno;

在這裏插入圖片描述

4. Rownum與分頁查詢

ROWNUM:表示行號,實際上此是一個列,但是這個列是一個僞列,此列可以在每張表中出現。

--查詢 emp 錶帶有 rownum 列
select ROWNUM,t.* from emp t

在這裏插入圖片描述
我們可以根據 rownum 來取結果集的前幾行,比如前 5 行

--查詢前 5 行
select ROWNUM,t.* from emp t where ROWNUM<6

在這裏插入圖片描述
但是我們不能取到中間幾行,因爲rownum不支持大於號,只支持小於號。如果要實現這種需求,我們可以使用子查詢

--emp表工資倒敘排列後,每頁五條記錄,查詢第二頁。
--rownum行號不能寫上大於一個正數
select * from(
  select rownum rn,e.* 
  from
  (select * from emp order by sal desc) e
  where rownum<11
) where rn>5

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章