题目来自动力节点
建议大家手动敲,遇到不会的再去看视频解说,越到后面越快!!!
- 1取得每个部门最高薪水的人员名称
- 2哪些人的薪水在部门的平均薪水之上
- 3取得部门中(所有人的)平均的薪水等级
- 4不准用组函数(Max),取得最高薪水
- 5取得平均薪水最高的部门的部门编号
- 6取得平均薪水最高的部门的部门名称
- 7求平均薪水的等级最低的部门的部门名称
- 8取得比普通员工(员工代码没有在mgr字段上出现的)的最高薪水还要高的领导人姓名
- 9取得薪水最高的前五名员工
- 10取得薪水最高的第六到第十名员工
- 11取得最后入职的5名员工
- 12取得每个薪水等级有多少员工
- 面试题
- 14列出所有员工及领导的姓名
- 15列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称
- 16列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
- 17列出至少有5个员工的所有部门
- 18列出薪金比"SMITH"多的所有员工信息
- 19列出所有"CLERK"(办事员)的姓名及其部门名称,部门的人数
- 20列出最低薪金大于1500的各种工作及从事此工作的全部雇员人数
- 21列出在部门"SALES"<销售部>工作的员工的姓名,假定不知道销售部的部门编号.
- 22列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,雇员的工资等级.
- 23列出与"SCOTT"从事相同工作的所有员工及部门名称
- 24列出薪金等于部门30中员工的薪金的其他员工的姓名和薪金
- 25列出薪金高于部门30中员工的薪金的其他员工的姓名和薪金
- 26列出在每个部门工作的员工数量,平均工资和平均服务期限.
- 27列出所有员工的姓名、部门名称和工资
- 28列出所有部门的详细信息和人数
- 29列出各种工作的最低工资及从事此工作的雇员姓名
- 30列出各个部门的MANAGER(领导)的最低薪金
- 31列出所有员工的年工资,按年薪从低到高排序
- 32求出员工领导的薪水超过3000的员工名称与领导名称
- 33求出部门名称中,带'S'字符的部门员工的工资合计、部门人数.
- 4给任职日期超过30年的员工加薪10%.
1取得每个部门最高薪水的人员名称
mysql> select a.ename,a.sal,a.deptno from emp a join (select max(sal) 'salmax' from emp group by deptno) b on a.sal=b.salmax;
+-------+---------+--------+
| ename | sal | deptno |
+-------+---------+--------+
| BLAKE | 2850.00 | 30 |
| SCOTT | 3000.00 | 20 |
| KING | 5000.00 | 10 |
| FORD | 3000.00 | 20 |
+-------+---------+--------+
2哪些人的薪水在部门的平均薪水之上
mysql> select a.ename,a.sal from emp a join (select avg(sal) 'salavg',deptno from emp group by deptno) b on (a.sal>=b.salavg and a.deptno=b.deptno);
+-------+---------+
| ename | sal |
+-------+---------+
| JONES | 2975.00 |
| SCOTT | 3000.00 |
| FORD | 3000.00 |
| ALLEN | 1600.00 |
| BLAKE | 2850.00 |
| KING | 5000.00 |
+-------+---------+
6 rows in set (0.00 sec)
3取得部门中(所有人的)平均的薪水等级
这里我一开始求的是 平均薪水等级
所以首先先区分 部门平均的薪水等级 和 部门平均薪水的等级
前者 平均的薪水等级 意为 部门每个人的薪水都在一个范围之内,然后对这所有人对应的范围求平均。
后者 部门平均薪水的等级 是部门所有人的平均薪水,再对应求等级
部门平均的薪水等级
mysql> select m.adeptno,avg(bgrade) from ( select a.deptno 'adeptno',a.ename 'aename',a.sal 'asal',b.grade 'bgrade' from emp a join salgrade b on a.sal between b.losal and b.hisal) m group by m.adeptno order by m.adeptno asc;
+---------+-------------+
| adeptno | avg(bgrade) |
+---------+-------------+
| 10 | 3.6667 |
| 20 | 2.8000 |
| 30 | 2.5000 |
+---------+-------------+
3 rows in set (0.00 sec)
部门平均薪水的等级
mysql> select a.deptno,a.avgsal,b.grade from (select avg(sal) 'avgsal',deptno from emp group by deptno) a join salgrade b on a.avgsal between b.losal and b.hisal;
+--------+-------------+-------+
| deptno | avgsal | grade |
+--------+-------------+-------+
| 20 | 2175.000000 | 4 |
| 30 | 1566.666667 | 3 |
| 10 | 2916.666667 | 4 |
+--------+-------------+-------+
3 rows in set (0.00 sec)
4不准用组函数(Max),取得最高薪水
方法1 先排序 order by 再 取第一个
mysql> select sal from emp order by sal desc limit 1;
+---------+
| sal |
+---------+
| 5000.00 |
+---------+
1 row in set (0.00 sec)
方法2,最大值,那么找出其余最小值 ——这点看了视频才会
mysql> select sal from emp where sal not in (select distinct(a.sal) 'minsal' from emp a join emp b on a.sal<b.sal);
+---------+
| sal |
+---------+
| 5000.00 |
+---------+
1 row in set (0.01 sec)
巧妙!。
5取得平均薪水最高的部门的部门编号
这里前面一部分可在第三题找到
遇到的问题是ERROR 1248 (42000): Every derived table must have its own alias
每个派生表要有自己的别名。 解决方法是:给派生表的每一个列重新取名字
mysql> select max(x.asal) from (select a.deptno 'dep',a.avgsal 'asal' from (select avg(sal) 'avgsal',deptno from emp group by deptno) a join salgrade b on a.avgsal between b.losal and b.hisal) x;
+-------------+
| max(x.asal) |
+-------------+
| 2916.666667 |
+-------------+
1 row in set (0.00 sec)
6取得平均薪水最高的部门的部门名称
select d.dname,max(x.asal) from (select a.deptno 'dep',a.avgsal 'asal' from (select avg(sal) 'avgsal',deptno from emp group by deptno) a join salgrade b on a.avgsal between b.losal and b.hisal) x join dept d;
+------------+-------------+
| dname | max(x.asal) |
+------------+-------------+
| ACCOUNTING | 2916.666667 |
+------------+-------------+
1 row in set (0.00 sec)
7求平均薪水的等级最低的部门的部门名称
上面改一下min
8取得比普通员工(员工代码没有在mgr字段上出现的)的最高薪水还要高的领导人姓名
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.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| SCOTT | 3000.00 |
| KING | 5000.00 |
| FORD | 3000.00 |
+-------+---------+
6 rows in set (0.00 sec)
9取得薪水最高的前五名员工
mysql> select ename,sal from emp order by sal desc limit 5;
+-------+---------+
| ename | sal |
+-------+---------+
| KING | 5000.00 |
| FORD | 3000.00 |
| SCOTT | 3000.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
+-------+---------+
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.00 |
| ALLEN | 1600.00 |
| TURNER | 1500.00 |
| MILLER | 1300.00 |
| WARD | 1250.00 |
+--------+---------+
5 rows in set (0.00 sec)
11取得最后入职的5名员工
mysql> select ename from emp order by hiredate desc limit 5;
+--------+
| ename |
+--------+
| ADAMS |
| SCOTT |
| MILLER |
| JAMES |
| FORD |
+--------+
5 rows in set (0.00 sec)
12取得每个薪水等级有多少员工
mysql> select s.grade,count(s.grade) from emp e join salgrade s on e.sal between s.losal and s.hisal group by s.grade;
+-------+----------------+
| grade | count(s.grade) |
+-------+----------------+
| 1 | 3 |
| 3 | 2 |
| 2 | 3 |
| 4 | 5 |
| 5 | 1 |
+-------+----------------+
5 rows in set (0.00 sec)
面试题
有3个表S(学生表),C(课程表),SC(学生选课表)
S(SNO,SNAME)代表(学号,姓名)
C(CNO,CNAME,CTEACHER)代表(课号,课名,教师)
SC(SNO,CNO,SCGRADE)代表(学号,课号,成绩)
问题:
1, 找出没选过“黎明”老师的所有学生姓名。
mysql> select n.sname from s n where n.sno not in (select distinct sno from sc s1
join c c1 on s1.cno=5);
+-------+
| sname |
+-------+
| 学生3 |
| 学生4 |
+-------+
2 rows in set (0.00 sec)
2,列出2门以上(含2门)不及格学生姓名及平均成绩。
mysql> select distinct(k.sno),f.avgs from (select sno 'xnum',count(sno)
'logradednum' from sc where scgrade<60 group by sno) s left join sc k on
k.sno=s.xnum join (select avg(scgrade) 'avgs',sno from sc group by sno) f on
f.sno=k.sno where s.logradednum>=2;
+------+------+
| sno | avgs |
+------+------+
| 1 | 46 |
+------+------+
1 row in set (0.00 sec)
3,即学过1号课程又学过2号课所有学生的姓名。
请用标准SQL语言写出答案,方言也行(请说明是使用什么方言)。
这题一开始是想不出来的, 然后想到了单独寻找,但是如果数量特别多岂不是很麻烦?
mysql> select k.sno from (select sno,cno from sc where cno=1) k join ( select sno,cno from sc where cno=2) g on k.sno=g.sno;
+------+
| sno |
+------+
| 1 |
| 2 |
+------+
2 rows in set (0.00 sec)
14列出所有员工及领导的姓名
一开始没有加left 在遇到on后面的条件不符合时,就不会显示出来
而我们加上left 左边的表一定会全显示,哪怕关联的外表没有其也只是会显示null
mysql> select e.ename,ifnull(a.ename,'没有上级') from emp e left join emp a on e.mgr=a.empno;
+--------+----------------------------+
| ename | ifnull(a.ename,'没有上级') |
+--------+----------------------------+
| SMITH | FORD |
| ALLEN | BLAKE |
| WARD | BLAKE |
| JONES | KING |
| MARTIN | BLAKE |
| BLAKE | KING |
| CLARK | KING |
| SCOTT | JONES |
| KING | 没有上级 |
| TURNER | BLAKE |
| ADAMS | SCOTT |
| JAMES | BLAKE |
| FORD | JONES |
| MILLER | CLARK |
+--------+----------------------------+
14 rows in set (0.00 sec)
15列出受雇日期早于其直接上级的所有员工的编号,姓名,部门名称
mysql> select e.ename,e.empno,b.ename,b.empno from emp e left join emp b on e.mgr=b.empno where e.hiredate<b.hiredate;
+-------+-------+-------+-------+
| ename | empno | ename | empno |
+-------+-------+-------+-------+
| SMITH | 7369 | FORD | 7902 |
| ALLEN | 7499 | BLAKE | 7698 |
| WARD | 7521 | BLAKE | 7698 |
| JONES | 7566 | KING | 7839 |
| BLAKE | 7698 | KING | 7839 |
| CLARK | 7782 | KING | 7839 |
+-------+-------+-------+-------+
6 rows in set (0.00 sec)
16列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
mysql> select d.dname,e.* from dept d left join emp e on e.deptno=d.deptno order by d.dname;
+------------+-------+--------+-----------+------+------------+---------+---------+--------+
| dname | EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
+------------+-------+--------+-----------+------+------------+---------+---------+--------+
| ACCOUNTING | 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| ACCOUNTING | 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| ACCOUNTING | 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
| OPERATIONS | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| RESEARCH | 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| RESEARCH | 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| RESEARCH | 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| RESEARCH | 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 |
| RESEARCH | 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| SALES | 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| SALES | 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| SALES | 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| SALES | 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| SALES | 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| SALES | 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
+------------+-------+--------+-----------+------+------------+---------+---------+--------+
15 rows in set (0.00 sec)
17列出至少有5个员工的所有部门
mysql> select d.dname,h.num from dept d join (select deptno,count(*) 'num' from emp group by deptno having count(*)>=5) h on h.deptno=d.deptno;
+----------+-----+
| dname | num |
+----------+-----+
| RESEARCH | 5 |
| SALES | 6 |
+----------+-----+
2 rows in set (0.00 sec)
18列出薪金比"SMITH"多的所有员工信息
mysql> select f.* from emp e join emp f on f.sal>e.sal where e.ename='smith';
+-------+--------+-----------+------+------------+---------+---------+--------+
| 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 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
13 rows in set (0.00 sec)
19列出所有"CLERK"(办事员)的姓名及其部门名称,部门的人数
mysql> select m.ename,m.job,m.dname,n.num 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') m join (select d.deptno, count(d.deptno) 'num' from emp e join dept d on e.deptno=d.deptno group by d.deptno) n on m.deptno=n.deptno;
+--------+-------+------------+-----+
| 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.00 sec)
20列出最低薪金大于1500的各种工作及从事此工作的全部雇员人数
mysql> select m.ename,m.job,(m.sal+ifnull(m.comm,0)),n.num '人数' from ( select e.* from emp e where (e.sal+ifnull(e.comm,0))>1500) m join ( select count(*) 'num',job from emp group by job) n on m.job=n.job;
+--------+-----------+--------------------------+------+
| ENAME | JOB | (m.sal+ifnull(m.comm,0)) | 人数 |
+--------+-----------+--------------------------+------+
| ALLEN | SALESMAN | 1900.00 | 4 |
| WARD | SALESMAN | 1750.00 | 4 |
| JONES | MANAGER | 2975.00 | 3 |
| MARTIN | SALESMAN | 2650.00 | 4 |
| BLAKE | MANAGER | 2850.00 | 3 |
| CLARK | MANAGER | 2450.00 | 3 |
| SCOTT | ANALYST | 3000.00 | 2 |
| KING | PRESIDENT | 5000.00 | 1 |
| FORD | ANALYST | 3000.00 | 2 |
+--------+-----------+--------------------------+------+
9 rows in set (0.00 sec)
21列出在部门"SALES"<销售部>工作的员工的姓名,假定不知道销售部的部门编号.
一开始还以为这个麻烦 还想着通过其他编号 然后排出它 后来答案是 通过名字 寻找 这步都一样吗。。。
mysql> select e.* from emp e where e.deptno=(select deptno from dept where dname='sales');
+-------+--------+----------+------+------------+---------+---------+--------+
| 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)
22列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,雇员的工资等级.
长到难以置信 一个表接一个表
然后看答案 才知道 join 可以重复使用
mysql> select k.ename '姓名',k.dname '部门名称',k.boss '上级领导',g.grade from (select f.ename,f.dname,f.sal,h.ename 'boss' from (select a.ename,b.dname,a.sal,a.mgr from (select e.ename,e.deptno,e.sal,e.mgr from emp e join ( select avg(sal) 'avgsal' from emp) m on e.sal>m.avgsal) a left join dept b on a.deptno=b.deptno) f left join emp h on f.mgr=h.empno) k join ( select e.ename,d.grade from emp e join salgrade d on e.sal between d.losal and d.hisal) g on k.ename=g.ename;
+-------+------------+----------+-------+
| 姓名 | 部门名称 | 上级领导 | grade |
+-------+------------+----------+-------+
| JONES | RESEARCH | KING | 4 |
| BLAKE | SALES | KING | 4 |
| CLARK | ACCOUNTING | KING | 4 |
| SCOTT | RESEARCH | JONES | 4 |
| FORD | RESEARCH | JONES | 4 |
| KING | ACCOUNTING | NULL | 5 |
+-------+------------+----------+-------+
6 rows in set (0.00 sec)
重复使用join 简易很多了 但是要注意 where 要在join语句后面
按照顺序来 第一个原则就是 高于平均水平 所以其肯定是覆盖所有的。
mysql> select e.ename '员工',d.dname '所在部门',l.ename '领导',s.grade '薪资等级'
-> from emp e join dept d on e.deptno=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);
+-------+------------+-------+----------+
| 员工 | 所在部门 | 领导 | 薪资等级 |
+-------+------------+-------+----------+
| JONES | RESEARCH | KING | 4 |
| BLAKE | SALES | KING | 4 |
| CLARK | ACCOUNTING | KING | 4 |
| SCOTT | RESEARCH | JONES | 4 |
| FORD | RESEARCH | JONES | 4 |
| KING | ACCOUNTING | NULL | 5 |
+-------+------------+-------+----------+
6 rows in set (0.00 sec)
23列出与"SCOTT"从事相同工作的所有员工及部门名称
mysql> 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 ename!='scott';
+-------+----------+
| ename | dname |
+-------+----------+
| FORD | RESEARCH |
+-------+----------+
1 row in set (0.00 sec)
24列出薪金等于部门30中员工的薪金的其他员工的姓名和薪金
空
mysql> select e.ename,e.sal from (select *from emp where deptno!=30) e join (select *from emp where deptno=30) d on e.sal=d.sal;
Empty set (0.00 sec)
25列出薪金高于部门30中员工的薪金的其他员工的姓名和薪金
mysql> select e.ename,e.sal,f.dname from (select *from emp where deptno!=30) e join dept f on e.deptno=f.deptno join (select max(sal) 'msal' from emp where deptno=30) d on e.sal>=d.msal;
+-------+---------+------------+
| ENAME | SAL | dname |
+-------+---------+------------+
| JONES | 2975.00 | RESEARCH |
| SCOTT | 3000.00 | RESEARCH |
| KING | 5000.00 | ACCOUNTING |
| FORD | 3000.00 | RESEARCH |
+-------+---------+------------+
4 rows in set (0.01 sec)
26列出在每个部门工作的员工数量,平均工资和平均服务期限.
mysql> select d.dname, avg(sal),count(*) from emp e join dept d on d.deptno=e.deptno group by e.deptno;
+------------+-------------+----------+
| dname | avg(sal) | count(*) |
+------------+-------------+----------+
| RESEARCH | 2175.000000 | 5 |
| SALES | 1566.666667 | 6 |
| ACCOUNTING | 2916.666667 | 3 |
+------------+-------------+----------+
3 rows in set (0.00 sec)
额 这个平均服务期限 蒙蔽 没有相关数据啊
下面是修改加上情况不存的时候 修改为0
mysql> select d.dname, ifnull(avg(sal),0),count(e.ename) from emp e right join dept d on d.deptno=e.deptno group by e.deptno;
+------------+--------------------+----------------+
| dname | ifnull(avg(sal),0) | count(e.ename) |
+------------+--------------------+----------------+
| RESEARCH | 2175.000000 | 5 |
| SALES | 1566.666667 | 6 |
| ACCOUNTING | 2916.666667 | 3 |
| OPERATIONS | 0.000000 | 0 |
+------------+--------------------+----------------+
4 rows in set (0.00 sec)
加上一个求年差额函数 timestampdiff(格式,日期,日期)
mysql> select d.dname, ifnull(avg(sal),0),count(e.ename),avg(timestampdiff(year,hiredate,now())) from emp e right join dept d on d.deptno=e.deptno group by e.deptno;
+------------+--------------------+----------------+-----------------------------------------+
| dname | ifnull(avg(sal),0) | count(e.ename) | avg(timestampdiff(year,hiredate,now())) |
+------------+--------------------+----------------+-----------------------------------------+
| RESEARCH | 2175.000000 | 5 | 37.4000 |
| SALES | 1566.666667 | 6 | 39.5000 |
| ACCOUNTING | 2916.666667 | 3 | 39.3333 |
| OPERATIONS | 0.000000 | 0 | NULL |
+------------+--------------------+----------------+-----------------------------------------+
4 rows in set (0.00 sec)
27列出所有员工的姓名、部门名称和工资
select e.ename,d.dname,e.sal from emp e join dept d on e.deptno=d.deptno;
28列出所有部门的详细信息和人数
mysql> select d.*,e.num from (select count(*) 'num',deptno from emp group by deptno) e join dept d on e.deptno=d.deptno;
+--------+------------+----------+-----+
| DEPTNO | DNAME | LOC | num |
+--------+------------+----------+-----+
| 10 | ACCOUNTING | NEW YORK | 3 |
| 20 | RESEARCH | DALLAS | 5 |
| 30 | SALES | CHICAGO | 6 |
+--------+------------+----------+-----+
3 rows in set (0.00 sec)
29列出各种工作的最低工资及从事此工作的雇员姓名
mysql> select job,min(sal),ename from emp group by job;
+-----------+----------+-------+
| job | min(sal) | ename |
+-----------+----------+-------+
| CLERK | 800.00 | SMITH |
| SALESMAN | 1250.00 | ALLEN |
| MANAGER | 2450.00 | JONES |
| ANALYST | 3000.00 | SCOTT |
| PRESIDENT | 5000.00 | KING |
+-----------+----------+-------+
5 rows in set (0.00 sec)
30列出各个部门的MANAGER(领导)的最低薪金
mysql> select e.ename,min(e.sal),d.deptno from emp e join dept d on e.deptno =d.deptno where job='MANAGER' group by e.deptno;
+-------+------------+--------+
| ename | min(e.sal) | deptno |
+-------+------------+--------+
| JONES | 2975.00 | 20 |
| BLAKE | 2850.00 | 30 |
| CLARK | 2450.00 | 10 |
+-------+------------+--------+
3 rows in set (0.00 sec)
31列出所有员工的年工资,按年薪从低到高排序
mysql> select ename,((sal+ifnull(comm,0))*12) from emp order by ((sal+ifnull(comm,0))*12) asc;
+--------+---------------------------+
| ename | ((sal+ifnull(comm,0))*12) |
+--------+---------------------------+
| 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 |
+--------+---------------------------+
32求出员工领导的薪水超过3000的员工名称与领导名称
mysql> select e.ename,f.ename from emp e join emp f on e.mgr=f.empno where f.sal>3000;
+-------+-------+
| ename | ename |
+-------+-------+
| JONES | KING |
| BLAKE | KING |
| CLARK | KING |
+-------+-------+
3 rows in set (0.00 sec)
33求出部门名称中,带’S’字符的部门员工的工资合计、部门人数.
mysql> select d.deptno,d.dname,count(e.deptno),sum(e.sal) from emp e right join dept d on e.deptno=d.deptno where d.loc like '%s%' group by d.deptno;
+--------+------------+-----------------+------------+
| deptno | dname | count(e.deptno) | sum(e.sal) |
+--------+------------+-----------------+------------+
| 20 | RESEARCH | 5 | 10875.00 |
| 40 | OPERATIONS | 0 | NULL |
+--------+------------+-----------------+------------+
2 rows in set (0.01 sec)
4给任职日期超过30年的员工加薪10%.
update emp set sal=sal*1.1 where timestampdiff(year,hiredate,now())>30;
好家伙 这一改 我的原数据都变了