练习题
(1)、取得每个部门最高薪水的人员名称
第一步: 取每个部门最高薪水
mysql> select deptno,max(sal) from EMP group by deptno;
+--------+----------+
| deptno | max(sal) |
+--------+----------+
| 10 | 5000 |
| 20 | 3000 |
| 30 | 2850 |
+--------+----------+
3 rows in set (0.00 sec)
第二步:将以上的结果当做临时表t,t表盒emp_e表进行连接,条件是:t.deptno = e.deptno and t.maxsal axsal = e.sal
select
e.ename,t.*
from
(select deptno,max(sal)as maxsal from EMP group by deptno) t
join
EMP e
on
t.deptno = e.deptnno and t.maxsal = e.sal;
mysql> select e.ename,t.* from (select deptno,max(sal)as maxsal from EMP group by deptno) t join EMP e on t.deptno = e.deptnno and t.maxsal = e.sal;
+-------+--------+--------+
| ename | deptno | maxsal |
+-------+--------+--------+
| BLAKE | 30 | 2850 |
| SCOTT | 20 | 3000 |
| KING | 10 | 5000 |
| FORD | 20 | 3000 |
+-------+--------+--------+
4 rows in set (0.00 sec)
(2)、那些人的薪水在部门的平均薪水之上
第一步:找出每个部门的平均薪水
mysql> select avg(sal),deptno from EMP group by deptno;
+--------------------+--------+
| avg(sal) | deptno |
+--------------------+--------+
| 2916.6666666666665 | 10 |
| 2175 | 20 |
| 1566.6666666666667 | 30 |
+--------------------+--------+
3 rows in set (0.00 sec)
第二步:将以上查询结果当做t表,t表和emp表连接
条件:部门编号相同,并且emp的sal大与t表的avgsal
mysql> select t.*,e.ename,e.sal
-> from EMP e
-> join (select avg(sal) as avgsal,deptno from EMP group by deptno) t
-> on e.deptno = t.deptno and e.sal > t.avgsal;
+--------------------+--------+-------+------+
| avgsal | deptno | ename | sal |
+--------------------+--------+-------+------+
| 1566.6666666666667 | 30 | ALLEN | 1600 |
| 2175 | 20 | JONES | 2975 |
| 1566.6666666666667 | 30 | BLAKE | 2850 |
| 2175 | 20 | SCOTT | 3000 |
| 2916.6666666666665 | 10 | KING | 5000 |
| 2175 | 20 | FORD | 3000 |
+--------------------+--------+-------+------+
6 rows in set (0.00 sec)
(3)、取得部门中(所有人)平均的薪水等级
平均的薪水等级:先计算每一个薪水的等级,然后找出薪水等级的平均数
平均薪水的等级:先计算平均薪水,然后找出每个平均薪水的等级值
第一步:找出每个人的薪水等级
emp e salgrade s表连接
连接条件: e.sal between s.losal and s.hisal
mysql> select e.ename,e.sal,e.deptno,s.grade
-> from EMP e
-> join SALGRADE s
-> on e.sal between s.losal and s.hisal;
+--------+------+--------+-------+
| ename | sal | deptno | grade |
+--------+------+--------+-------+
| SMITH | 800 | 20 | 1 |
| ALLEN | 1600 | 30 | 3 |
| WARD | 1250 | 30 | 2 |
| JONES | 2975 | 20 | 4 |
| MARTIN | 1250 | 30 | 2 |
| BLAKE | 2850 | 30 | 4 |
| CLARK | 2450 | 10 | 4 |
| SCOTT | 3000 | 20 | 4 |
| KING | 5000 | 10 | 5 |
| TURNER | 1500 | 30 | 3 |
| ADAMS | 1100 | 20 | 1 |
| JAMES | 950 | 30 | 1 |
| FORD | 3000 | 20 | 4 |
| MILLER | 1300 | 10 | 2 |
+--------+------+--------+-------+
14 rows in set (0.00 sec)
第二步:基于以上的结果继续按照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;
+--------+--------------+
| deptno | avg(s.grade) |
+--------+--------------+
| 10 | 3.6667 |
| 20 | 2.8000 |
| 30 | 2.5000 |
+--------+--------------+
3 rows in set (0.00 sec)
(4)、不准用组函数(MAX), 取得最高薪资
第一种:sal 降序,limit 1
mysql> select * from EMP order by sal desc limit 1;
+-------+-------+-----------+------+------------+------+------+--------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
+-------+-------+-----------+------+------------+------+------+--------+
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000 | NULL | 10 |
+-------+-------+-----------+------+------------+------+------+--------+
1 row in set (0.00 sec)
第二种:select max(sal) from emp;
第三种:表的自连接
mysql> select sal from EMP where sal not in(select distinct a.sal from EMP a join EMP b on a.sal < b.sal);
+------+
| sal |
+------+
| 5000 |
+------+
1 row in set (0.01 sec)
(5)、取得平均薪水最高的部门的部门编号
第一种方案:降序选第一个
第一步:找出每个部门的平均薪水
select deptno,avg(sal) as avgsal from emp group by deptno;
+--------+--------------------+
| deptno | avgsal |
+--------+--------------------+
| 10 | 2916.6666666666665 |
| 20 | 2175 |
| 30 | 1566.6666666666667 |
+--------+--------------------+
3 rows in set (0.00 sec)
第二步:降序选第一个
mysql> select deptno,avg(sal) as avgsal from EMP group by deptno order by avgsal desc limit 1;
+--------+--------------------+
| deptno | avgsal |
+--------+--------------------+
| 10 | 2916.6666666666665 |
+--------+--------------------+
1 row in set (0.00 sec)
(6)、取得平均薪水最高的部门的部门名称
mysql> select deptno,avg(sal) as avgsal from EMP e group by deptno order by avgsal desc limit 1;
+--------+--------------------+
| deptno | avgsal |
+--------+--------------------+
| 10 | 2916.6666666666665 |
+--------+--------------------+
1 row in set (0.01 sec)
(7)、求平均薪水的等级最低的部门的部门名称
先查出最每个部门平均的薪水
mysql> select deptno,avg(sal) from EMP group by deptno;
+--------+--------------------+
| deptno | avg(sal) |
+--------+--------------------+
| 10 | 2916.6666666666665 |
| 20 | 2175 |
| 30 | 1566.6666666666667 |
+--------+--------------------+
3 rows in set (0.00 sec)
找出每个部门的平均薪水的等级 然后在和salgrade表连接 :条件t.avgsal between s.losal and s.hisal
mysql> select t.*,s.grade
-> from
-> (select dname,avg(sal) avgsal from EMP e join DEPT d on e.deptno=d.deptno group by d.dname) t
-> join
-> SALGRADE s
-> on
-> t.avgsal between s.losal and s.hisal ;
+------------+--------------------+-------+
| dname | avgsal | grade |
+------------+--------------------+-------+
| ACCOUNTING | 2916.6666666666665 | 4 |
| RESEARCH | 2175 | 4 |
| SALES | 1566.6666666666667 | 3 |
+------------+--------------------+-------+
3 rows in set (0.00 sec)
找出平均薪水最低的对应的等级一定是最低的
mysql> select avg(sal) as avgsal from EMP group by deptno order by avgsal asc limit 1 ;
+--------------------+
| avgsal |
+--------------------+
| 1566.6666666666667 |
+--------------------+
1 row in set (0.00 sec)
结果
mysql> select t.*,s.grade from
-> (select dname,avg(sal) avgsal from EMP e join DEPT d 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 from EMP group by deptno order by avgsal asc limit 1 )between losal and hisal)
-> ;
+-------+--------------------+-------+
| dname | avgsal | grade |
+-------+--------------------+-------+
| SALES | 1566.6666666666667 | 3 |
+-------+--------------------+-------+
1 row in set (0.00 sec)
(8)、取得比普通员工(员工代码没有在mgr字段上出现的) 的最高薪水还要高的领导人姓名
第一步:找出普通员工的最高薪水
not in 在使用的时候,需要手动排除 null值
mysql> select max(sal) from EMP where empno not in(select distinct mgr from EMP where mgr is not null);
+----------+
| max(sal) |
+----------+
| 1600 |
+----------+
1 row in set (0.00 sec)
第二步找出高于1600的工资
mysql> 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))
-> ;
+-------+------+
| ename | sal |
+-------+------+
| JONES | 2975 |
| BLAKE | 2850 |
| CLARK | 2450 |
| SCOTT | 3000 |
| KING | 5000 |
| FORD | 3000 |
+-------+------+
6 rows in set (0.00 sec)
(9)、取得薪水最高的前五名员工
mysql> select ename,sal from EMP order by sal desc limit 5;
+-------+------+
| ename | sal |
+-------+------+
| KING | 5000 |
| FORD | 3000 |
| SCOTT | 3000 |
| JONES | 2975 |
| BLAKE | 2850 |
+-------+------+
5 rows in set (0.00 sec)
(10)、取得薪水最高的六到第十名
mysql> select ename,sal from EMP order by sal desc limit 5,5;
+--------+------+
| ename | sal |
+--------+------+
| CLARK | 2450 |
| ALLEN | 1600 |
| TURNER | 1500 |
| MILLER | 1300 |
| WARD | 1250 |
+--------+------+
5 rows in set (0.00 sec)
(11)、取得最后入职的5名员工
mysql> select * from EMP order by HIREDATE desc limit 5 ;
+-------+--------+---------+------+------------+------+------+--------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
+-------+--------+---------+------+------------+------+------+--------+
| 7788 | SCOTT | ANALYST | 7566 | 1987-07-13 | 3000 | NULL | 20 |
| 7876 | ADAMS | CLERK | 7788 | 1987-07-13 | 1100 | NULL | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300 | NULL | 10 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | NULL | 20 |
+-------+--------+---------+------+------------+------+------+--------+
5 rows in set (0.00 sec)
(12)、取得每个薪水 等级有多少个员工
第一步:找出每个员工的薪水等级
mysql> select e.ename,e.sal,s.grade from EMP e join SALGRADE s on e.sal between s.losal and s.hisal;
+--------+------+-------+
| ename | sal | grade |
+--------+------+-------+
| SMITH | 800 | 1 |
| ALLEN | 1600 | 3 |
| WARD | 1250 | 2 |
| JONES | 2975 | 4 |
| MARTIN | 1250 | 2 |
| BLAKE | 2850 | 4 |
| CLARK | 2450 | 4 |
| SCOTT | 3000 | 4 |
| KING | 5000 | 5 |
| TURNER | 1500 | 3 |
| ADAMS | 1100 | 1 |
| JAMES | 950 | 1 |
| FORD | 3000 | 4 |
| MILLER | 1300 | 2 |
+--------+------+-------+
14 rows in set (0.00 sec)
结果
mysql> select s.grade,count(*) from EMP e join SALGRADE s on e.sal between s.losal and s.hisal group by s.grade;
+-------+----------+
| grade | count(*) |
+-------+----------+
| 1 | 3 |
| 2 | 3 |
| 3 | 2 |
| 4 | 5 |
| 5 | 1 |
+-------+----------+
5 rows in set (0.00 sec)
(13)、取得
(14)、列出所有员工及领导的姓名
mysql> select a.ename "员工",b.ename "领导" from EMP a join EMP b on a.mgr=b.empno;
+--------+--------+
| 员工 | 领导 |
+--------+--------+
| SMITH | FORD |
| ALLEN | BLAKE |
| WARD | BLAKE |
| JONES | KING |
| MARTIN | BLAKE |
| BLAKE | KING |
| CLARK | KING |
| SCOTT | JONES |
| TURNER | BLAKE |
| ADAMS | SCOTT |
| JAMES | BLAKE |
| FORD | JONES |
| MILLER | CLARK |
+--------+--------+
13 rows in set (0.00 sec)
(15)、列出受雇日期早于其直接上级的所有员工的编号 姓名 部门名称
emp a 员工表
emp b 领导表
a.mgr = b.empno and a.hiredate < b.hiredate
select
a.ename "员工",b.ename "领导",b.hiredate,d.dname
from
EMP a
join
EMP b
on
a.mgr = b.empno
join
DEPT d
on
a.deptno = d.deptno
and a.hiredate < b.hiredate
+--------+--------+------------+------------+
| 员工 | 领导 | hiredate | dname |
+--------+--------+------------+------------+
| CLARK | KING | 1981-11-17 | ACCOUNTING |
| SMITH | FORD | 1981-12-03 | RESEARCH |
| JONES | KING | 1981-11-17 | RESEARCH |
| ALLEN | BLAKE | 1981-05-01 | SALES |
| WARD | BLAKE | 1981-05-01 | SALES |
| BLAKE | KING | 1981-11-17 | SALES |
+--------+--------+------------+------------+
6 rows in set (0.00 sec)
(16)、列出部门名称和这些部门的员工信息,同时列出哪些没有员工的部门
emp e
dept d
select
e.*,d.dname
from
EMP e
right join
DEPT d
on
e.deptno=d.deptno
+-------+--------+-----------+------+------------+------+------+--------+------------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO | dname |
+-------+--------+-----------+------+------------+------+------+--------+------------+
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450 | NULL | 10 | ACCOUNTING |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000 | NULL | 10 | ACCOUNTING |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300 | NULL | 10 | ACCOUNTING |
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800 | NULL | 20 | RESEARCH |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | NULL | 20 | RESEARCH |
| 7788 | SCOTT | ANALYST | 7566 | 1987-07-13 | 3000 | NULL | 20 | RESEARCH |
| 7876 | ADAMS | CLERK | 7788 | 1987-07-13 | 1100 | NULL | 20 | RESEARCH |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | NULL | 20 | RESEARCH |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 | SALES |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250 | 500 | 30 | SALES |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250 | 1400 | 30 | SALES |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850 | NULL | 30 | SALES |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 | 0 | 30 | SALES |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950 | NULL | 30 | SALES |
| NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | OPERATIONS |
+-------+--------+-----------+------+------------+------+------+--------+------------+
15 rows in set (0.00 sec)
(17)、列出至少有五个员工的所有部门
mysql> select deptno,count(deptno) from EMP group by deptno having count(deptno)>=5;
+--------+---------------+
| deptno | count(deptno) |
+--------+---------------+
| 20 | 5 |
| 30 | 6 |
+--------+---------------+
2 rows in set (0.00 sec)
(18)、列出薪金比"SMITH"多的所有员工信息
mysql> select * from EMP where sal >(select sal from EMP where ename="SMITH");
+-------+--------+-----------+------+------------+------+------+--------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
+-------+--------+-----------+------+------------+------+------+--------+
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250 | 500 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | NULL | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250 | 1400 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-07-13 | 3000 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 | 0 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1987-07-13 | 1100 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000 | NULL | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300 | NULL | 10 |
+-------+--------+-----------+------+------------+------+------+--------+
13 rows in set (0.00 sec)
(19)、列出所有"CLERK"(办事员)的姓名及其姓名,部门的人数
mysql>
select
e.ename,e.job
from
EMP e
join
DEPT d
on
e.deptno = d.deptno
where
e.JOB ="CLERK";
找出部门人数
mysql> select deptno,count(*)as dptcount from EMP group by deptno;
+--------+----------+
| deptno | dptcount |
+--------+----------+
| 10 | 3 |
| 20 | 5 |
| 30 | 6 |
+--------+----------+
3 rows in set (0.00 sec)
```sql
select
t1.*,t2.deptcount
from
(select
e.ename,e.job,d.dname,d.deptno
from
EMP e
join
DEPT d
on
e.deptno = d.deptno
where
e.JOB ="CLERK") t1
join
(select
deptno,count(*)as deptcount
from
EMP
group by
deptno) t2
on t1.deptno = t2.deptno
+--------+-------+------------+--------+-----------+
| ename | job | dname | deptno | deptcount |
+--------+-------+------------+--------+-----------+
| SMITH | CLERK | RESEARCH | 20 | 5 |
| ADAMS | CLERK | RESEARCH | 20 | 5 |
| JAMES | CLERK | SALES | 30 | 6 |
| MILLER | CLERK | ACCOUNTING | 10 | 3 |
+--------+-------+------------+--------+-----------+
(20)、列出最低薪资大与1500的各种工作及从事此工作的全部雇员人数
按照工作岗位分组求最小值
mysql> select job,count(*) from EMP group by job having min(sal) >1500;
+-----------+----------+
| job | count(*) |
+-----------+----------+
| ANALYST | 2 |
| MANAGER | 3 |
| PRESIDENT | 1 |
+-----------+----------+
3 rows in set (0.00 sec)
(21)、列出部门"SALES"<销售部> 工作的员工的姓名,假定不知道销售部的部门编号
mysql> select ename from EMP where deptno =(select deptno from DEPT where dname = "SALES");
+--------+
| ename |
+--------+
| ALLEN |
| WARD |
| MARTIN |
| BLAKE |
| TURNER |
| JAMES |
+--------+
(22)、列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,雇员的工资等级
mysql> select e.ename "员工",d.dname,a.ename "领导",s.grade
-> from EMP e
-> join DEPT d
-> on e.deptno = d.deptno
-> left join EMP a
-> on e.mgr = a.empno
-> join SALGRADE s
-> on e.sal between s.losal and s.hisal
-> where e.sal >(select avg(sal) from EMP);
+--------+------------+--------+-------+
| 员工 | dname | 领导 | grade |
+--------+------------+--------+-------+
| JONES | RESEARCH | KING | 4 |
| BLAKE | SALES | KING | 4 |
| CLARK | ACCOUNTING | KING | 4 |
| SCOTT | RESEARCH | JONES | 4 |
| KING | ACCOUNTING | NULL | 5 |
| FORD | RESEARCH | JONES | 4 |
+--------+------------+--------+-------+
6 rows in set (0.00 sec)
(23)、列出与"SCOTT" 从事相同工作的所有员工及部门名称
mysql> 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 enname="SCOTT") and e.ename <>"SCOTT";
+-------+---------+----------+
| ename | job | dname |
+-------+---------+----------+
| FORD | ANALYST | RESEARCH |
+-------+---------+----------+
1 row in set (0.00 sec)
(24)、列出薪金等于部门30中员工的薪金的其他员工的姓名的薪金
mysql> select ename,sal from EMP where sal in (select sal from EMP e where deptno = 30) and deptno <> 30;
(25)、列出薪金高于在部门 30工作的所有员工的薪金的员工姓名和薪金
mysql> select max(sal) from EMP where deptno =30;
+----------+
| max(sal) |
+----------+
| 2850 |
+----------+
1 row in set (0.00 sec)
mysql> 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);
+-------+------+------------+
| ename | sal | dname |
+-------+------+------------+
| JONES | 2975 | RESEARCH |
| SCOTT | 3000 | RESEARCH |
| KING | 5000 | ACCOUNTING |
| FORD | 3000 | RESEARCH |
+-------+------+------------+
4 rows in set (0.00 sec)
(26)、列出在每个部门工作的员工数量,,平均工资和平均服务期限
mysql> select d.*,count(e.ename) from EMP e right join DEPT d on d.deptno = e.deptno group by d.deptno;
+--------+------------+----------+----------------+
| DEPTNO | DNAME | LOC | count(e.ename) |
+--------+------------+----------+----------------+
| 10 | ACCOUNTING | NEW YORK | 3 |
| 20 | RESEARCH | DALLAS | 5 |
| 30 | SALES | CHICAGO | 6 |
| 40 | OPERATIONS | BOSTON | 0 |
+--------+------------+----------+----------------+
4 rows in set (0.00 sec)
mysql> select d.*,count(e.ename),avg(sal),avg(timestampdiff(YEAR,hiredate,now())) as time from EMP e right join DEPT d on d.deptno = e.deptno group by d.deptno;
+--------+------------+----------+----------------+--------------------+---------+
| DEPTNO | DNAME | LOC | count(e.ename) | avg(sal) | time |
+--------+------------+----------+----------------+--------------------+---------+
| 10 | ACCOUNTING | NEW YORK | 3 | 2916.6666666666665 | 38.3333 |
| 20 | RESEARCH | DALLAS | 5 | 2175 | 36.4000 |
| 30 | SALES | CHICAGO | 6 | 1566.6666666666667 | 38.5000 |
| 40 | OPERATIONS | BOSTON | 0 | NULL | NULL |
+--------+------------+----------+----------------+--------------------+---------+
4 rows in set (0.00 sec)
(27)、列出所有员工的姓名、部门名称和工资
mysql> select e.ename,d.dname,e.sal from EMP e join DEPT d on e.deptno=d.deptno
-> ;
+--------+------------+------+
| ename | dname | sal |
+--------+------------+------+
| CLARK | ACCOUNTING | 2450 |
| KING | ACCOUNTING | 5000 |
| MILLER | ACCOUNTING | 1300 |
| SMITH | RESEARCH | 800 |
| JONES | RESEARCH | 2975 |
| SCOTT | RESEARCH | 3000 |
| ADAMS | RESEARCH | 1100 |
| FORD | RESEARCH | 3000 |
| ALLEN | SALES | 1600 |
| WARD | SALES | 1250 |
| MARTIN | SALES | 1250 |
| BLAKE | SALES | 2850 |
| TURNER | SALES | 1500 |
| JAMES | SALES | 950 |
+--------+------------+------+
14 rows in set (0.00 sec)
(28)、列出所有员工的详细信息和人数
mysql> select d.deptno ,d.dname,d.loc from EMP e join DEPT d on e.deptno = d.deptno group by d.deptno ,d.dname,d.loc;
+--------+------------+----------+
| deptno | dname | loc |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
+--------+------------+----------+
3 rows in set (0.00 sec)
(29)、列出各种工作的最低工资及其从事此工作的雇员姓名
mysql> select e.ename,t.* from EMP e join (select job,min(sal) as sal from EMP group by job) t on e.job=t.job and e.sal = t.sal;
+--------+-----------+------+
| ename | job | sal |
+--------+-----------+------+
| SMITH | CLERK | 800 |
| WARD | SALESMAN | 1250 |
| MARTIN | SALESMAN | 1250 |
| CLARK | MANAGER | 2450 |
| SCOTT | ANALYST | 3000 |
| KING | PRESIDENT | 5000 |
| FORD | ANALYST | 3000 |
+--------+-----------+------+
7 rows in set (0.00 sec)
(30)、列出各个部门的MANAGER()领导的最低工资
mysql> select deptno,min(sal) from EMP where job='MANAGER' group by deptno;
+--------+----------+
| deptno | min(sal) |
+--------+----------+
| 10 | 2450 |
| 20 | 2975 |
| 30 | 2850 |
+--------+----------+
3 rows in set (0.00 sec)
(31)、列出所有员工的年工资,按年薪从低到高排序
mysql> select ename,(sal+ ifnull(comm,0))*12 as yearsal from EMP order by yearsal asc;
+--------+---------+
| ename | yearsal |
+--------+---------+
| SMITH | 9600 |
| JAMES | 11400 |
| ADAMS | 13200 |
| MILLER | 15600 |
| TURNER | 18000 |
| WARD | 21000 |
| ALLEN | 22800 |
| CLARK | 29400 |
| MARTIN | 31800 |
| BLAKE | 34200 |
| JONES | 35700 |
| SCOTT | 36000 |
| FORD | 36000 |
| KING | 60000 |
+--------+---------+
14 rows in set (0.00 sec)
(32)、求出员工领导的薪水超过3000 的员工名称与领导
mysql> select a.ename "员工",a.sal,b.ename "领导",b.sal from EMP a join EMP b on a.mgr=b.empno where b.sal >3000;
+--------+------+--------+------+
| 员工 | sal | 领导 | sal |
+--------+------+--------+------+
| JONES | 2975 | KING | 5000 |
| BLAKE | 2850 | KING | 5000 |
| CLARK | 2450 | KING | 5000 |
+--------+------+--------+------+
3 rows in set (0.00 sec)
(33)、求出部门名称中,带's'字符的部门员工的工资合计、部门人数,
mysql> select d.deptno,d.dname,d.loc,count(e.ename),ifnull(sum(e.sal),0) from EMP e right join DEPT d on e.deptno = d.deptno where d.dname like '%s%' group by d.deptno,d.dname,d.loc;
+--------+------------+---------+----------------+----------------------+
| deptno | dname | loc | count(e.ename) | ifnull(sum(e.sal),0) |
+--------+------------+---------+----------------+----------------------+
| 20 | RESEARCH | DALLAS | 5 | 10875 |
| 30 | SALES | CHICAGO | 6 | 9400 |
| 40 | OPERATIONS | BOSTON | 0 | 0 |
+--------+------------+---------+----------------+----------------------+
(32)、给任职日期超过30年的员工加薪10%
update EMP set sal=sal * 1.1 where timestampdiff(YEAR,hiredate,now())>30;