子查詢
子查詢的作用:查詢條件未知的事物
查詢條件已知的問題:例如:查詢工資為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...