oracle子查詢和集合查詢

2021-07-28 00:02:38 字數 4279 閱讀 9511

子查詢

子查詢的作用:查詢條件未知的事物

查詢條件已知的問題:例如:查詢工資為800的員工資訊

查詢條件未知的問題:例如:查詢工資為20號部門平均工資的員工資訊

乙個條件未知的問題,可以分解為多個條件已知的問題

查詢工資比ward高的員工資訊

第一:查詢ward的工資?

select sal from emp where ename = 'ward';

第二:查詢工資比1250高的員工資訊?

select * from emp where sal > 1250;

子查詢:

select *

from emp

where sal > (

select sal

from emp

where ename = 'ward'

);查詢部門名為'sales'的員工資訊(方式一:子查詢)

第一:查詢部門名為'sales'的編號?

select deptno from dept where dname = 'sales';

第二:查詢部門號為30的員工資訊?

select * from emp where deptno = 30;

子查詢:

select *

from emp

where deptno = (

select deptno

from dept

where dname = 'sales'

);子查詢細節:

1)子查詢與父查詢可以針對同一張表

2)子查詢與父查詢可以針對不同張表

3) 子查詢與父查詢在傳統引數時,數量要相同

4) 子查詢與父查詢在傳統引數時,型別要相同

5) 子查詢與父查詢在傳統引數時,含義要相同

查詢部門名為'sales'的員工資訊(方式二:多表查詢)

select emp.*

from dept,emp

where (dept.deptno=emp.deptno) and (dept.dname='sales');

查詢每個員工編號,姓名,部門名,工資等級(三表查詢,這三張表並無外健關聯)

select e.empno,e.ename,d.dname,s.grade

from emp e,dept d,salgrade s

where (e.deptno=d.deptno) and (e.sal between s.losal and s.hisal);

查詢工資最低的員工資訊(單行子查詢,使用=號)

第一:查詢出工資最低是多少?

select min(sal) from emp;

第二:查詢工資為800的員工資訊?

select * from emp where sal = 800;

子查詢:

select *

from emp

where sal = (

select min(sal)

from emp

);查詢部門名為'accounting'或'sales'的員工資訊(多行子查詢,使用in關鍵字)    

第一:查詢部門名為'accounting'或'sales'的部門編號?

select deptno from dept where dname in ('accounting','sales');

第二:查詢部門號為10或30號的員工資訊?

select * from emp where deptno in (10,30);

子查詢:

select *

from emp

where deptno in (

select deptno

from dept

where dname in ('accounting','sales')

);查詢工資比20號部門【任意any】乙個員工工資【低<】的員工資訊(多行子查詢,使用any關鍵字)

第一:查詢20號部門的所有工資?

select sal from emp where deptno = 20;

第二:查詢工資比(800,2975,3000,1100,3000)任意乙個低的員工資訊?

select * from emp where sal < any (800,2975,3000,1100,3000);   

在oracle看來,/>=/<=這些符號來比較

多行子查詢:子查詢會返回多於乙個結果,例如:30,20,父查詢用in/any/all這些符號來比較

當多表查詢,子查詢同時能解決問題時,按如下優先方案選擇:

多表查詢-->子查詢

注意:上述結果不是說多表查詢可以替代子查詢,某些情況下,只能用子查詢解決,例如:oracle分頁

集合查詢

使用並集運算,查詢20號部門或30號部門的員工資訊

select * from emp where deptno = 20

union

select * from emp where deptno = 30;

注意:union:二個集合中,如果都有相同的,取其一

union all:二個集合中,如果都有相同的,都取

使用交集運算[intersect],查詢工資在1000-2000和1500-2500之間的員工資訊(方式一)

select * from emp where sal between 1000 and 2000

intersect

select * from emp where sal between 1500 and 2500;

用where行過濾,查詢工資在1000-2000和1500-2500之間的員工資訊(方式二)

select *

from emp

where (sal between 1000 and 2000) and (sal between 1500 and 2500);

使用差集運算[minus],查詢工資在1000-2000,但不在1500-2500之間的員工資訊(方式一)

select * from emp where sal between 1000 and 2000

minus

select * from emp where sal between 1500 and 2500;

使用where行過濾,查詢工資在1000-2000,但不在1500-2500之間的員工資訊(方式二)

select *

from emp

where (sal between 1000 and 2000) and (sal not between 1500 and 2500);

集合查詢的細節:

1)集合操作時,必須確保集合列數是相等

select empno,ename,sal,comm from emp where deptno = 20

union

select empno,ename,sal from emp where deptno = 30;錯

2)集合操作時,必須確保集合列型別對應相同

select empno,ename,sal,comm from emp where deptno = 20

union

select empno,ename,sal,hiredate from emp where deptno = 30;錯

3)a union b union c = c union b union a

select * from emp where deptno = 10

union

select * from emp where deptno = 20

union

select * from emp where deptno = 30;

4)當多個集合操作時,結果的列名由第乙個集合列名決定

select empno "編號",ename "姓名",sal "薪水" from emp where deptno = 20

union

select empno,ename,sal from emp where deptno = 10;

當多表查詢,子查詢,集合查詢都能完成同樣任務時,按如下優化方案選擇:

多表查詢->子查詢->集合查詢

oracle的子查詢和集合運算

子查詢的注意事項 select empno,ename,sal,select job from emp where empno 7839 第四列 from emp 分析 在select 中嵌入子查詢的話,只能是單行子查詢,也就是說只能有乙個返回值,這是因為主查詢的每一行每一列只能對應乙個結果,如果查...

oracle集合查詢

集合操作符專門用於合併多條select 語句的結果,包括 union,union all,intersect minus。當使用集合操作符時,必須確保不同查詢的列個數和資料型別匹配。集合操作符具有以下注意事項 集合操作符不適用於lob varray和巢狀表列。union intersect minu...

Oracle 集合查詢

1 並集運算 union 注意 union 二個集合中,如果都有相同的,取其一 union all 二個集合中,如果都有相同的,都取出來。例 使用並集運算,查詢20號或30號部門的員工資訊。select from emp where deptno 30 union select from emp w...