1. 程式人生 > >mysql資料庫命令練習題及答案

mysql資料庫命令練習題及答案

1、查詢emp中最高薪水人的名字

2、查詢每個部門中的最高薪水人的名字和所在的部門編號

3、查詢薪水在平均薪水之上的僱員的名字

4、查詢僱員的名字和所在部門的名字

5、查詢薪水在在本部門平均薪水之上的僱員的名字

6、查詢每個員工的薪水的等級,員工的姓名

7、查詢每個部門的平均薪水的等級,部門的編號

8、查詢僱員的名字,所在部門的名字,工資的等級

9、查詢僱員的名字和其經理的名字

10、查詢僱員中是經理人的名字

11、查詢平均薪水最高的部門的編號和名稱

12、查詢薪水最高的前5名僱員編號,名稱,薪水

13、查詢薪水最高的第6名到第10名僱員編號,名稱,薪水

14、查詢部門的名字和部門的人數(如果部門裡沒有人數,顯示0個)

15、查詢員工的編號,工資和所在部門的平均工資

三個表的結構介紹:
三個表的結構介紹
三個表的建立語句:

/********************************部門表dept********************************/
/*建立表*/
DROP TABLE  IF EXISTS DEPT;  
CREATE TABLE DEPT(
    DEPTNO INT PRIMARY KEY,  
    DNAME VARCHAR(14) ,  
    LOC VARCHAR(13) 
);
/*插入資料*/
INSERT INTO DEPT VALUES  
(10,'ACCOUNTING'
,'NEW YORK'), (20,'RESEARCH','DALLAS'), (30,'SALES','CHICAGO'), (40,'OPERATIONS','BOSTON');
/*查詢資料*/ SELECT * FROM DEPT; /********************************員工表emp********************************/ /*建立表*/ DROP TABLE IF EXISTS EMP; CREATE TABLE EMP( EMPNO INT PRIMARY KEY, ENAME VARCHAR(14) , JOB VARCHAR
(9), MGR INT, HIREDATE DATE, SAL DECIMAL(7,2), COMM DECIMAL(7,2), DEPTNO int REFERENCES DEPT );
/*插入資料*/ INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20), (7499,'ALLEN','SALESMAN',7698,'1981-2-20',1600,300,30), (7521,'WARD','SALESMAN',7698,'1981-2-22',1250,500,30), (7566,'JONES','MANAGER',7839,'1981-4-2',2975,NULL,20), (7654,'MARTIN','SALESMAN',7698,'1981-9-28',1250,1400,30), (7698,'BLAKE','MANAGER',7839,'1981-5-1',2850,NULL,30), (7782,'CLARK','MANAGER',7839,'1981-6-9',2450,NULL,10), (7788,'SCOTT','ANALYST',7566,'1987-7-13',3000,NULL,20), (7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10), (7844,'TURNER','SALESMAN',7698,'1981-9-8',1500,0,30), (7876,'ADAMS','CLERK',7788,'1987-7-13',1100,NULL,20), (7900,'JAMES','CLERK',7698,'1981-12-3',950,NULL,30), (7902,'FORD','ANALYST',7566,'1981-12-3',3000,NULL,20), (7934,'MILLER','CLERK',7782,'1982-1-23',1300,NULL,10); /*查詢資料*/ SELECT * FROM EMP; /********************************工資等級表salgrade********************************/ /*建立表*/ DROP TABLE IF EXISTS SALGRADE; CREATE TABLE SALGRADE( GRADE INT PRIMARY KEY, LOSAL INT, HISAL INT ); /*插入資料*/ INSERT INTO SALGRADE VALUES (1,700,1200), (2,1201,1400), (3,1401,2000), (4,2001,3000), (5,3001,9999); /*查詢資料*/ SELECT * FROM SALGRADE;

答案:

/*1、查詢emp中最高薪水人的名字*/

    #1、查詢最高的薪水
    select max(sal) from EMP;

    #2、將1作為條件
    select 
        ename 
    from 
        EMP
    where 
        sal = (select max(sal) from EMP);
/*2、查詢每個部門中的最高薪水人的名字和所在的部門編號*/
    #1、各個部門的最高薪水
    select 
        max(sal),deptno from EMP
    group 
        by deptno;

    #2、將1的結果作為一個新的表,聯表查詢
    select 
        t1.ename,t1.deptno
    from 
        EMP t1
    inner join 
        (select max(sal) max_sal,deptno from EMP group by deptno) t2
    on 
        t1.deptno = t2.deptno and sal = t2.max_sal;
/*3、查詢薪水在平均薪水之上的僱員的名字*/
    select ename from EMP where sal >(select avg(sal) from EMP);
/*4、查詢僱員的名字和所在部門的名字*/
    select 
        t1.ename,t2.dname
    from 
        EMP t1,DEPT t2
    where 
        t1.deptno = t2.deptno;
/*5、查詢薪水在在本部門平均薪水之上的僱員的名字*/
    select 
        t1.ename,t1.deptno
    from 
        EMP t1
    inner join 
        (select avg(sal) avg_sal,deptno from EMP group by deptno) t2
    on t1.deptno = t2.deptno and sal > t2.avg_sal;
/*6、查詢每個員工的薪水的等級,員工的姓名*/
    select * from EMP;
    select * from SALGRADE;

    select t1.ename,t2.grade
    from EMP t1,SALGRADE t2
    where t1.sal between t2.losal and t2.hisal;
/*7、查詢每個部門的平均薪水的等級,部門的編號*/
    #1、各個部門的平均薪水
    select avg(sal),deptno from EMP group by deptno;
    #2、將1的結果當作一個表
    select
            t1.grade,t2.deptno
    from 
        SALGRADE t1,(select avg(sal) avg_sal,deptno from EMP group by deptno) t2
    where 
        t2.avg_sal between t1.losal and t1.hisal
/*8、查詢僱員的名字,所在部門的名字,工資的等級*/
    select t1.ename,t2.dname,t3.grade
    from 
        EMP t1,DEPT t2,SALGRADE t3
    where 
        t1.deptno = t2.deptno
    and
        t1.sal between t3.losal and t3.hisal;

    select t1.ename,t2.dname,t3.grade
    from 
        EMP t1
    inner join
        DEPT t2 
    on 
        t1.deptno = t2.deptno
    inner join
        SALGRADE t3
    on
        t1.sal between t3.losal and t3.hisal;
/*9、查詢僱員的名字和其經理的名字*/
    select employee.ename,employer.ename
    from EMP employer,EMP employee
    where employee.mgr = employer.empno;
/*10、查詢僱員中是經理人的名字*/
    #1、經理上的編號
    select distinct mgr from EMP;
    #2、將1當作條件
    select 
        ename
    from 
        EMP
    where 
        empno in(select distinct mgr from EMP);
/*11、查詢平均薪水最高的部門的編號和名稱*/
    #1、每個部門的平均薪水
    select avg(sal) avg_sal,deptno from EMP group by deptno;
    #2、求1表中的最高平均薪水
    select max(t.avg_sal) from (select avg(sal) avg_sal,deptno from EMP group by deptno) t
    #3、將2的結果當作條件
    select t1.deptno
    from (select avg(sal) avg_sal,deptno from EMP group by deptno) t1
    where t1.avg_sal = (select max(t2.avg_sal) from (select avg(sal) avg_sal,deptno from EMP group by deptno) t2)
    #4、將3作為條件
    select t.deptno,t.dname
    from DEPT t
    where deptno in (
        select t1.deptno
        from (select avg(sal) avg_sal,deptno from EMP group by deptno) t1
        where t1.avg_sal = (select max(t2.avg_sal) from (select avg(sal) avg_sal,deptno from EMP group by deptno) t2)
    );
/*12、查詢薪水最高的前5名僱員編號,名稱,薪水*/
    select empno,ename,sal
    from EMP 
    order by sal desc
    limit 5;
/*13、查詢薪水最高的第6名到第10名僱員編號,名稱,薪水*/
    select empno,ename,sal
    from EMP 
    order by sal desc
    limit 5,5;
/*14、查詢部門的名字和部門的人數(如果部門裡沒有人數,顯示0個)*/
    select 
        t1.dname,ifnull(t2.num,0)
    from 
        DEPT t1
    left join
        (select count(*) num,deptno from EMP group by deptno) t2
    on 
        t1.deptno = t2.deptno;
/*15、查詢員工的編號,工資和所在部門的平均工資*/
    select 
        empno,ename,sal,t2.deptno,(select avg(sal) from EMP t1 where t1.deptno = t2.deptno)
    from 
        EMP t2;

    select 
        empno,ename,sal,t2.deptno,t2.avg_sal 
    from 
        EMP t1
    inner join 
        (select avg(sal) avg_sal,deptno from EMP group by deptno) t2
    on 
        t1.deptno = t2.deptno;