-
參考編寫代碼
查看全部 -
示例三
按部門統計員工人數,按照如下格式輸出
所有員工入職日期
select hiredate from emp
1、使用函數方式
select count(*) Total,?
? ? ? ? ? ?sum(decode(to_char(hiredate,'yyyy'),'1980',1,0)) "1980",
? ? ? ? ? ?sum(decode(to_char(hiredate,'yyyy'),'1981',1,0))"1981",
? ? ? ? ? ?sum(decode(to_char(hiredate,'yyyy'),'1982',1,0))"1982",
? ? ? ? ? ?sum(decode(to_char(hiredate,'yyyy'),'1987',1,0))"1987"
from emp;
2、使用子查詢方式
select?
(select count(*) from emp) Total,
(select count(*) from emp where to_char(hiredate,'yyyy')='1980') "1980",
(select count(*) from emp where to_char(hiredate,'yyyy')='1981') "1981",
(select count(*) from emp where to_char(hiredate,'yyyy')='1982') "1982",
(select count(*) from emp where to_char(hiredate,'yyyy')='1987') "1987",
from dual;
查看全部 -
示例2
找到員工表中薪水大于本部門平均薪水的員工
1、相關子查詢
select empno,ename,sal,(select avg(sal) from emp where deptno=e.deptno) avgsal from emp e where sal >(select avg(sal) from emp where deptno=e.deptno);
-------------------------------------------
2、多表查詢嵌套子查詢
select e.empno,e.ename,e.sal,d.avgsal from emp e,(select deptno,avg(sal) avgsal from emp group by deptno) d where e.deptno=d.deptno and e.sal>d.avgsal;
---------------------------------------------
寫執行計劃
explain plan for
select e.empno,e.ename,e.sal,d.avgsal from emp e,(select deptno,avg(sal) avgsal from emp group by deptno) d where e.deptno=d.deptno and e.sal>d.avgsal;
查看執行計劃
select * from table (dbms_xplan.display);
用相關子查詢方式更省資源
查看全部 -
分頁查詢顯示員工信息:顯示員工號,姓名,月薪
-每頁顯示四條記錄
-顯示第二頁的員工
-按照月薪降序排列
----------------------------------------------------------------
rownum 行號(順序是默認的,只能使用<,<=,不能使用>,>=)
e1 表,按照工資降序排列順序
select rownum,empno,ename,sal from emp order by sal desc
-----------------------------------------
e2 表 1-8號的員工按照員工工資降序排列
select rownum ,empno,ename,sal from (select rownum ,empno,ename,sal from emp order by sal desc) e1 where rownum <=8) e2
--------------------------------------------
rownum r ,r是e2表的第一列,e1表的行號
e3 表 為8-5號員工按薪水降序排列
select?rownum r,empno,ename,sal
from (select? rownum r,empno,ename,sal?from (select rownum,empno,ename,sal from emp order by sal desc) e1 where rownum<=8) e2 where r>=5;
查看全部 -
子查詢中的NULL值問題
1、單行子查詢中的NULL值問題(子查詢不返回任何行)
2、多行子查詢中的NULL值問題
查詢不是老板的員工
select * from emp where empno not in (select mgr from emp where mgr is not null);
查看全部 -
單行子查詢和多行子查詢
1、單行子查詢只能使用單行操作符;多行子查詢只能使用多行操作符
單行子查詢示例
1、查詢員工信息,要求:-職位與7566員工一樣-薪水大于7782員工的薪水
select * from emp where job= (select job from emp where empno=7566) and sal>(select sal from emp where empno=7782);
單行子查詢只能使用單行操作符
在一個主查詢中可以有多個子查詢
2、查詢工資最低的員工信息
select * from emp where sal =(select min(sal) from emp );
3、查詢最低工資大于20號部門最低工資的部門號和部門的最低工資
select deptno,min(sal) from emp group by deptno having min(sal) > (select min(sal) from emp where deptno=20);
多行子查詢
1、IN?
查詢部門名稱是SALES和ACCOUNTING的員工信息
select * from emp where deptno in (select deptno from dept where dname ='SALES' or dname='ACCOUNTING');
select e.* from emp e,dept d where e.deptno=d.deptno and (d.dname='SALES' or d.dname='ACCOUNTING');
2、ANY
查詢工資比30號部門任意一個員工高的員工信息
select * from emp where sal >any (select sal fro emp where deptno=30);
等價于
select * from emp where sal >(select min(sal) from emp where deptno=30);
3、ALL
查詢工資比30號部門所有員工高的員工信息
select * from emp where sal >all(select sal from emp where deptno=30);
等價于
select * from emp where sal >? (select max(sal) from emp where deptno=30);
查看全部 -
主查詢和子查詢的執行順序
1、一般先執行子查詢,再執行主查詢;但相關子查詢例外
找到員工表中薪水大于本部門平均薪水的員工
select empno,ename,sal,(select avg(sal) from emp where deptno=e.deptno) avgsal from emp e where sal> (select avg(sal) from emp where deptno=e.deptno);
查看全部 -
子查詢的排序問題
一般不在子查詢中,使用排序;但在Top-N分析問題中,必須對子查詢排序
找到員工表中工資最高的前三名
---rownum 行號
1、行號永遠按照默認的順序生成
2、行號只能使用<,<=;不能使用>,>=
select rownum,empno,ename,sal from emp;
select rownum,empno,ename,sal from emp order by sal desc;
select rownum,empon,ename,sal from (select * from emp order by sal desc) where rownum <=3;
查看全部 -
主查詢和子查詢可以不是同一張表
1、查詢部門名稱是SALES的員工信息
多表查詢
select e.* from emp e,dept d where e.deptno=d.deptno and d.dname='SALES'
查看全部 -
FROM 后面的子查詢
1、查詢員工信息:員工號、姓名、月薪
select * from (select empno,ename,sal from emp);
2、查詢員工信息:員工號、姓名、月薪、年薪
select * from (select empno,ename ,sal,sal*12 年薪 from emp);
查看全部 -
不可以使用子查詢的位置:group by
查看全部 -
原來子查詢可以用來解決排序亂的問題
查看全部 -
不懂 說的是什么 意義是什么
查看全部 -
直接跳過where的子查詢還真行
查看全部 -
select 子查詢只能有一行,不行的話就把它變成一行
查看全部
舉報