--職工表 CREATE TABLE emp( empno INT, ename VARCHAR(50), job VARCHAR(50), mgr INT, hiredate DATE, sal DECIMAL(7,2), comm DECIMAL(7,2), deptno INT ) ; --部門表 CREATE TABLE dept( deptno INT, dname VARCHAR(14), loc VARCHAR(13) ); --插入數據到職工表 INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20); INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30); INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30); INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20); INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30); INSERT INTO emp VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30); INSERT INTO emp VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10); INSERT INTO emp VALUES(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20); INSERT INTO emp VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10); INSERT INTO emp VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30); INSERT INTO emp VALUES(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20); INSERT INTO emp VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30); INSERT INTO emp VALUES(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20); INSERT INTO emp VALUES(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10); --插入數據到部門表 INSERT INTO dept VALUES(10, 'ACCOUNTING', 'NEW YORK'); INSERT INTO dept VALUES(20, 'RESEARCH', 'DALLAS'); INSERT INTO dept VALUES(30, 'SALES', 'CHICAGO'); INSERT INTO dept VALUES(40, 'OPERATIONS', 'BOSTON'); --練習開始!!! -- Q1:查詢出高於10號部門的平均工資的員工信息 select * from emp where sal>(select avg(sal) from emp where deptno=10); -- Q2:查詢出比10號部門任何員工薪資高的員工信息 select * from emp where sal>(select max(sal) from emp where deptno=10); --低效率寫法 select * from emp where sal>all(select sal from emp where deptno=10); -- Q3:和10號部門同名同工作的員工信息 select * from emp e1 where exists(select * from emp e2 where e2.ename=e1.ename and e2.job=e1.job and e2.deptno=10) and e1.deptno<>10; --另一種寫法(多列子查詢) select * from emp where (ename,job) in (select ename,job from emp where deptno=10) and deptno<>10; -- Q4:獲取員工的名字和部門的名字 select ename,dname from emp e,dept d where e.deptno=d.deptno; -- Q5:查詢emp表中經理信息 select * from emp where empno in(select distinct mgr from emp); -- Q6:薪資高於10號部門平均工資的所有員工信息 select * from emp where sal>(select avg(sal) from emp where deptno=10); -- Q7:有哪些部門的平均工資高於30號部門的平均工資 select deptno from emp group by deptno having avg(sal)>(select avg(sal) from emp where deptno=30); -- Q8:工資>JONES工資的員工信息 select * from emp where sal>(select sal from emp where ename='JONES'); --Q9:查詢與SCOTT同一個部門的員工 select * from emp where deptno=(select deptno from emp where ename='SCOTT'); -- Q10:工資高於30號部門所有人的員工信息 select * from emp where sal>(select max(sal) from emp where deptno=30); -- Q11:查詢工作和工資與MARTIN完全相同的員工信息 select * from emp e1 where exists(select * from emp e2 where e1.job=e2.job and e1.sal=e2.sal and e2.ename='MARTIN') and ename<>'MARTIN'; --另一種寫法(多列子查詢) SELECT * FROM emp WHERE (job,sal) IN (SELECT job,sal FROM emp WHERE ename='MARTIN') and ename<>'MARTIN'; -- Q12:有兩個以上直接下屬的員工信息 select * from emp e1 where (select count(*) from emp e2 where e2.mgr=e1.empno)>2; --另一種方法 SELECT * FROM emp e1 WHERE e1.empno IN (SELECT e2.mgr FROM emp e2 GROUP BY e2.mgr HAVING COUNT(*)>2); -- Q13:查詢員工編號為7788的員工名稱,員工工資,部門名稱,部門地址 select ename,sal,dname,loc from emp inner join dept on empno=7788 and emp.deptno=dept.deptno; -- Q14:查詢出高於本部門平均工資的員工信息 select * from emp e1 where sal>(select avg(sal) from emp e2 where e2.deptno=e1.deptno); -- Q15:列出達拉斯加工作的人中,比紐約平均工資高的人 select * from emp inner join dept on sal>(select avg(sal) from emp inner join dept on emp.deptno=dept.deptno and loc='NEW YORK') and emp.deptno=dept.deptno and loc='DALLAS'; -- Q16:查詢7369員工編號,姓名,經理編號和經理姓名 select e1.empno,e1.ename,e1.mgr 經理編號,e2.ename 經理姓名 from emp e1 inner join emp e2 on e1.mgr=e2.empno and e1.empno=7369; -- Q17:查詢出各個部門薪水最高的員工所有信息 select * from emp e1 where sal=(select max(sal) from emp e2 where e2.deptno=e1.deptno);
善於利用相關子查詢編寫SQL查詢語句,可以較為方便,雖然可能會損失查找效率