MySQL 練習題


 

基於之前的三張表

1. 取得每個部門最高薪水的人員名稱

  取得每個部門最高薪水,和emp表做連接查詢

select t.*,e.ename from emp e join (select deptno,max(sal) maxsal from emp group by deptno) t on t.deptno = e.deptno and t.maxsal = e.sal;

 

2. 哪些人的薪水在部門平均薪水之上

  先取得部門平均薪水,之后作為t表,和emp做連接查詢

select e.ename,e.sal from emp e join (select deptno,avg(sal) avgsal from emp group by deptno) t on e.sal > t.avgsal and e.deptno = t.deptno;

 

3. 取得部門中(所有人的)平均薪水等級

  每個人的薪水等級,然后按照部門分組,求等級的平均值

select e.deptno,avg(s.grade) from emp e join salgrade s on e.sal between s.losal and s.hisal group by deptno order by deptno;

 

4. 不使用組函數(max)取得最高薪水

select sal from emp order by sal desc limit 0,1;

 

5. 取得平均薪水最高的部門的部門編號

  先取得部門的平均薪水,然后做降序后,取第一個

select deptno,avg(sal) as avgsal from emp group by deptno order by avg(sal) desc limit 0,1;

 

6. 取得平均薪水最高的部門的部門名稱

  先取得部門的平均薪水降序,然后與dept表做連接查詢取第一個

select e.deptno,d.dname,avg(e.sal) as avgsal from emp e join dept d on d.deptno = e.deptno group by deptno order by avgsal desc limit 0,1;

 

7. 求平均薪水的等級最低的部門的部門名稱
  三張表做連接查詢,先取得部門的平均薪水,然后與等級表做連接查詢,然后再與部門名稱表做連接查詢

select d.dname from (select deptno,avg(sal) as avgsal from emp group by deptno) t join salgrade s on t.avgsal between s.losal and s.hisal join dept d on d.deptno = t.deptno limit 0,1;

 

8. 取得比普通員工(員工代碼沒有再mgr字段上出現)的最高薪水還要高的領導人的姓名

  先找到普通員工(即員工編號不在mgr中出現的就是普通員工),然后找到普通員工的最高工資,比普通員工的最高工資高的肯定是領導

select ename,sal from emp where sal > (select max(sal) from emp where empno not in (select distinct mgr from emp where mgr is not null))

 

9. 取得薪水最高的前五名員工

select ename,sal from emp order by sal desc limit 0,5;

 

10. 取得薪水最高的第六到第十名員工

  薪水相同,ename 升序

select ename,sal from emp order by sal desc,ename asc limit 5,5;

 

11. 取得最后入職的5名員工

select ename,hiredate from emp order by hiredate desc,ename asc limit 0,5;

 

12. 取得每個薪水等級有多少員工

  先求每個員工的薪資等級,然后按照薪資等級分組求總數,排序

select s.grade,count(*) from emp e join salgrade s on e.sal between s.losal and s.hisal group by s.grade order by s.grade;

 

13. 有3個表S(學生表),C(課程表),SC(學生選課表) 

  S(SNO,SNAME)代表(學號,姓名)
  C(CNO,CNAME,CTEACHER)代表(課號,課名,教師)
  SC(SNO,CNO,SCGRADE)代表(學號,課號,成績)

     

   (1)找出沒有選過‘黎明’老師的所有學生的姓名

select * from s where sno not in (select sno from sc where cno = 5);

  (2)列出2門以上(含2門)不及格學生姓名及平均成績

   先求出兩門以上不及格的學生作為b表,求出每個學生的平均成績作為c表,三張表做連接查詢

select a.sname,c.avgscgrade from (select sno from sc where scgrade < 60 group by sno having count(scgrade) >= 2) b join s a on b.sno = a.sno join (select sno,avg(scgrade) as avgscgrade from sc group by sno) c on a.sno = c.sno;

  (3)即學過1號課程又學過2號課程的所有學生的姓名

  先求出即學過1號課程又學過2號課程的學生(即選過1號或2號並且選課的數量大於等於2)作為b表和s表連接查詢

select s.sname,s.sno from s join (select sno from sc where cno in (1,2) group by sno having count(cno) >= 2) b on s.sno = b.sno;

 

14. 列出所有員工及領導的姓名
  左外連接,左邊為主表,右邊沒有補空

select a.ename,ifnull(m.ename,'沒有上級') from emp a left join emp m on a.mgr = m.empno;

 

15. 列出受雇日期早於直接上級的所有員工的編號,姓名,部門名稱

  先求受雇日期早於其直接上級的所有員工,然后和dept表做連接查詢

select a.empno,a.ename,d.dname from emp a left join emp m on a.mgr = m.empno join dept d on a.deptno = d.deptno where a.hiredate < m.hiredate;

 

16. 列出部門名稱和這些部門的員工信息,同時列出那些沒有員工的部門

  左外連接

select d.dname,e.* from dept d left join emp e on d.deptno = e.deptno;

 

17. 列出至少有5個員工的所有部門

  以部門編號分組,求出每個部門員工的數量,然后再having過濾出大於5個的

select d.dname,count(*) from dept d left join emp e on d.deptno = e.deptno group by d.dname having count(*) >= 5;

 

18. 列出薪金比“SMITH”多的員工信息

select * from emp where sal > (select sal from emp where ename = 'smith');

 

19. 列出所有“CLERK”的姓名及部門名稱,部門人數

  先求出工作時clerk的員工和部門名稱作為a表,按照部門號分組求出部門編號和每個部門的人數作為b表,a表和b表做連接查詢

select a.ename,a.dname,b.cc from (select e.ename,d.dname,d.deptno from emp e join dept d on e.deptno = d.deptno where job = 'clerk') a join (select e.deptno,count(*) as cc from emp e group by e.deptno) b on a.deptno = b.deptno;

 

20. 列出最低薪金大於1500的各種工作及從事此工作的全部雇員人數

    先求出最低薪資大於1500的工作崗位作為a表,求出各個崗位的全部雇員數作為b表,兩張表做連接查詢

select job,count(*) from emp group by job having min(sal) > 1500;

 

21. 列出所在部門"sales"<銷售部>工作的員工姓名,假定不知道銷售部的部門編號;

  先查出部門編號,在子查詢

select ename from emp where deptno = (select deptno from dept where dname = 'sales');

 

22. 列出薪金高於公司平均薪金的所有員工,所在部門,上級領導,雇員的工資等級

  先求出薪資高於平均薪資的所有員工,然后和dept表連接查詢求部門名稱,和emp表連接求上級領導,和salgrade表連接求工資等級

select e.ename,d.dname,f.ename,s.grade from emp e join dept d on d.deptno = e.deptno left join emp f on e.mgr = f.empno join salgrade s on e.sal between s.losal and s.hisal where e.sal > (select avg(sal) from emp);

 

23. 列出與“scott”從事相同工作的所有員工及部門名稱

  先找到scott的工作崗位,然后連接查詢

select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno where job = (select job from emp where ename = 'scott') and e.ename <> 'scott';

 

24. 列出薪金等於部門30中員工的薪金的其他員工的姓名和薪金;

  先求出部門30的所有薪金,然后在emp表中查詢滿足條件的其他員工

select ename,sal from emp where sal in (select distinct sal from emp where deptno = 30) and deptno <> 30;

 

25. 列出薪金高於在部門30工作的所有員工的薪金的員工姓名和薪金,部門名稱。
  先求出部門30的最高工資,然后與dept表連接查詢

select e.ename,e.sal,d.dname from emp e join dept d on e.deptno = d.deptno where sal > (select max(sal) from emp where deptno = 30);

 

26. 列出每個部門工作的員工數量,平均工資和平均服務期限
  平均服務期限,計算時間函數timestampdiff(間隔類型,前一個時間,后一個時間)

select d.dname,count(*),avg(sal),avg(timestampdiff(YEAR,hiredate,now())) from emp e join dept d on e.deptno = d.deptno group by e.deptno;

 

27. 列出所有員工的姓名,部門名稱和工資
  emp表和dept表做連接查詢

select e.ename,d.dname,e.sal from emp e join dept d on e.deptno = d.deptno order by d.dname;

 

28. 列出所有部門的詳細信息和人數
  dept和emp表做左外連接查詢,按照e.deptno分組

select d.*,count(e.deptno) as '人數' from dept d left join emp e on d.deptno = e.deptno group by e.deptno;

 

29. 列出各種工作的最低工資及從事此工作的雇員姓名
  先求出各個崗位的最低工資作為a表,和emp表做連接查詢,查詢條件是工資相等

select e.* from emp e join (select job,min(sal) as minsal from emp group by job) a on a.minsal = e.sal and a.job = e.job;

 

30. 列出各個部門的manager領導的最低工資

select deptno,min(sal) from emp where job = 'manager' group by deptno;

 

31. 列出所有員工的年工資,按照年薪從低到高排序
  ifnull(comm,0) 如果comm為空就當作

select ename,(sal + ifnull(comm,0))*12 as incomm from emp order by incomm;

 

32. 求出員工領導的薪水超過3000的員工名稱和領導名稱
  自連接求出每個員工的領導,條件查詢領導薪水超過3000的

select a.ename,b.ename from emp a join emp b on a.mgr = b.empno where b.sal > 3000;

 

33. 求出部門名稱中帶'S'字符的部門員工的工資合計,部門人數
  對emp表和dept表做右連接查詢,按照部門名分組,條件是部門名中帶有'S';

select d.dname,count(e.ename),sum(sal) from emp e right join dept d on e.deptno = d.deptno where d.dname like '%S%' group by d.dname;

 

34. 給任職日期超過30年的員工加薪10%;

update emp set sal = sal * 1.1 where timestampdiff(YEAR,hiredate,now()) > 30;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM