【MySQL】試題 --- 31道鞏固 SQL 語句的練習題


前言:以下試題中涉及的 table 均來自博主前面發的隨筆“【MySQL】筆記(1)--- MySQL 數據庫概述;常用 DOS命令,SQL命令(初步);

1.取得每個部門最高薪水的人員名稱
    先取出每個部門的最高薪水,再作為臨時表與(對應最高薪水的人員名稱表)連接
    select
        e.ename,t.*
    from 
        emp e
    join
        (select deptno,max(sal) as maxsal from emp group by deptno)t
    on 
        t.deptno = e.deptno and t.maxsal = e.sal


2. 哪些人的薪水在部門的平均薪水之上
    先取出每個部門的平均薪水,再作為臨時表與(薪水在其部門平均薪水上的部門名稱,薪水表)連接
    select
        t.*,e.ename,e.sal
    from
        emp e
    join
        (select deptno,avg(sal) as avgsal from emp group by deptno)t
    on
        e,deptno = t,deptno and e.sal > t.avgsal;


3.取得部門中所有人的平均薪水等級
    找到每個人的薪水等級(emp連接salgrade)
    select 
        e.ename,e.sal,e.deptno,s.grade 
    from 
        emp e 
    join 
        salgrade s 
    on 
        e.sal between s.losal and s.hisal;  
    基於以上結果繼續按照deptno分組,求grade的平均值(直接兩張表就行,不需要臨時表)
    select 
        e.deptno,avg(s.grade)
    from 
        emp e 
    join 
        salgrade s
    on 
        e.sal between s.losal and s.hisal
    group by
        e.deptno;


4.不准用組函數(Max),取得最高薪水(給出兩種解決方案)
    第一種,降序(limit)
    select ename,sal from emp order by sal desc limit 1;
    第二種方案,表的自連接
    select sal from emp where sal not in(select distinct a.sal from emp a join emp b on a.sal<b.sal);


5.取出平均薪水最高的兩個部門編號(至少給出兩種解決方案)
    第一種方案:
    select deptno,avg(sal) as avgsal from emp group by deptno order by avgsal desc limit 1;

    第二種解決方案:
    select max(t.avgsal) from (select avg(sal) as avgsal from emp group by deptno) t;
    select 
        deptno,avg(sal) as avgsal 
    from 
        emp 
    group by 
        deptno 
    having 
        avgsal = (select max(t.avgsal) from (select avg(sal) as avgsal from emp group by deptno) t);


6.求平均薪水的等級最低的部門的部門名稱
    找出最低平均薪水對應的等級
     select 
        grade 
    from 
        salgrade 
    where 
        (select avg(sal) as avgsal,deptno from emp order by avgsal asc limit 1) between losal and hisal;
    
    找出(等於最低平均薪水的等級對應的)部門名稱,平均薪水,等級
    select 
        t.*,s.grade 
    from 
        (select d.dname,avg(sal) as avgsal from emp e join dept on e.deptno = d.deptno group by d.dname) t 
    join 
        salgrade s 
    on 
        t.avgsal between s.losal and s.hisal;
    where 
        s.grade = (select grade from salgrade where (select avg(sal) as avgsal,deptno from emp order by avgsal asc limit 1)
            between losal and hisal);


7.取出比普通員工(員工代碼沒有在mgr字段出現的)的最高薪水還要高的領導人姓名
  注意:not in 在使用時,后面小括號里記得排除 null
    找到普通員工的最高薪水
    select max(sal) from emp where empno not in(select distinct mgr from emp where mgr is not null);
    找到高於(普通員工的最高薪水)的員工
    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));


8.取出薪水最高的前五名
    select ename,sal from emp order by sal desc limit 5;


9.取出薪水最高的第六到第十的員工
    select ename,sal from emp order by sal desc limit 5,5;


10.取出最后入職的5名員工;
    select ename,hiredate from emp order by hiredate desc limit 5;


11.取出每個薪水等級有多少個員工
    select 
        s.grade,count(*)
    from 
        emp e 
    join 
        salgrade s 
    on 
        e.sal between s.losal and s.hisal
    group by 
        s.grade;


12.列出所有員工及領導的名字
    select 
        a.ename '員工',b.ename '領導'
    from 
        emp a
    left join 
        emp b
    on 
        a.mgr = b.empno;


13.列出受雇日期早於直接上級的所有員工的姓名,受雇日期,直接上級的姓名,受雇日期,部門名稱
    select 
        a.empno '員工',a.hiredate,b.ename '領導',b.hire    date,d.dname    
    from 
        emp a 
    join 
        emp b 
    on 
        a.mgr = b.empno 
    join
        dept d
    on
        a.deptno = d.deptno
    where 
        a.hiredate < b.hiredate;     


14.列出部門名稱和這些部門的員工信息,同時列出那些沒有員工的部門
    select 
        e.*,d.dname 
    from 


        emp e 
    right join 
        dept d 
    on 
        e.deptno = d.deptno;


15.列出至少有5個員工的所有部門
    select
        deptno
    from
        emp
    group by
        deptno
    having 
        count(*) >= 5;


16.列出薪水比“SMITH”多的所有員工
    select 
        ename,sal
    from 
        emp
    where
        sal > (select sal from emp where ename = 'SMITH');


17.列出最低薪水大於1500的各種工作及其從事此工作的全部雇員人數
    select 
        job,count(*)
    from
        emp
    group by
        job
    having 
        min(sal) > 1500;


18.列出在部門“SALES”<銷售部>工作的員工的姓名,假定不知道銷售部的部門編號 
    select 
        ename
    from 
        emp
    where
        deptno = (select deptno from dept where dname = 'SALES');


19.列出薪水高於公司平均薪水的所有員工,所在部門,上級領導,雇員的工資等級
    select
        e.ename '員工',d.dname,l.ename '領導',s.grade    
    from 
        emp e
    join 
        dept d
    on
        e.empno = d.deptno
    left join 
        emp l
    on
        e.mgr = l.empno
    join
        salgrade s
    on
        e.sal between s.losal and s.hisal
    where
        e.sal > (select avg(sal) from emp);


20.列出與“SCOTT”從事相同工作的所有員工及其部門名稱
    select 
        e.ename,e.job,d.dname
    from 
        emp e
    join 
        dept d
    on 
        e.deptno = d.deptno
    where
        e.job = (select job from emp where ename = 'SCOTT') 
    and e.name <> 'SCOTT';


21.列出薪水等於部門30中員工的薪水的其他員工的姓名和薪水
    select
        ename,sal
    from
        emp
    where
        sal in(select distinct sal from emp where deptno = 30) 
    and 
        deptno <> 30;


22.列出薪水高於在部門30工作的所有員工的薪水的員工姓名和薪水,部門名稱
    select
        e.ename,e.sal,d.dname
    from
        emp e
    join
        dept d
    on
        e.deptno = d,deptno
    where
        e.sal > (select max(sal) from emp where deptno = 30) ;


23.列出在每個部門工作的員工數量,平均工資和平均服務期限
    select
        d.deptno,
        count(e.ename) as ecount,
        ifnull(avg(e.sal),0) as avgsal,
        ifnull(avg(timestampdiff(YEAR,hiredate,now())),0) as avgtime
    from
        emp e
    right join
        dept d
    on
        e.deptno = d.deptno
    group by
        d.deptno;

    計算兩個時間間隔的函數,語法為:

    timestampdiff(間隔類型,前一個日期,后一個日期)
    返回日期間的整數差。
    FRAC_SECOND   表示間隔是毫秒
    SECOND   秒
    MINUTE   分鍾
    HOUR   小時
    DAY   天
    WEEK   星期
    MONTH   月
    QUARTER   季度
    YEAR   年


24.列出所有員工的姓名,部門名稱,和薪水
    select
        e.ename,d.dname,e.sal
    from
        emp e
    join
        dept d
    on
        e.deptno = d.deptno; 


25.列出所有部門的詳細信息和人數
    select 
        d.deptno,d.dname,d.loc,count(e.ename)
    from
        emp e
    join
        dept d
    on
        e.deptno = d.deptno
    group by
        d.deptno,d.name,d.loc;


26.列出各種工作的最低工資及從事此工作的雇員姓名
    select 
        e.ename,t.*
    from
        emp e
    join 
        (select job,min(sal) as minsal from emp group by job)t
    on
        e.job = t.job and e.sal = t.,minsal;


27.列出各個部門MANAGER(領導)的最低薪水
    select
        deptno,min(sal)
    from
        emp
    where
        job = 'MANAGER'
    group by
        deptno; 


28.列出所有員工的年工資,按年薪從低到高排序
    select 
        ename,(sal + ifnull(comm,0))*12 as yearsal
    from 
        emp
    order by
        yearsal asc;


29.求出員工領導薪水超過3000的員工名稱和領導
    select 
        a.ename '員工',b.ename '領導'
    from
        emp a
    join 
        emp b
    on 
        a.mgr = b.empno
    where
        b.sal > 3000;


30.求出部門名稱帶’S‘的部門員工的工資合計,部門人數
    select
        d.deptno,d.dname,d.loc,count(e.ename),ifnull(sum(e.sal),0) as sumsal
    from
        emp e
    right join
        dept d
    on
        e.deptno = d.deptno
    where 
        d.dname like '%S%'
    group by
        d.deptno,d.name,d.loc;


31.給任職日期超過30年的員工加薪 10%
    update 
        emp 
    set 
        sal= sal*1.1 where timestampdiff(YEAR,hiredate,now())>30;


試題出處:https://www.bilibili.com/video/BV1fx411X7BD?p=1

ps:博主少寫了3道喲!    ( •̀ ω •́ )✧


免責聲明!

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



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