MySQL作业题

2024-03-07 06:12
文章标签 mysql database 作业题

本文主要是介绍MySQL作业题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、取得每个部门最高薪水的人员名称

第一步:取得每个部门的最高薪水
select e.deptno, max(e.sal) as 'maxSal' from emp e group by e.deptno;
+--------+---------+
| deptno | maxSal  |
+--------+---------+
|     20 | 3000.00 |
|     30 | 2850.00 |
|     10 | 5000.00 |
+--------+---------+
3 rows in set (0.00 sec)第二步:将以上结果当做临时表t,t表和emp e表进行连接,条件是:t.deptno = e.deptno and t.maxSal = e.salselect e.ename, e.sal, d.dname, d.deptno
fromemp e
inner join (select e.deptno, max(e.sal) as 'maxSal' from emp e group by e.deptno) t
on(e.sal = t.maxSal) and (e.deptno = t.deptno)
inner joindept d
one.deptno = d.deptno
order bye.sal asc;解法二:
select e.ename, e.sal, d.dname, d.deptno
fromemp e
inner joindept d
one.deptno = d.deptno
where e.sal in (select max(e.sal) as 'maxSal' from emp e group by e.deptno)
order bye.sal asc;+-------+---------+------------+--------+
| ename | sal     | dname      | deptno |
+-------+---------+------------+--------+
| BLAKE | 2850.00 | SALES      |     30 |
| SCOTT | 3000.00 | RESEARCH   |     20 |
| FORD  | 3000.00 | RESEARCH   |     20 |
| KING  | 5000.00 | ACCOUNTING |     10 |
+-------+---------+------------+--------+
4 rows in set (0.00 sec)

二、那些人的薪水在部门平均薪水之上

第一步:找出每个部门的平均薪水
select e.deptno, avg(e.sal) as 'avgSal' from emp e group by e.deptno;
+--------+-------------+
| deptno | avgSal      |
+--------+-------------+
|     20 | 2175.000000 |
|     30 | 1566.666667 |
|     10 | 2916.666667 |
+--------+-------------+第二步:将以上查询的结果当做t表,t和emp表连接
条件:部门编号相同,并且emp的sal大于t表的avgSal
select e.ename as '员工名', e.sal as '员工薪资', d.dname as '部门名称', d.deptno as '部门编号', t.avgSal as '部门平均薪资'
fromemp e
inner join (select e.deptno, avg(e.sal) as 'avgSal' from emp e group by e.deptno) as t
one.deptno = t.deptno
inner joindept d
one.deptno = d.deptno
wheree.sal > t.avgSal
order byd.dname asc;+--------+----------+------------+----------+--------------+
| 员工名 | 员工薪资 | 部门名称   | 部门编号 | 部门平均薪资 |
+--------+----------+------------+----------+--------------+
| KING   |  5000.00 | ACCOUNTING |       10 |  2916.666667 |
| JONES  |  2975.00 | RESEARCH   |       20 |  2175.000000 |
| SCOTT  |  3000.00 | RESEARCH   |       20 |  2175.000000 |
| FORD   |  3000.00 | RESEARCH   |       20 |  2175.000000 |
| ALLEN  |  1600.00 | SALES      |       30 |  1566.666667 |
| BLAKE  |  2850.00 | SALES      |       30 |  1566.666667 |
+--------+----------+------------+----------+--------------+
6 rows in set (0.00 sec)

三、取得部门中(所有人的)平均的薪水等级

select d.deptno as '部门编号', max(d.dname) as '部门名称', avg(s.grade) as '平均的薪资等级'
fromemp e
inner join salgrade s
one.sal between s.losal and s.hisal
inner joindept d
one.deptno = d.deptno
group bye.deptno
order byd.deptno asc;+----------+------------+----------------+
| 部门编号 | 部门名称   | 平均的薪资等级 |
+----------+------------+----------------+
|       10 | ACCOUNTING |         3.6667 |
|       20 | RESEARCH   |         2.8000 |
|       30 | SALES      |         2.5000 |
+----------+------------+----------------+
3 rows in set (0.01 sec)

四、不准用组函数(max),取得最高薪水(给出两种解决方案)

第一种方法:
select e.ename, e.sal 
from emp e 
order by e.sal desc 
limit 1;+-------+---------+
| ename | sal     |
+-------+---------+
| KING  | 5000.00 |
+-------+---------+
1 row in set (0.00 sec)第二种方法:表的自连接第一步:只会筛选出除最大值以外的所有数据
select distinct a.sal from emp a inner join emp b on a.sal < b.sal;
+---------+
| sal     |
+---------+
|  800.00 |
|  950.00 |
| 1100.00 |
| 1250.00 |
| 1300.00 |
| 1500.00 |
| 1600.00 |
| 2450.00 |
| 2850.00 |
| 2975.00 |
| 3000.00 |
+---------+
11 rows in set (0.00 sec)第二步:采取子查询语法
select e.ename, e.sal
fromemp e
where e.sal not in (select distinct a.sal from emp a inner join emp b on a.sal < b.sal);+-------+---------+
| ename | sal     |
+-------+---------+
| KING  | 5000.00 |
+-------+---------+
1 row in set (0.00 sec)

五、取得平均薪水最高的部门的部门编号及部门名称

第一种方案:使用limit取第一个

第一步:找出每个部门的平均薪水
select e.deptno, avg(e.sal) as 'avgSal'
fromemp e
group bye.deptno;
+--------+-------------+
| deptno | avgSal      |
+--------+-------------+
|     20 | 2175.000000 |
|     30 | 1566.666667 |
|     10 | 2916.666667 |
+--------+-------------+
3 rows in set (0.00 sec)第二步:降序选第一个
select d.deptno as '部门编号', max(d.dname) as '部门名称', avg(e.sal) as '平均薪资'
from emp e 
inner joindept d
one.deptno = d.deptno
group by e.deptno
order by平均薪资 desc
limit1;
+----------+------------+-------------+
| 部门编号 | 部门名称   | 平均薪资    |
+----------+------------+-------------+
|       10 | ACCOUNTING | 2916.666667 |
+----------+------------+-------------+
1 row in set (0.00 sec)

第二种方案:使用max取最大值

第一步:找出每个部门中平均薪水的最大值
select max(t.avgSal) from (select avg(e.sal) as 'avgSal' from emp e group by e.deptno) as t;
+---------------+
| max(t.avgSal) |
+---------------+
|   2916.666667 |
+---------------+select e.deptno as '部门编号', max(d.dname) as '部门名称', avg(e.sal) as '平均薪资'
fromemp e
inner joindept d
one.deptno = d.deptno
group bye.deptno
havingavg(e.sal) = (select max(t.avgSal) from (select avg(e.sal) as 'avgSal' from emp e group by e.deptno) as t);
+----------+------------+-------------+
| 部门编号 | 部门名称   | 平均薪资    |
+----------+------------+-------------+
|       10 | ACCOUNTING | 2916.666667 |
+----------+------------+-------------+

六、求平均薪水的等级最低的部门的部门名称

平均薪水是最低的,则等级一定是最低的

平均薪水不是最低的,也有可能等级是最低的,因为薪水等级的范围是一个区间

也就是说,平均薪水的等级最低的部门有可能有多个

平均薪水是800

平均薪水是900

则这两个都是1级别

第一步:找出每个部门的平均薪水
select e.deptno, avg(e.sal) as 'avgSal' from emp e group by e.deptno;
+--------+-------------+
| deptno | avgSal      |
+--------+-------------+
|     20 | 2175.000000 |
|     30 | 1566.666667 |
|     10 | 2916.666667 |
+--------+-------------+
3 rows in set (0.00 sec)第二步:找出每个部门的平均薪水的等级
以上t表和salgrade表连接,条件:t.avgSal between s.losal and s.hisalselect d.deptno, d.dname, t.avgSal, s.grade
fromdept d
inner join(select e.deptno, avg(e.sal) as 'avgSal' from emp e group by e.deptno) as t
ond.deptno = t.deptno
inner join salgrade s
ont.avgSal between s.losal and s.hisal
order bys.grade asc;
+--------+------------+-------------+-------+
| deptno | dname      | avgSal      | grade |
+--------+------------+-------------+-------+
|     30 | SALES      | 1566.666667 |     3 |
|     20 | RESEARCH   | 2175.000000 |     4 |
|     10 | ACCOUNTING | 2916.666667 |     4 |
+--------+------------+-------------+-------+
3 rows in set (0.00 sec)平均薪水最低的对应的等级一定是最低的
找出最低的平均薪水值
select avg(e.sal) as 'avgSal' from emp e group by e.deptno order by avgSal asc limit 1;
+-------------+
| avgSal      |
+-------------+
| 1566.666667 |
+-------------+
1 row in set (0.00 sec)找出最低平均薪水值对应的薪资等级
select s.grade from salgrade s where (select avg(e.sal) as 'avgSal' from emp e group by e.deptno order by avgSal asc limit 1) between s.losal and s.hisal;
+-------+
| grade |
+-------+
|     3 |
+-------+
1 row in set (0.01 sec)在加where条件,最终为:
select d.deptno, d.dname, t.avgSal, s.grade
fromdept d
inner join(select e.deptno, avg(e.sal) as 'avgSal' from emp e group by e.deptno) as t
ond.deptno = t.deptno
inner join salgrade s
ont.avgSal between s.losal and s.hisal
where s.grade = (select s.grade from salgrade s where (select avg(e.sal) as 'avgSal' from emp e group by e.deptno order by avgSal asc limit 1) between s.losal and s.hisal)
order byd.deptno;
+--------+-------+-------------+-------+
| deptno | dname | avgSal      | grade |
+--------+-------+-------------+-------+
|     30 | SALES | 1566.666667 |     3 |
+--------+-------+-------------+-------+
1 row in set (0.00 sec)

七、取得比普通员工(员工代码没有在mgr字段上出现的)的最高薪水还要高的领导人姓名

比普通员工最高薪水还要高的员工一定是领导,但是领导的薪水不一定高于普通员工的最高薪水

第一步:找出领导的员工编号
select distinct e.mgr from emp e;
+------+
| mgr  |
+------+
| 7902 |
| 7698 |
| 7839 |
| 7566 |
| NULL |
| 7788 |
| 7782 |
+------+
7 rows in set (0.00 sec)员工编号没有在以上范围内的都是普通员工not in在使用的时候,后面小括号中记得排除NULLselect distinct e.mgr from emp e where e.mgr is not null;
+------+
| mgr  |
+------+
| 7902 |
| 7698 |
| 7839 |
| 7566 |
| 7788 |
| 7782 |
+------+
6 rows in set (0.00 sec)第二步:找出普通员工的最高薪水
select max(e.sal) from emp e where e.empno not in (select distinct e.mgr from emp e where e.mgr is not null);
+------------+
| max(e.sal) |
+------------+
|    1600.00 |
+------------+
1 row in set (0.00 sec)第三步:找出薪水大于1600的领导
select e.empno, e.ename, e.sal
fromemp e
where e.sal > (select max(e.sal) from emp e where e.empno not in (select distinct e.mgr from emp e where e.mgr is not null));
+-------+-------+---------+
| empno | ename | sal     |
+-------+-------+---------+
|  7566 | JONES | 2975.00 |
|  7698 | BLAKE | 2850.00 |
|  7782 | CLARK | 2450.00 |
|  7788 | SCOTT | 3000.00 |
|  7839 | KING  | 5000.00 |
|  7902 | FORD  | 3000.00 |
+-------+-------+---------+
6 rows in set (0.00 sec)
select e.empno, e.ename, e.sal 
from emp e 
where e.sal > (select max(e.sal) from emp e where e.empno not in (select distinct ifnull(e.mgr, 0) from emp e));
+-------+-------+---------+
| empno | ename | sal     |
+-------+-------+---------+
|  7566 | JONES | 2975.00 |
|  7698 | BLAKE | 2850.00 |
|  7782 | CLARK | 2450.00 |
|  7788 | SCOTT | 3000.00 |
|  7839 | KING  | 5000.00 |
|  7902 | FORD  | 3000.00 |
+-------+-------+---------+
6 rows in set (0.00 sec)

八、取得薪水最高的前五名员工

select e.empno, e.ename, e.sal
fromemp e
order bye.sal desc
limit5;
+-------+-------+---------+
| empno | ename | sal     |
+-------+-------+---------+
|  7839 | KING  | 5000.00 |
|  7788 | SCOTT | 3000.00 |
|  7902 | FORD  | 3000.00 |
|  7566 | JONES | 2975.00 |
|  7698 | BLAKE | 2850.00 |
+-------+-------+---------+
5 rows in set (0.00 sec)

九、取得薪水最高的第六到第十名员工

select e.empno, e.ename, e.sal
fromemp e
order bye.sal desc
limit5, 5;
+-------+--------+---------+
| empno | ename  | sal     |
+-------+--------+---------+
|  7782 | CLARK  | 2450.00 |
|  7499 | ALLEN  | 1600.00 |
|  7844 | TURNER | 1500.00 |
|  7934 | MILLER | 1300.00 |
|  7521 | WARD   | 1250.00 |
+-------+--------+---------+
5 rows in set (0.00 sec)

十、取得最后入职的5名员工

日期也可以降序,升序排序

select e.ename, e.hiredate
fromemp e
order bye.hiredate desc
limit0, 5;
+--------+------------+
| ename  | hiredate   |
+--------+------------+
| ADAMS  | 1987-05-23 |
| SCOTT  | 1987-04-19 |
| MILLER | 1982-01-23 |
| JAMES  | 1981-12-03 |
| FORD   | 1981-12-03 |
+--------+------------+
5 rows in set (0.00 sec)

 十一、取得每个薪水等级有多少个员工

第一步:找出每个员工的薪资等级
select e.ename, e.sal, s.grade
fromemp e
inner joinsalgrade s
one.sal between s.losal and s.hisal;
+--------+---------+-------+
| ename  | sal     | grade |
+--------+---------+-------+
| SMITH  |  800.00 |     1 |
| ALLEN  | 1600.00 |     3 |
| WARD   | 1250.00 |     2 |
| JONES  | 2975.00 |     4 |
| MARTIN | 1250.00 |     2 |
| BLAKE  | 2850.00 |     4 |
| CLARK  | 2450.00 |     4 |
| SCOTT  | 3000.00 |     4 |
| KING   | 5000.00 |     5 |
| TURNER | 1500.00 |     3 |
| ADAMS  | 1100.00 |     1 |
| JAMES  |  950.00 |     1 |
| FORD   | 3000.00 |     4 |
| MILLER | 1300.00 |     2 |
+--------+---------+-------+
14 rows in set (0.00 sec)第二步:继续分组统计每个薪资等级的员工数量
select s.grade, count(*)
fromemp e
inner joinsalgrade s
one.sal between s.losal and s.hisal
group bys.grade
order bys.grade asc;
+-------+----------+
| grade | count(*) |
+-------+----------+
|     1 |        3 |
|     2 |        3 |
|     3 |        2 |
|     4 |        5 |
|     5 |        1 |
+-------+----------+
5 rows in set (0.00 sec)

十二、列出所有员工及领导的名字

select e.ename as '员工名', t.ename as '领导名'
fromemp e
left outer joinemp t
one.mgr = t.empno;
+--------+--------+
| 员工名  | 领导名 |
+--------+--------+
| SMITH  | FORD   |
| ALLEN  | BLAKE  |
| WARD   | BLAKE  |
| JONES  | KING   |
| MARTIN | BLAKE  |
| BLAKE  | KING   |
| CLARK  | KING   |
| SCOTT  | JONES  |
| KING   | NULL   |
| TURNER | BLAKE  |
| ADAMS  | SCOTT  |
| JAMES  | BLAKE  |
| FORD   | JONES  |
| MILLER | CLARK  |
+--------+--------+
14 rows in set (0.01 sec)

十三、列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称

emp a 员工表
emp b 领导表
连接条件:a.mgr = b.empno and a.hiredate < b.hiredateselect a.empno, a.ename '员工', d.dname, a.hiredate, b.ename '领导', b.hiredate
from emp a
left outer joinemp b
ona.mgr = b.empno 
inner joindept d
ona.deptno = d.deptno
wherea.hiredate < b.hiredate
order bya.ename asc;
+-------+-------+------------+------------+-------+------------+
| empno | 员工  | dname      | hiredate   | 领导  | hiredate   |
+-------+-------+------------+------------+-------+------------+
|  7499 | ALLEN | SALES      | 1981-02-20 | BLAKE | 1981-05-01 |
|  7698 | BLAKE | SALES      | 1981-05-01 | KING  | 1981-11-17 |
|  7782 | CLARK | ACCOUNTING | 1981-06-09 | KING  | 1981-11-17 |
|  7566 | JONES | RESEARCH   | 1981-04-02 | KING  | 1981-11-17 |
|  7369 | SMITH | RESEARCH   | 1980-12-17 | FORD  | 1981-12-03 |
|  7521 | WARD  | SALES      | 1981-02-22 | BLAKE | 1981-05-01 |
+-------+-------+------------+------------+-------+------------+
6 rows in set (0.00 sec)
select e.ename as 'staff', t.ename as 'leader' from emp e left outer join emp t on e.mgr = t.empno order by staff;+--------+--------+
| staff  | leader |
+--------+--------+
| ADAMS  | SCOTT  |
| ALLEN  | BLAKE  |
| BLAKE  | KING   |
| CLARK  | KING   |
| FORD   | JONES  |
| JAMES  | BLAKE  |
| JONES  | KING   |
| KING   | NULL   |
| MARTIN | BLAKE  |
| MILLER | CLARK  |
| SCOTT  | JONES  |
| SMITH  | FORD   |
| TURNER | BLAKE  |
| WARD   | BLAKE  |
+--------+--------+
14 rows in set (0.00 sec)selectdistinct e.empno, t.staff, d.dname
from(select e.ename as 'staff', t.ename as 'leader' from emp e left outer join emp t on e.mgr = t.empno) t
inner joinemp e
on(select e.hiredate from emp e where e.ename = t.staff) < (select e.hiredate from emp e where e.ename = t.leader) and t.staff = e.ename
inner join dept d
one.deptno = d.deptno
order byt.staff asc;
+-------+-------+------------+
| empno | staff | dname      |
+-------+-------+------------+
|  7499 | ALLEN | SALES      |
|  7698 | BLAKE | SALES      |
|  7782 | CLARK | ACCOUNTING |
|  7566 | JONES | RESEARCH   |
|  7369 | SMITH | RESEARCH   |
|  7521 | WARD  | SALES      |
+-------+-------+------------+
6 rows in set (0.00 sec)

十四、列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门

selectd.dname, e.ename
fromdept d
left outer joinemp e
ond.deptno = e.deptno;
+------------+--------+
| dname      | ename  |
+------------+--------+
| ACCOUNTING | MILLER |
| ACCOUNTING | KING   |
| ACCOUNTING | CLARK  |
| RESEARCH   | FORD   |
| RESEARCH   | ADAMS  |
| RESEARCH   | SCOTT  |
| RESEARCH   | JONES  |
| RESEARCH   | SMITH  |
| SALES      | JAMES  |
| SALES      | TURNER |
| SALES      | BLAKE  |
| SALES      | MARTIN |
| SALES      | WARD   |
| SALES      | ALLEN  |
| OPERATIONS | NULL   |
+------------+--------+
15 rows in set (0.00 sec)

十五、列出至少有5个员工的所有部门

selectmax(d.deptno) as '部门编号', d.dname as '部门名称', count(e.ename) as '部门人数'
fromdept d
left outer joinemp e
ond.deptno = e.deptno
group byd.dname
havingcount(e.ename) >= 5
order by部门人数 asc;
+----------+----------+----------+
| 部门编号 | 部门名称 | 部门人数 |
+----------+----------+----------+
|       20 | RESEARCH |        5 |
|       30 | SALES    |        6 |
+----------+----------+----------+
2 rows in set (0.00 sec)

十六、列出薪资比“SMITH”多的所有员工信息

selecte.ename, e.sal 
fromemp e
wheree.sal > (select e.sal from emp e where e.ename = 'SMITH');
+--------+---------+
| ename  | sal     |
+--------+---------+
| ALLEN  | 1600.00 |
| WARD   | 1250.00 |
| JONES  | 2975.00 |
| MARTIN | 1250.00 |
| BLAKE  | 2850.00 |
| CLARK  | 2450.00 |
| SCOTT  | 3000.00 |
| KING   | 5000.00 |
| TURNER | 1500.00 |
| ADAMS  | 1100.00 |
| JAMES  |  950.00 |
| FORD   | 3000.00 |
| MILLER | 1300.00 |
+--------+---------+
13 rows in set (0.00 sec)

十七、列出所有“clerk”(办事员)的姓名及其部门名称,部门的人数

第一步:先求出每个部门的人数
select d.dname, count(e.ename) from dept d left outer join emp e on d.deptno = e.deptno group by d.dname;
+------------+----------------+
| dname      | count(e.ename) |
+------------+----------------+
| ACCOUNTING |              3 |
| RESEARCH   |              5 |
| SALES      |              6 |
| OPERATIONS |              0 |
+------------+----------------+
4 rows in set (0.00 sec)第二步:进行内连接
selecte.ename, e.job, d.dname, t.num
fromemp e
inner joindept d
one.deptno = d.deptno
inner join(select d.dname, count(e.ename) as 'num' from dept d left outer join emp e on d.deptno = e.deptno group by d.dname) as t
ond.dname = t.dname
wheree.job = 'CLERK';
+--------+-------+------------+-----+
| ename  | job   | dname      | num |
+--------+-------+------------+-----+
| SMITH  | CLERK | RESEARCH   |   5 |
| ADAMS  | CLERK | RESEARCH   |   5 |
| JAMES  | CLERK | SALES      |   6 |
| MILLER | CLERK | ACCOUNTING |   3 |
+--------+-------+------------+-----+
4 rows in set (0.01 sec)

十八、列出最低薪资大于1500的各种工作及从事此工作的全部员工人数

第一种方法:

selecte.job, count(e.ename)
fromemp e
group bye.job
havingmin(e.sal) > 1500;
+-----------+----------------+
| job       | count(e.ename) |
+-----------+----------------+
| MANAGER   |              3 |
| ANALYST   |              2 |
| PRESIDENT |              1 |
+-----------+----------------+
3 rows in set (0.00 sec)

第二种方法:

第一步:找出最低薪资大于1500的岗位
select e.job, min(e.sal) as 'minSal'
fromemp e
group bye.job
havingmin(e.sal) > 1500;
+-----------+---------+
| job       | minSal  |
+-----------+---------+
| MANAGER   | 2450.00 |
| ANALYST   | 3000.00 |
| PRESIDENT | 5000.00 |
+-----------+---------+
3 rows in set (0.00 sec)第二步:进行子查询
selecte.job, count(*)
fromemp e
wheree.job in (select e.jobfromemp egroup bye.jobhavingmin(e.sal) > 1500)
group bye.job;
+-----------+----------+
| job       | count(*) |
+-----------+----------+
| MANAGER   |        3 |
| ANALYST   |        2 |
| PRESIDENT |        1 |
+-----------+----------+
3 rows in set (0.00 sec)

十九、列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号

第一种方法:

selecte.ename, d.dname
fromemp e
inner joindept d
one.deptno = d.deptno
whered.dname = 'SALES';
+--------+-------+
| ename  | dname |
+--------+-------+
| ALLEN  | SALES |
| WARD   | SALES |
| MARTIN | SALES |
| BLAKE  | SALES |
| TURNER | SALES |
| JAMES  | SALES |
+--------+-------+
6 rows in set (0.00 sec)

第二种方法:

selecte.ename
fromemp e
wheree.deptno = (select d.deptno from dept d where d.dname = 'SALES');
+--------+
| ename  |
+--------+
| ALLEN  |
| WARD   |
| MARTIN |
| BLAKE  |
| TURNER |
| JAMES  |
+--------+
6 rows in set (0.01 sec)

二十、列出薪资高于公司平均薪水的所有员工,所在部门,上级领导,雇员的工资等级

第一步:求公司平均薪资
selectavg(e.sal)
fromemp e;
+-------------+
| avg(e.sal)  |
+-------------+
| 2073.214286 |
+-------------+
1 row in set (0.01 sec)selecte.ename as '员工名', d.dname as '部门名称', t.ename as '领导名', e.sal as '薪资', s.grade as '薪资等级'
fromemp e
inner joindept d
one.deptno = d.deptno
left outer joinemp t
one.mgr = t.empno
inner joinsalgrade s
one.sal between s.losal and s.hisal
wheree.sal > (selectavg(e.sal)fromemp e);
+--------+------------+--------+---------+----------+
| 员工名 | 部门名称   | 领导名 | 薪资    | 薪资等级 |
+--------+------------+--------+---------+----------+
| FORD   | RESEARCH   | JONES  | 3000.00 |        4 |
| SCOTT  | RESEARCH   | JONES  | 3000.00 |        4 |
| CLARK  | ACCOUNTING | KING   | 2450.00 |        4 |
| BLAKE  | SALES      | KING   | 2850.00 |        4 |
| JONES  | RESEARCH   | KING   | 2975.00 |        4 |
| KING   | ACCOUNTING | NULL   | 5000.00 |        5 |
+--------+------------+--------+---------+----------+
6 rows in set (0.00 sec)

二十一、列出与“SCOTT”从事相同工作的所有员工及部门名称

select e.job
fromemp e
wheree.ename = 'SCOTT';
+---------+
| job     |
+---------+
| ANALYST |
+---------+
1 row in set (0.00 sec)select    e.ename, e.job, d.dname
fromemp e
inner joindept d
one.deptno = d.deptno
wheree.job = (select e.jobfromemp ewheree.ename = 'SCOTT')
ande.ename != 'SCOTT';
+-------+---------+----------+
| ename | job     | dname    |
+-------+---------+----------+
| FORD  | ANALYST | RESEARCH |
+-------+---------+----------+
1 row in set (0.00 sec)

二十二、列出薪资等于部门30中员工的薪资的其他员工的姓名和薪资

第一种写法:

select*
fromemp e
wheree.deptno = 30;
+-------+--------+----------+------+------------+---------+---------+--------+
| EMPNO | ENAME  | JOB      | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
+-------+--------+----------+------+------------+---------+---------+--------+
|  7499 | ALLEN  | SALESMAN | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7521 | WARD   | SALESMAN | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7698 | BLAKE  | MANAGER  | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7900 | JAMES  | CLERK    | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
+-------+--------+----------+------+------------+---------+---------+--------+
6 rows in set (0.00 sec)select*
fromemp e
where e.sal in (select e.sal from emp e where e.deptno = 30)
ande.ename not in (select e.ename from emp e where e.deptno = 30);Empty set (0.02 sec)

第二种写法:

selecte.ename, e.sal
fromemp e
wheree.sal in (select distinct e.sal from emp e where e.deptno = 30)
ande.deptno != 30;Empty set (0.00 sec)

二十三、列出薪资高于在部门30工作的所有员工的薪资的员工姓名和薪资,部门名称

第一步:找出在30部门工作的所有员工的最高薪资
select max(e.sal)
fromemp e
wheree.deptno = 30;
+------------+
| max(e.sal) |
+------------+
|    2850.00 |
+------------+
1 row in set (0.00 sec)第二步:找出高于该薪资的员工和部门名称
select e.ename as '姓名', d.dname as '部门名称'
fromemp e
inner joindept d
one.deptno = d.deptno
wheree.sal > (select max(e.sal)fromemp ewheree.deptno = 30);
+-------+------------+
| 姓名  | 部门名称   |
+-------+------------+
| JONES | RESEARCH   |
| SCOTT | RESEARCH   |
| FORD  | RESEARCH   |
| KING  | ACCOUNTING |
+-------+------------+
4 rows in set (0.00 sec)

二十四、列出在每个部门工作的员工数量,平均工资和平均服务期限

selectd.deptno, max(d.dname), count(e.ename), avg(e.sal)
fromdept d
left outer joinemp e
ond.deptno = e.deptno
group byd.deptno;
+--------+--------------+----------------+-------------+
| deptno | max(d.dname) | count(e.ename) | avg(e.sal)  |
+--------+--------------+----------------+-------------+
|     10 | ACCOUNTING   |              3 | 2916.666667 |
|     20 | RESEARCH     |              5 | 2175.000000 |
|     30 | SALES        |              6 | 1566.666667 |
|     40 | OPERATIONS   |              0 |        NULL |
+--------+--------------+----------------+-------------+
4 rows in set (0.00 sec)selectd.deptno as '部门编号', d.dname as '部门名称', d.loc as '部门地址', count(e.ename) as '部门人数', ifnull(avg(e.sal), 0) as '平均薪资'
fromdept d
left outer joinemp e
ond.deptno = e.deptno
group byd.deptno, d.dname, d.loc;
+----------+------------+----------+----------+-------------+
| 部门编号 | 部门名称   | 部门地址 | 部门人数 | 平均薪资    |
+----------+------------+----------+----------+-------------+
|       10 | ACCOUNTING | NEW YORK |        3 | 2916.666667 |
|       20 | RESEARCH   | DALLAS   |        5 | 2175.000000 |
|       30 | SALES      | CHICAGO  |        6 | 1566.666667 |
|       40 | OPERATIONS | BOSTON   |        0 |    0.000000 |
+----------+------------+----------+----------+-------------+
4 rows in set (0.00 sec)select d.deptno as '部门编号', d.dname as '部门名称', count(e.ename) as '部门员工数', ifnull(avg(e.sal), 0) as '平均薪资', ifnull(avg(timestampdiff(year, e.hiredate, now())), 0) as '平均服务期限'
fromdept d
left outer joinemp e
ond.deptno = e.deptno
group byd.deptno, d.dname;
+----------+------------+------------+-------------+--------------+
| 部门编号 | 部门名称   | 部门员工数 | 平均薪资    | 平均服务期限 |
+----------+------------+------------+-------------+--------------+
|       10 | ACCOUNTING |          3 | 2916.666667 |      41.3333 |
|       20 | RESEARCH   |          5 | 2175.000000 |      39.4000 |
|       30 | SALES      |          6 | 1566.666667 |      41.8333 |
|       40 | OPERATIONS |          0 |    0.000000 |       0.0000 |
+----------+------------+------------+-------------+--------------+
4 rows in set (0.00 sec)

二十五、列出所有员工的姓名,部门名称和工资

selecte.ename, d.dname, e.sal
fromemp e
inner joindept d
one.deptno = d.deptno;
+--------+------------+---------+
| ename  | dname      | sal     |
+--------+------------+---------+
| SMITH  | RESEARCH   |  800.00 |
| ALLEN  | SALES      | 1600.00 |
| WARD   | SALES      | 1250.00 |
| JONES  | RESEARCH   | 2975.00 |
| MARTIN | SALES      | 1250.00 |
| BLAKE  | SALES      | 2850.00 |
| CLARK  | ACCOUNTING | 2450.00 |
| SCOTT  | RESEARCH   | 3000.00 |
| KING   | ACCOUNTING | 5000.00 |
| TURNER | SALES      | 1500.00 |
| ADAMS  | RESEARCH   | 1100.00 |
| JAMES  | SALES      |  950.00 |
| FORD   | RESEARCH   | 3000.00 |
| MILLER | ACCOUNTING | 1300.00 |
+--------+------------+---------+
14 rows in set (0.00 sec)

二十六、列出所有部门的详细信息和人数

selectd.deptno '部门编号', d.dname '部门名称', d.loc '部门地址', count(e.ename) '部门人数'
fromdept d
left outer joinemp e
ond.deptno = e.deptno
group byd.deptno, d.dname, d.loc;+----------+------------+----------+----------+
| 部门编号 | 部门名称   | 部门地址 | 部门人数 |
+----------+------------+----------+----------+
|       10 | ACCOUNTING | NEW YORK |        3 |
|       20 | RESEARCH   | DALLAS   |        5 |
|       30 | SALES      | CHICAGO  |        6 |
|       40 | OPERATIONS | BOSTON   |        0 |
+----------+------------+----------+----------+
4 rows in set (0.00 sec)

二十七、列出各种工作的最低工资及从事此工作的员工姓名

selecte.job, min(e.sal)
fromemp e
group bye.job;
+-----------+------------+
| job       | min(e.sal) |
+-----------+------------+
| CLERK     |     800.00 |
| SALESMAN  |    1250.00 |
| MANAGER   |    2450.00 |
| ANALYST   |    3000.00 |
| PRESIDENT |    5000.00 |
+-----------+------------+
5 rows in set (0.01 sec)selecte.ename, t.*
fromemp e
inner join(selecte.job, min(e.sal) as 'minSal'fromemp egroup bye.job) as t
one.job = t.job 
ande.sal = t.minSal;
+--------+-----------+---------+
| ename  | job       | minSal  |
+--------+-----------+---------+
| SMITH  | CLERK     |  800.00 |
| WARD   | SALESMAN  | 1250.00 |
| MARTIN | SALESMAN  | 1250.00 |
| CLARK  | MANAGER   | 2450.00 |
| SCOTT  | ANALYST   | 3000.00 |
| KING   | PRESIDENT | 5000.00 |
| FORD   | ANALYST   | 3000.00 |
+--------+-----------+---------+
7 rows in set (0.01 sec)

二十八、列出各个部门的“MANAGER”(领导)的最低薪资

selecte.deptno, e.ename, e.job, min(e.sal)
fromemp e
wheree.job = 'MANAGER'
group bye.deptno, e.ename, e.job;
+--------+-------+---------+------------+
| deptno | ename | job     | min(e.sal) |
+--------+-------+---------+------------+
|     20 | JONES | MANAGER |    2975.00 |
|     30 | BLAKE | MANAGER |    2850.00 |
|     10 | CLARK | MANAGER |    2450.00 |
+--------+-------+---------+------------+
3 rows in set (0.00 sec)

二十九、列出所有员工的年工资,按年薪从低到高排序

selecte.ename, (e.sal + ifnull(e.comm, 0)) * 12 as 'yearsal'
fromemp e
order byyearsal asc;+--------+----------+
| ename  | yearsal  |
+--------+----------+
| SMITH  |  9600.00 |
| JAMES  | 11400.00 |
| ADAMS  | 13200.00 |
| MILLER | 15600.00 |
| TURNER | 18000.00 |
| WARD   | 21000.00 |
| ALLEN  | 22800.00 |
| CLARK  | 29400.00 |
| MARTIN | 31800.00 |
| BLAKE  | 34200.00 |
| JONES  | 35700.00 |
| SCOTT  | 36000.00 |
| FORD   | 36000.00 |
| KING   | 60000.00 |
+--------+----------+
14 rows in set (0.00 sec)

三十、求出员工领导的薪水超过3000的员工名称及领导名称

selecta.ename '员工名', a.sal '员工薪资', b.ename '领导名', b.sal '领导薪资'
fromemp a
left outer joinemp b
ona.mgr = b.empno
whereb.sal > 3000;
+--------+----------+--------+----------+
| 员工名 | 员工薪资 | 领导名 | 领导薪资 |
+--------+----------+--------+----------+
| JONES  |  2975.00 | KING   |  5000.00 |
| BLAKE  |  2850.00 | KING   |  5000.00 |
| CLARK  |  2450.00 | KING   |  5000.00 |
+--------+----------+--------+----------+
3 rows in set (0.03 sec)

三十一、求出部门名称中带“S”字符的部门员工的工资合计,部门人数

selectd.deptno '部门编号', d.dname '部门名称', ifnull(sum(e.sal), 0) '工资合计', count(e.ename) '部门人数'
fromdept d
left outer joinemp e
ond.deptno = e.deptno
whered.dname like '%S%'
group byd.deptno, d.dname;+----------+------------+----------+----------+
| 部门编号 | 部门名称   | 工资合计 | 部门人数 |
+----------+------------+----------+----------+
|       20 | RESEARCH   | 10875.00 |        5 |
|       30 | SALES      |  9400.00 |        6 |
|       40 | OPERATIONS |     0.00 |        0 |
+----------+------------+----------+----------+
3 rows in set (0.00 sec)

三十二、给任职日期超过30年的员工加薪10%

selecte.ename '姓名', e.sal '当前薪资', timestampdiff(year, e.hiredate, now()) '任职年限', e.sal * 1.1 '调整后薪资'
fromemp e
wheretimestampdiff(year, e.hiredate, now()) > 30;
+--------+----------+----------+------------+
| 姓名   | 当前薪资 | 任职年限 | 调整后薪资 |
+--------+----------+----------+------------+
| SMITH  |   800.00 |       42 |     880.00 |
| ALLEN  |  1600.00 |       42 |    1760.00 |
| WARD   |  1250.00 |       42 |    1375.00 |
| JONES  |  2975.00 |       42 |    3272.50 |
| MARTIN |  1250.00 |       42 |    1375.00 |
| BLAKE  |  2850.00 |       42 |    3135.00 |
| CLARK  |  2450.00 |       42 |    2695.00 |
| SCOTT  |  3000.00 |       36 |    3300.00 |
| KING   |  5000.00 |       41 |    5500.00 |
| TURNER |  1500.00 |       42 |    1650.00 |
| ADAMS  |  1100.00 |       36 |    1210.00 |
| JAMES  |   950.00 |       41 |    1045.00 |
| FORD   |  3000.00 |       41 |    3300.00 |
| MILLER |  1300.00 |       41 |    1430.00 |
+--------+----------+----------+------------+
14 rows in set (0.00 sec)

这篇关于MySQL作业题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/782598

相关文章

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key:

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

Java 连接Sql sever 2008

Java 连接Sql sever 2008 /Sql sever 2008 R2 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class TestJDBC

Mysql BLOB类型介绍

BLOB类型的字段用于存储二进制数据 在MySQL中,BLOB类型,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储的大小不同。 TinyBlob 最大 255 Blob 最大 65K MediumBlob 最大 16M LongBlob 最大 4G