一、子查詢
子查詢:在一個查詢的內部還包括另一個查詢,則此查詢稱爲子查詢,Sql的任何位置都可以加入子查詢
- 範例:查詢比 7654 工資高的僱員
分析:查詢出 7654 員工的工資是多少,把它作爲條件
子查詢在操作中有三類:
單列子查詢:返回的結果是一列的一個內容
單行子查詢:返回多個列,有可能是一個完整的記錄
多行子查詢:返回多條記錄
- 範例:查詢出比僱員 7654 的工資高,同時從事和 7788 的工作一樣的員工
- 範例:要求查詢每個部門的最低工資和最低工資的僱員和部門名稱
---子查詢返回一個值
---查詢出工資和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);
---子查詢返回一張表
---查詢出每個部門最低工資,和最低工資員工姓名,和該員工所在部門名稱
---1,先查詢出每個部門最低工資
select deptno, min(sal) msal
from emp
group by deptno;
---2,三表聯查,得到最終結果。
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;
二、Rownum 和分頁查詢
ROWNUM 表示行號,實際上此是一個列,但是這個列是一個僞列,此列可以在每張表中出現。
rownum 行號:當我們做select操作的時候,每查詢出一行記錄,就會在該行上加上一個行號。
行號從 1 開始,依次遞增,不能跳着走。
----排序操作會影響 rownum 的順序
select rownum, e.* from emp e order by e.sal desc
----如果涉及到排序,但是還要使用rownum的話,我們可以再次嵌套查詢。
select rownum, t.* from(
select rownum, e.* from emp e order by e.sal desc) t;
- 範例:查詢 emp 錶帶有 rownum 列
我們可以根據 rownum 來取結果集的前幾行,比如前 5 行
但是我們不能取到中間幾行,因爲rownum不支持大於號,只支持小於號,如果想實現我們的
需求怎麼辦呢?答案是使用子查詢,也正是oracle分頁的做法。
第一種寫法:
select *
from
(select rownum rm, a.* from (select * from emp) a where rownum < 11) b
where b.rm > 5
第二種寫法:
select *
from (select rownum r ,emp.* from emp) b
where b.r >5 and b.r <11