一、多表查詢
SELECT 列名,列名...
FROM 表名 表的別名,表名 表的別名....
WHERE 條件
ORDER BY 排序字段。。。
1、笛卡爾積:是多張表記錄的乘積。
SELECT *
FROM emp,dept
WHERE ename='SMITH';
SELECT * FROM emp;
SELECT * FROM dept;
SELECT ename,emp.deptno,dname
FROM emp,dept;
2、等值連接,兩張表中存在含義相同,值相等的列的
SELECT *
FROM emp,dept
WHERE emp.deptno=dept.deptno;
SELECT a.deptno,ename,dname
FROM emp a,dept b
WHERE A.deptno=b.deptno
ORDER BY A.deptno;
3、不等值連接
SELECT * FROM salgrade;
SELECT *
FROM emp A,salgrade b
--WHERE a.sal >=b.losal and a.sal<=b.hisal;
WHERE sal between losal and hisal;
---查詢員工的姓名,員工的部門名稱,員工的工資等級
SELECT ename,dname,grade
FROM emp,dept,salgrade
WHERE emp.deptno=dept.deptno AND sal BETWEEN losal AND hisal;
4、自身連接:
SELECT * FROM emp;
SELECT *
FROM emp A,emp b
WHERE a.ename='SMITH' and a.mgr = b.empno;
SELECT *
FROM emp A,emp b
WHERE A.mgr = b.empno;
---查詢員工的姓名,員工的部門名稱,員工的工資等級,員工對應的領導姓名,領導的部門名稱,領導的工資等級
SELECT e.ename 員工姓名,d.dname 員工的部門名稱,s.grade 員工的工資等級,m.ename 領導的姓名,md.dname 領導的部門名稱,ms.grade 領導的工資等級
FROM emp e,dept d,salgrade s,emp m,dept md,salgrade ms
WHERE e.deptno=d.deptno AND e.sal BETWEEN s.losal AND s.hisal AND e.mgr=m.empno AND m.deptno=md.deptno
and m.sal between ms.losal and ms.hisal;
5、外連接:
SELECT *
FROM emp,dept
WHERE emp.deptno(+)=dept.deptno;
SELECT *
FROM emp,dept
WHERE dept.deptno=emp.deptno(+);
6、SQL1999:
(01)CROSS JOIN:交叉連接,笛卡爾積
語法:table1 CROSS JOIN table2
SELECT *
FROM emp CROSS JOIN dept;
=
SELECT *
FROM emp,dept;
(02)NATURAL JOIN:自然連接
語法:table1 NATURAL JOIN table2
SELECT *
FROM emp NATURAL JOIN dept;
(03)JOIN...USING(公共列名)
語法:table1 JOIN table2 USING(公共列)
SELECT *
FROM emp JOIN dept USING(deptno);
(4)JOIN...ON 連接條件
語法:table1 join table2 on 連接條件;
SELECT *
FROM emp JOIN dept ON emp.deptno=dept.deptno;
(05)LEFT JOIN...ON 連接條件
語法:table1 LEFT JOIN table2 ON 連接條件
SELECT *
FROM dept left JOIN emp ON emp.deptno=dept.deptno;
(06)RIGHT JOIN...ON 連接條件
語法:table1 RIGHT JOIN table2 ON 連接條件
SELECT *
FROM emp RIGHT JOIN dept ON emp.deptno=dept.deptno;
(07) FULL JOIN...ON 連接條件
語法:table1 full JOIN table2 ON 連接條件
SELECT *
FROM emp e FULL JOIN emp m ON e.mgr = m.empno
ORDER BY e.empno;
二、分組查詢
1、分組函數:又稱為統計函數,聚合函數
sum():求和
avg():求平均值
MAX():求最大值
MIN():求最小值
count():求個數
*:統計的表的記錄數
列名:統計該列不為null的個數
注意:統計時,不對Null值進行處理
SELECT sum(sal),avg(sal),MAX(sal),MIN(sal),count(empno)
FROM emp;
SELECT
FROM
WHERE
GROUP BY 分組字段,分組字段。。。
HAVING 組過濾條件
ORDER BY
---按照職務不同來分組統計工資總和,人數
SELECT job,sum(sal),count(empno)
FROM emp
GROUP BY job;
---查詢emp表中不同的職務
SELECT DISTINCT JOB
FROM emp;
SELECT JOB
FROM emp
GROUP BY JOB;
---查詢不同的領導工號的個數
SELECT count(distinct mgr)
FROM emp;
---統計各個部門不同職務的員工薪水的總和,平均工資
SELECT deptno,job,sum(sal),avg(sal)
FROM emp
GROUP BY deptno,JOB
ORDER BY deptno;
---統計各個部門不同職務的員工薪水的總和,平均工資,部門名稱,職務
SELECT dname,JOB,sum(sal),avg(sal)
FROM emp,dept
WHERE emp.deptno=dept.deptno
GROUP BY dname,JOB
ORDER BY dname;
---統計各個部門不同職務的員工薪水的總和,平均工資,部門編號,部門名稱,部門位置,職務
SELECT dept.deptno,dname,loc,JOB,sum(sal),avg(sal)
FROM emp,dept
WHERE emp.deptno=dept.deptno
GROUP BY dept.deptno,dname,loc,JOB
ORDER BY dname;
---統計不同工資等級的員工人數,工資總和,工資平均值
SELECT grade,sum(sal),round(avg(sal),2),count(empno)
FROM emp,salgrade
WHERE sal BETWEEN losal AND hisal
GROUP BY grade;
---統計不同工資等級的員工人數,工資總和,工資平均值,要求員工的 人數要大於2
SELECT grade,sum(sal),round(avg(sal),2),count(empno)
FROM emp,salgrade
WHERE sal BETWEEN losal AND hisal
GROUP BY grade
HAVING count(empno)>2;
---查詢各個部門的平均工資大於2000的部門編號和平均工資
SELECT deptno,avg(sal)
FROM emp
GROUP BY deptno
HAVING avg(sal)>2000;
where與having的區別:
WHERE是在分組前進行過濾的,where的后面不能直接使用分組函數做比較
HAVING是在分組后進行過濾的。
3、分組函數的嵌套
---查詢部門平均工資最高的平均工資
SELECT MAX(avg(sal))
FROM emp
GROUP BY deptno;
注意:當select后面的分組函數嵌套使用時,SELECT后面不能有任意列名,只能存在嵌套分組函數
第六章課后作業:
1.查詢部門平均工資在2500元以上的部門名稱及平均工資。
SELECT dname,avg(sal)
FROM emp,dept
WHERE emp.deptno=dept.deptno
GROUP BY dname
HAVING avg(sal)>2500;
2.查詢員工崗位中不是以“SA”開頭並且平均工資在2500元以上的崗位及平均工資,並按平均工資降序排序。
SELECT JOB,avg(sal)
FROM emp
WHERE upper(JOB) NOT LIKE 'SA%'
GROUP BY JOB
HAVING avg(sal)>2500
ORDER BY 2 desc;
3.查詢部門人數在2人以上的部門名稱、最低工資、最高工資,並對求得的工資進行四舍五入到整數位。
SELECT dname,round(MIN(sal)),round(MAX(sal))
FROM emp,dept
WHERE emp.deptno=dept.deptno
GROUP BY dname
HAVING count(empno)>2;
4.查詢崗位不為SALESMAN,工資和大於等於2500的崗位及每種崗位的工資和。
SELECT JOB,sum(sal)
FROM emp
WHERE upper(JOB)!='SALESMAN'
GROUP BY JOB
HAVING sum(sal)>=2500;
5.顯示經理號碼和經理姓名,這個經理所管理員工的最低工資,沒有經理的KING也要顯示,不包括最低工資小於3000的,按最低工資由高到低排序。
SELECT m.empno,m.ename,min(e.sal)
FROM emp e,emp m
WHERE e.mgr=m.empno(+)
GROUP BY m.empno,m.ename
HAVING MIN(e.sal)>=3000
ORDER BY min(e.sal) desc;
6.寫一個查詢,顯示每個部門最高工資和最低工資的差額
SELECT deptno,MAX(sal)-MIN(sal)
FROM emp
GROUP BY deptno;
4.使用ON子句,顯示工作在CHICAGO的員工姓名,部門名稱,工作地點,薪資等級
select ename,dname,loc ,grade
FROM emp JOIN dept ON emp.deptno =dept.deptno
JOIN salgrade ON sal BETWEEN losal AND hisal
WHERE dept.loc='CHICAGO';
三、子查詢
子查詢一般用()括起來
子查詢出現的位置:select,FROM,WHERE,HAVING
嵌套子查詢:一個查詢語句中嵌套了另一個查詢語句,子查詢的語句可以直接運行
單列子查詢:子查詢的返回結果是單行單列的,經常用在where,HAVING
多行子查詢:子查詢的返回結果是單列多行的,經常用在where
多列子查詢:子查詢的返回結果是多行多列的,經常用在from,where
1、單列子查詢
---查詢與smith相同職務的其它員工信息
SELECT JOB FROM emp WHERE lower(ename)='smith';
SELECT *
FROM emp
WHERE job=(SELECT JOB FROM emp WHERE lower(ename)='smith') and lower(ename)!='smith';
------查詢部門平均工資最高的平均工資和部門名稱
SELECT MAX(avg(sal))
FROM emp
GROUP BY deptno;
SELECT dname,round(avg(sal),2)
FROM emp JOIN dept ON emp.deptno=dept.deptno
GROUP BY dname
HAVING avg(sal)=(SELECT MAX(avg(sal))
FROM emp
GROUP BY deptno);
2、多行子查詢:
集合運算:in
---查詢與30部門職務相同的其它部門的員工信息
SELECT distinct JOB FROM emp WHERE deptno=30;
SELECT *
FROM emp
WHERE job in(SELECT distinct JOB FROM emp WHERE deptno=30) and deptno!=30;
ANY:
=ANY:相當於in
SELECT *
FROM emp
WHERE job=any(SELECT distinct JOB FROM emp WHERE deptno=30) and deptno!=30;
>ANY:比子查詢返回結果的最小值要大
---查詢比10部門的最低工資要高的其它部門員工信息
SELECT *
FROM emp
WHERE sal>ANY(SELECT sal
FROM emp
WHERE deptno=10) and deptno!=10;
<ANY:比子查詢返回結果的最大值要小
---查詢比20部門的最高工資要低的其它部門的員工信息
SELECT *
FROM emp
WHERE sal<ANY(SELECT sal
FROM emp
WHERE deptno=20) and deptno!=20;
ALL:
=ALL:不存在現象
>ALL:比子查詢的返回結果的最大值要大
---查詢比20部門所有人薪水都高的員工信息
SELECT *
FROM emp
WHERE sal>all(SELECT sal FROM emp WHERE deptno=20);
<ALL:比子查詢的返回結果的最小值要小
---查詢比10部門所有人薪水都低的員工信息
SELECT *
FROM emp
WHERE sal<all(SELECT sal FROM emp WHERE deptno=10);
3、多列子查詢:
---查詢與SCOTT用戶工資和職務都匹配的其它員工的信息
SELECT *
FROM emp
WHERE sal=(SELECT sal FROM emp WHERE upper(ename)='SCOTT')
AND JOB=(SELECT JOB FROM emp WHERE upper(ename)='SCOTT')
and upper(ename)!='SCOTT';
SELECT *
FROM emp
WHERE (sal,job) in(SELECT sal,JOB FROM emp WHERE upper(ename)='SCOTT') and upper(ename)!='SCOTT';
---查詢部門的名稱,部門人數,部門最高工資,部門的最低工資,部門最低工資的員工姓名
SELECT deptno,count(empno),max(sal),min(sal)
FROM emp
GROUP BY deptno;
SELECT dname,t.c,t.ma,t.mi,ename
FROM dept,emp,(SELECT deptno,count(empno) c,max(sal) ma,min(sal) mi
FROM emp
GROUP BY deptno) t
WHERE dept.deptno=emp.deptno and emp.deptno=t.deptno and sal=t.mi;
1.查詢比自己職位平均工資高的員工姓名、職位,部門名稱,職位平均工資
SELECT JOB,avg(sal)
FROM emp
GROUP BY JOB;
SELECT ename,emp.JOB,dname,sal,t.a
FROM emp,dept,(SELECT JOB,avg(sal) a
FROM emp
GROUP BY JOB) t
WHERE emp.deptno=dept.deptno and emp.job=t.job and sal>t.a;
2.查詢職位和經理同員工SCOTT或BLAKE完全相同的員工姓名、職位,不包括SCOOT和BLAKE本人。
SELECT ename,job
FROM emp
WHERE (JOB,mgr) IN (SELECT JOB,mgr FROM emp WHERE upper(ename) IN('SCOTT','BLAKE')) AND upper(ename) NOT IN('SCOTT','BLAKE');
3.查詢不是經理的員工姓名
SELECT ename
FROM emp
WHERE empno not in(SELECT distinct mgr FROM emp where mgr is not null);
四、分頁查詢
1、rownum:偽列:從1開始遞增
---查詢emp表中的前5行記錄
SELECT *
FROM emp
WHERE rownum<=5;
rownum在做比較運算時,只能使用<,<=,不能使用>,>=
----查詢emp表中5~10條記錄
SELECT rownum r,emp.* FROM emp;
SELECT rownum,t.*
FROM (SELECT ROWNUM r,emp.* FROM emp) t
WHERE t.r between 5 and 10;
---查詢emp表中的最后5條記錄
SELECT rownum,t.*
FROM (SELECT ROWNUM r,emp.* FROM emp) t
WHERE t.r>(select count(empno) from emp)-5;
---每頁顯示3條記錄,查詢第3頁的員工信息
SELECT rownum,t.*
FROM (SELECT ROWNUM r,emp.* FROM emp) t
WHERE t.r>(3-1)*3 and t.r<=3*3;
---每頁顯示3條記錄,查詢第3頁和第5頁的員工信息
SELECT rownum,t.*
FROM (SELECT ROWNUM r,emp.* FROM emp) t
WHERE t.r>(3-1)*3 and t.r<=3*3 or t.r>(5-1)*3 and t.r<=5*3;
2、TOPN
---查詢工資最高的員工信息
SELECT * FROM EMP ORDER BY sal desc;
SELECT *
FROM (SELECT * FROM EMP ORDER BY sal DESC) t
WHERE rownum<=1;
---查詢工資最高的前5位的員工信息
SELECT *
FROM (SELECT * FROM EMP ORDER BY sal DESC) t
WHERE rownum<=5;
作業:
--第五章
--練習一
---1.寫一個查詢,顯示所有員工姓名,部門編號,部門名稱。
select a.ename,a.deptno,b.dname
from emp a,dept b
where a.deptno=b.deptno
---2.寫一個查詢,顯示所有工作在CHICAGO並且獎金不為空的員工姓名,工作地點,獎金
select e.ename,d.loc,e.comm
from emp e,dept d
where e.deptno=d.deptno and nvl(comm,0)>0 and loc='CHICAGO'
---3.寫一個查詢,顯示所有姓名中含有A字符的員工姓名,工作地點。
select e.ename,d.loc
from emp e,dept d
where e.deptno=d.deptno and e.ename like '%A%'
--練習2
---1.查詢每個員工的編號,姓名,工資,工資等級,所在工作城市,按照工資等級進行升序排序
select e.empno,e.ename,e.sal,s.grade,d.loc
from emp e,dept d,salgrade s
where e.deptno=d.deptno
and e.sal between s.losal and s.hisal
order by s.grade
--練習3
---1.查詢所有工作在NEW YORK和CHICAGO的員工姓名,員工編號,以及他們的經理姓名,經理編號。
select a.ename,a.empno,b.ename,b.empno
from emp a,emp b,dept d
where a.mgr=b.empno and a.deptno=d.deptno
and d.loc in('NEW YORK','CHICAGO')
---2.第上一題的基礎上,添加沒有經理的員工King,並按照員工編號排序。
select a.ename,a.empno,b.ename,b.empno
from emp a left JOIN emp b ON a.mgr=b.empno,dept d
where a.deptno=d.deptno
and d.loc in('NEW YORK','CHICAGO')
---3.查詢所有員工編號,姓名,部門名稱,包括沒有部門的員工也要顯示出來。
select empno,ename,dname
from dept right JOIN emp ON emp.deptno=dept.deptno
--練習4
---使用SQL-99寫法,完成如下練習
---1.創建一個員工表和部門表的交叉連接。
select *
from emp CROSS JOIN dept;
---2.使用自然連接,顯示入職日期在80年5月1日之后的員工姓名,部門名稱,入職日期
select ename,dname,hiredate
from emp NATURAL JOIN dept
where hiredate>'1-5月-1980';
---3.使用USING子句,顯示工作在CHICAGO的員工姓名,部門名稱,工作地點
select ename,dname,loc
from emp JOIN dept USING(deptno)
where loc='CHICAGO';
---4.使用ON子句,顯示工作在CHICAGO的員工姓名,部門名稱,工作地點,薪資等級
select ename,dname,loc,grade
from emp JOIN dept ON emp.deptno=dept.deptno,
emp join salgrade on sal between losal and hisal
where loc='CHICAGO'
---5.使用左連接,查詢每個員工的姓名,經理姓名,沒有經理的King也要顯示出來。
select a.ename,b.ename Manager
from emp a left JOIN emp b ON a.mgr=b.empno
---6.使用右連接,查詢每個員工的姓名,經理姓名,沒有經理的King也要顯示出來。
select a.ename Manager,b.ename
from emp b right JOIN emp a ON a.mgr=b.empno
--第六章
--練習1
---1.查詢部門20的員工,每個月的工資總和及平均工資。
select to_char(hiredate,'mm') "month",sum(sal),avg(sal)
from emp
where deptno=20
group by to_char(hiredate,'mm');
---2.查詢工作在CHICAGO的員工人數,最高工資及最低工資。
select count(empno),max(sal),min(sal)
from emp,dept
where loc='CHICAGO' and emp.deptno=dept.deptno
---3.查詢員工表中一共有幾種崗位類型。
select count(distinct job)
from emp
--練習2
---1.查詢每個部門的部門編號,部門名稱,部門人數,最高工資,最低工資,工資總和,平均工資。
select emp.deptno,dept.dname,count(empno),max(sal),min(sal),sum(sal),avg(sal)
from emp,dept
where emp.deptno=dept.deptno
group by emp.deptno,dname
---2.查詢每個部門,每個崗位的部門編號,部門名稱,崗位名稱,部門人數,最高工資,最低工資,工資總和,平均工資。
select emp.deptno,dept.dname,job,count(empno),max(sal),min(sal),sum(sal),avg(sal)
from emp,dept
where emp.deptno=dept.deptno
group by emp.deptno,dname,job
order by emp.deptno
---3.查詢每個經理所管理的人數,經理編號,經理姓名,要求包括沒有經理的人員信息。
select m.empno,m.ename,count(e.empno)
from emp e,emp m
where e.mgr=m.empno(+)
group by m.empno,m.ename
--練習3
---1.查詢部門人數大於2的部門編號,部門名稱,部門人數。
select dept.deptno,dname,count(empno)
from emp,dept
where emp.deptno=dept.deptno
group by dept.deptno,dname
having count(empno)>2
---2.查詢部門平均工資大於2000,且人數大於2的部門編號,部門名稱,部門人數,部門平均工資,並按照部門人數升序排序。
select dept.deptno,dname,count(empno),avg(sal)
from emp,dept
where emp.deptno=dept.deptno
group by dept.deptno,dname
having avg(sal)>=2 and avg(sal)>2000
order by count(empno)
--第七章
--練習1
---1.查詢入職日期最早的員工姓名,入職日期
select ename,hiredate
from emp
where hiredate=(select min(hiredate) from emp)
---2.查詢工資比SMITH工資高並且工作地點在CHICAGO的員工姓名,工資,部門名稱
select ename,sal,dname
from emp,dept
where sal>(select sal from emp where ename='SMITH')
and loc='CHICAGO' and emp.deptno=dept.deptno
---3.查詢入職日期比20部門入職日期最早的員工還要早的員工姓名,入職日期
select ename,hiredate
from emp
where hiredate<(select min(hiredate) from emp where deptno=20)
---4.查詢部門人數大於所有部門平均人數的的部門編號,部門名稱,部門人數
select dept.deptno,dname,count(empno)
from emp,dept
where emp.deptno=dept.deptno
group by dept.deptno,dname
having count(empno)>(select avg(count(empno)) from emp group by deptno)
--練習2
---1.查詢入職日期比10部門任意一個員工晚的員工姓名、入職日期,不包括10部門員工
select ename,hiredate
from emp
where hiredate>any(select hiredate from emp where deptno=10)
and deptno<>10
---2.查詢入職日期比10部門所有員工晚的員工姓名、入職日期,不包括10部門員工
select ename,hiredate
from emp
where hiredate>all(select hiredate from emp where deptno=10)
---3.查詢職位和10部門任意一個員工職位相同的員工姓名,職位,不包括10部門員工
select ename,job
from emp
where job=any(select distinct(job) from emp where deptno=10)
and deptno<>10
--練習3
---1.查詢職位及經理和10部門任意一個員工職位及經理相同的員工姓名,職位,不包括10部門員工
select ename,emp.job
from emp,(select job,mgr from emp where deptno=10) t
where emp.mgr=t.mgr and emp.job=t.job and deptno<>10
---2.查詢職位及經理和10部門任意一個員工職位或經理相同的員工姓名,職位,不包括10部門員工
select ename,emp.job
from emp,(select job,mgr from emp where deptno=10) t
where (emp.mgr=t.mgr or emp.job=t.job) and deptno<>10
--練習4
---1.查詢比自己職位平均工資高的員工姓名、職位,部門名稱,職位平均工資
select ename,emp.job,dname,sal,avgsal
from emp,dept,(select job, avg(sal) avgsal from emp group by job) t
where emp.deptno=dept.deptno and emp.job=t.job and sal>avgsal
---2.查詢職位和經理同員工SCOTT或BLAKE完全相同的員工姓名、職位,不包括SCOOT和BLAKE本人。
select ename,t.job
from emp,(select job,mgr from emp
where ename in('SCOTT','BLAKE')) t
where emp.ename not in('SCOTT','BLAKE') and emp.mgr=t.mgr
---3.查詢不是經理的員工姓名。
select ename
from emp
where empno not in(select distinct mgr from emp where mgr is not null)
--練習5
---1.查詢入職日期最早的前5名員工姓名,入職日期。
select ename,emp.hiredate
from emp,(select rownum r, hiredate from emp order by hiredate) t
where r<=5 and emp.hiredate=t.hiredate
---2.查詢工作在CHICAGO並且入職日期最早的前2名員工姓名,入職日期。
select ename,hiredate
from (select ename, hiredate from emp,dept where emp.deptno=dept.deptno and loc='CHICAGO' order by hiredate) t
where rownum<=2
--練習6
---1.按照每頁顯示5條記錄,分別查詢第1頁,第2頁,第3頁信息,要求顯示員工姓名、入職日期、部門名稱。
select rownum,t.r,ename,hiredate,deptno
from(select rownum r,emp.* from emp) t
where t.r>(1-1)*5 and t.r<=1*5 or t.r>(2-1)*5 and t.r<=2*5 or t.r>(3-1)*5 and t.r<=3*5;
--練習7
---1.按照每頁顯示5條記錄,分別查詢工資最高的第1頁,第2頁,第3頁信息,要求顯示員工姓名、入職日期、部門名稱、工資。
select rownum ,ename,hiredate,deptno,sal
from(select emp.* from emp order by sal desc) t
where rownum>(1-1)*5 and rownum<=1*5 or rownum>(2-1)*5 and rownum<=2*5 or rownum>(3-1)*5 and rownum<=3*5;
--課后作業
---1.查詢工資高於編號為7782的員工工資,並且和7369號員工從事相同工作的員工的編號、姓名及工資。
select empno,ename,sal,job
from emp
where sal>(select sal from emp where empno=7782) and job=(select job from emp where empno=7369)
---2.查詢工資最高的員工姓名和工資。
select ename,sal
from emp
where sal=(select max(sal) from emp)
---3.查詢部門最低工資高於10號部門最低工資的部門的編號、名稱及部門最低工資。
select dept.deptno,dname,min(sal)
from emp,dept
where emp.deptno=dept.deptno
group by dept.deptno,dname
having min(sal)>(select min(sal) from emp where deptno=10)
---4.查詢員工工資為其部門最低工資的員工的編號和姓名及工資。
select empno,ename,sal
from emp
where (deptno,sal) in(select deptno, min(sal) from emp group by deptno)
---5.顯示經理是KING的員工姓名,工資。
select ename,sal
from emp
where mgr=(select empno from emp where ename='KING')
---6.顯示比員工SMITH參加工作時間晚的員工姓名,工資,參加工作時間。
select ename,sal,hiredate
from emp
where hiredate>(select hiredate from emp where ename='SMITH')
---7.使用子查詢的方式查詢哪些職員在NEW YORK工作。
select *
from emp
where deptno=(select deptno from dept where loc='NEW YORK')
---8.寫一個查詢顯示和員工SMITH工作在同一個部門的員工姓名,雇用日期,查詢結果中排除SMITH。
select ename,hiredate
from emp
where deptno=(select deptno from emp where ename='SMITH')
and ename<>'SMITH'
---9.寫一個查詢顯示其工資比全體職員平均工資高的員工編號、姓名。
select empno,ename
from emp
where sal>(select avg(sal) from emp)
---10.寫一個查詢顯示其上級領導是King的員工姓名、工資。
select ename,sal
from emp
where mgr=(select empno from emp where initcap(ename)='King')
---11.顯示所有工作在RESEARCH部門的員工姓名,職位。
select ename,job
from emp
where deptno=(select deptno from dept where dname='RESEARCH')
---12.查詢每個部門的部門編號、平均工資,要求部門的平均工資高於部門20的平均工資。
select deptno,avg(sal)
from emp
group by deptno
having avg(sal)>(select avg(sal) from emp where deptno=20)
---13.查詢大於自己部門平均工資的員工姓名,工資,所在部門平均工資,高於部門平均工資的額度。
select ename,sal,t.a,sal-t.a,t.deptno
from emp,(select deptno,avg(sal) a from emp group by deptno) t
where sal >t.a and emp.deptno=t.deptno
---14. 列出至少有一個雇員的所有部門
select deptno
from emp
group by deptno
having count(empno)>0
---15. 列出薪金比"SMITH"多的所有雇員
select *
from emp
where sal>(select sal from emp where ename='SMITH')
---16. 列出入職日期早於其直接上級的所有雇員
select *
from emp e,emp m
where e.hiredate<m.hiredate
and e.mgr=m.empno
---17. 找員工姓名和直接上級的名字
select e.ename,m.ename
from emp e,emp m
where e.mgr=m.empno
---18. 顯示部門名稱和人數
select dname ,count (empno)
from dept,emp
where dept.deptno=emp.deptno(+)
group by dname
---19. 顯示每個部門的最高工資的員工
select *
from emp
where (deptno,sal) in(select deptno, max(sal)
from emp
group by deptno)
---20. 顯示出和員工號7369部門相同的員工姓名,工資
select ename,sal
from emp
where deptno=(select deptno from emp where empno=7369)
---21. 顯示出和姓名中包含"W"的員工相同部門的員工姓名
select ename
from emp
where deptno in(select deptno from emp where ename like '%W%')
---22. 顯示出工資大於平均工資的員工姓名,工資
select ename,sal
from emp
where sal>(select avg(sal) from emp )
---23. 顯示出工資大於本部門平均工資的員工姓名,工資
select ename,sal
from emp,(select deptno,avg(sal) a from emp group by deptno) t
where sal >t.a and emp.deptno=t.deptno
---24. 顯示每位經理管理員工的最低工資,及最低工資者的姓名
select ename,sal
from emp,(select mgr, min(sal) m from emp group by mgr) t
where sal =t.m and t.mgr=emp.mgr
select ename,sal
from emp
where (sal,mgr) in (select min(sal),mgr from emp group by mgr)
---25. 顯示比工資最高的員工參加工作時間晚的員工姓名,參加工作時間
select ename,hiredate
from emp
where hiredate>(select hiredate from emp where sal=(select max(sal) from emp ))
---26. 顯示出平均工資最高的的部門平均工資及部門名稱
select dname,avg(sal)
from emp,dept
where emp.deptno=dept.deptno
group by dname
having avg(sal)=(select max(avg(sal))
from emp
group by deptno)