練習一、列出薪金高於在部門30工作的所有員工的薪金的員工的姓名、薪金、部門名稱、部門人數
思考步驟:
1、確定需要使用的數據表
一、emp:員工的姓名、薪金
二、dept : 部門表:部門名稱
三、emp: 部門人數:需要使用統計字段
2、確定已知的關聯字段
關聯字段:emp.deptno=dept.deptno
1、查詢出部門30工作的所有員工的薪金
select sal from emp where deptno=30; ---查詢出來的數據為多行單列數據,需要大於這里面的所有數據,需要 all
2、找出大於以上條件的所有的人員信息
select ename ,sal
from emp
where sal >all(select sal from emp where deptno=30) ---重點:>all where 子句嵌套
3、顯示部門名稱---需要關聯dept表
select e.ename ,e.sal ,d.dname
from emp e,dept d
where e.sal >all(
select sal from emp where deptno=30 )
and e.deptno=d.deptno; -----注意,在from后面的逗號,不能多加逗號
4、統計部門人數:
select e.ename ,e.sal ,d.dname, temp.count
from emp e,dept d,(
select deptno,count(empno)count from emp group by deptno) temp
where e.sal >all(
select sal from emp where deptno=30 )
and e.deptno=d.deptno
and e.deptno=temp.deptno;
----注意兩點:如果需要統計人數,則需要進行分組
但是在使用分組的時候,select子句中只能出現分組的字段與統計函數,而不能出現其他我們需要的字段,因此,我們采用from的子句進行操作,現將其分組后作為一個臨時表再進行關聯操作
注意,有幾個關聯的動作就需要做幾次字段關聯來消除笛卡爾積
練習二:列出與‘Scott’從事相同工作的所有員工及部門名稱、部門人數、領導姓名。
確定要使用的數據表:
1、emp:確定工作、員工姓名、領導姓名需要根據編碼顯示出來
2、dept:確定部門的名稱
3、部門人數
確定已知的關聯字段:
emp.deptno=dept.deptno
二、列出與‘Scott’從事相同工作的所有員工及部門名稱、部門人數、領導姓名。
確定要使用的數據表:
1、emp:確定工作、員工姓名、領導姓名需要根據編碼顯示出來
2、dept:確定部門的名稱
3、部門人數
確定已知的關聯字段:
emp.deptno=dept.deptno
emp.mgr=emp.empno ---自身關聯很重要
1.試下怎樣找出該員工的領導,找出scott的領導
select mgr from emp where ename='SCOTT';
SELECT ename FROM EMP where empno=(select mgr from emp where ename='SCOTT');
2、找出與scott工作相同的同事
select job from emp where ename ='SCOTT';
SELECT ename FROM EMP WHERE JOB =(select job from emp where ename ='SCOTT');
SELECT ename mgrname FROM EMP where empno=(select MGR from emp where ename ='SCOTT');
3、部門名稱,需要關聯另一張表
SELECT e.empno, e.ename ,d.dname
FROM EMP e,dept d
WHERE JOB =(select job from emp where ename ='SCOTT')
and e.deptno=d.deptno;
4.部門人數,部門人數需要將數據進行分組,分組后統計
select count(empno) from emp group by deptno; ---將其分組后作為一個新的函數進行關聯
SELECT e.empno, e.ename ,d.dname, temp.count ,ename mgrname
FROM EMP e,dept d,(
select deptno,count(empno) count from emp group by deptno) temp
WHERE JOB =(select job from emp where ename ='SCOTT')
and e.deptno=d.deptno
and e.deptno=temp.deptno;
----在select取值的時候,你必須要把你需要使用的字段取出來
5、顯示領導,與自身關聯
SELECT e.empno, e.ename ,d.dname, temp.count ,c.ename mgrname
FROM EMP e,dept d,(
select deptno,count(empno) count from emp group by deptno) temp,emp c
WHERE e.JOB =(select job from emp where ename ='SCOTT')
and e.deptno=d.deptno
and e.deptno=temp.deptno
and e.mgr=c.empno;
6、去掉重復的信息:
SELECT e.empno, e.ename ,d.dname, temp.count ,c.ename mgrname
FROM EMP e,dept d,(
select deptno,count(empno) count from emp group by deptno) temp,emp c
WHERE e.JOB =(select job from emp where ename ='SCOTT')
and e.deptno=d.deptno
and e.deptno=temp.deptno
and e.mgr=c.empno
and e.ename!='SCOTT';
三、列出薪金比‘SMITH’或者‘ALLEN’多的所有員工的編號、姓名、部門名稱、領導名稱、部門人數、平均工資、最高工資、最低工資
確定要使用的數據表:
1、emp:確定員工編號、員工姓名、領導姓名需要根據編碼顯示出來
2、dept:確定部門的名稱
3、部門人數,根據分組后計算出來
確定已知的關聯字段:
emp.deptno=dept.deptno
emp.mgr=emp.empno ---自身關聯很重要,用於顯示出領導的名稱
count、max、min 、avg ----用於計算最高、最低、平均工資
練習三:
列出薪金比‘SMITH’或者‘ALLEN’多的所有員工的編號、姓名、部門名稱、領導名稱、部門人數、平均工資、最高工資、最低工資
確定要使用的數據表:
1、emp:確定員工編號、員工姓名、領導姓名需要根據編碼顯示出來
2、dept:確定部門的名稱
3、部門人數,根據分組后計算出來
確定已知的關聯字段:
emp.deptno=dept.deptno
emp.mgr=emp.empno ---自身關聯很重要,用於顯示出領導的名稱
count、max、min 、avg ----用於計算最高、最低、平均工資
1、找出薪金比‘SMITH’或者‘ALLEN’多的所有員工的編號、姓名
select sal from emp where ename='SMITH' or ename ='ALLEN' ; ---- >any 大於他們中的最小值就可以了
select empno ,ename ,sal
from emp
where sal >any (select sal from emp where ename='SMITH' or ename ='ALLEN');
2、顯示部門名稱,需要關聯dept表
select e.empno ,e.ename ,e.sal ,d.dname
from emp e, dept d
where sal >any (select sal from emp where ename='SMITH' or ename ='ALLEN')
and e.deptno=d.deptno;
3、計算部門人數,需要按照部門分組,顯示計算最高工資、最低工資、平均工資
select deptno, count(empno) from emp group by deptno;
select e.empno ,e.ename ,e.sal ,d.dname ,temp.count, temp.AVG , temp.MAX, temp.MIN
from emp e, dept d ,(
select deptno, count(empno) count ,AVG(SAL) AVG,MAX(SAL) MAX,MIN(SAL) MIN from emp group by deptno) temp
where sal >any (select sal from emp where ename='SMITH' or ename ='ALLEN')
and e.deptno=d.deptno
and e.deptno=temp.deptno;
4.顯示領導名稱
select e.empno ,e.ename ,e.sal ,d.dname , c.ename mgrname,temp.count, temp.AVG , temp.MAX, temp.MIN
from emp e, dept d ,(
select deptno, count(empno) count ,AVG(SAL) AVG,MAX(SAL) MAX,MIN(SAL) MIN from emp group by deptno) temp ,emp c
where e.sal >any (select sal from emp where ename='SMITH' or ename ='ALLEN')
and e.deptno=d.deptno
and e.deptno=temp.deptno
and e.mgr=c.empno;
5.去掉重復數據並進行檢查
select e.empno ,e.ename ,e.sal ,d.dname , c.ename mgrname,temp.count, temp.AVG , temp.MAX, temp.MIN
from emp e, dept d ,(
select deptno, count(empno) count ,AVG(SAL) AVG,MAX(SAL) MAX,MIN(SAL) MIN from emp group by deptno) temp ,emp c ----這邊是統計的數據,是不可以直接放在select語句中的,否則會造成其他類型的字段不可以顯示
where e.sal >any (select sal from emp where ename='SMITH' or ename ='ALLEN')
and e.deptno=d.deptno
and e.deptno=temp.deptno
and e.mgr=c.empno(+) ---為了將沒有領導的員工信息顯示出來
and e.ename not in('SMITH','ALLEN'); ---為了排除題中已涉及的數據(去掉重復)
練習四:列出受雇佣日期早於其直接上級的所有員工的編號、姓名、部門名稱、部門位置、部門人數
確定要使用的數據表:
1、emp:確定員工編號、員工姓名、領導姓名需要根據編碼顯示出來,及雇佣日期
2、dept:確定部門的名稱、部門位置
3、部門人數,根據分組后計算出來
確定已知的關聯字段:
emp.deptno=dept.deptno
emp.mgr=emp.empno ---自身關聯很重要,用於顯示出領導的名稱
count、max、min 、avg ----用於計算最高、最低、平均工資
練習四:列出受雇佣日期早於其直接上級的所有員工的編號、姓名、部門名稱、部門位置、部門人數
確定要使用的數據表:
1、emp:確定員工編號、員工姓名、領導姓名需要根據編碼顯示出來,及雇佣日期
2、dept:確定部門的名稱、部門位置
3、部門人數,根據分組后計算出來
確定已知的關聯字段:
emp.deptno=dept.deptno
emp.mgr=emp.empno ---自身關聯很重要,用於顯示出領導的名稱
count、max、min 、avg ----用於計算最高、最低、平均工資
1、對雇佣日期進行計算 hiredate 關聯自己可以直接使用關系: emp.mgr=emp.empno
select e.empno ,e.ename ,e.hiredate 員工時間 ,c.hiredate 上司時間
from emp e,emp c
where e.hiredate<c.hiredate
and e.mgr=c.empno;
2、顯示部門名稱與部門位置,需要關聯dept表
select e.empno ,e.ename ,e.hiredate 員工時間 ,c.hiredate 上司時間 ,d.dname ,d.loc
from emp e,emp c ,dept d
where e.hiredate<c.hiredate
and e.mgr=c.empno
and e.deptno=d.deptno;
3、計算部門的人數,需要用group by 進行分組
select deptno ,count(empno) count
from emp
group by deptno;
select e.empno ,e.ename ,e.hiredate 員工時間 ,c.hiredate 上司時間 ,d.dname ,d.loc ,temp.count
from emp e,emp c ,dept d ,(select deptno ,count(empno) count
from emp
group by deptno
) temp
where e.hiredate<c.hiredate
and e.mgr=c.empno
and e.deptno=d.deptno
and e.deptno=temp.deptno;
練習五:列出所有‘CLERK(辦事員)’的姓名及部門名稱、部門人數、工資等級
確定要使用的數據表:
1、emp:確定員工姓名及工作
2、dept:確定部門的名稱
3、emp:部門人數,根據分組后計算出來
4、salgrade:工資等級 grade
確定已知的關聯字段:
emp.deptno=dept.deptno
emp.mgr=emp.empno ---自身關聯很重要,用於顯示出領導的名稱
1、找出所有job為‘CLERK’的員工信息
select ename , sal
from emp
where job='CLERK';
2、顯示部門名稱,關聯dept表
select e.ename , e.sal ,d.dname
from emp e ,dept d
where job='CLERK'
and e.deptno=d.deptno;
3、計算部門人數,使用group by分組
select deptno ,count(empno) count
from emp
group by deptno
select e.ename , e.sal ,d.dname, temp.count
from emp e ,dept d ,(
select deptno ,count(empno) count
from emp
group by deptno) temp
where job='CLERK'
and e.deptno=d.deptno
and e.deptno=temp.deptno;
4、計算薪資等級
查詢一下scott的工資在幾級?
select s.grade ,e.ename,e.sal
from salgrade s, emp e
where e.sal between s.losal and s.hisal;
select e.ename , e.sal ,d.dname, temp.count, s.grade
from emp e ,dept d ,(
select deptno ,count(empno) count
from emp
group by deptno) temp ,salgrade s
where job='CLERK'
and e.deptno=d.deptno
and e.deptno=temp.deptno
and e.sal between s.losal and s.hisal;