您的位置:首页 > Web前端 > Node.js

MySQL入门(9)- 34道练习题(内含bjpowernode.sql数据)

2018-02-24 10:07 1166 查看

34道练习题(内含bjpowernode.sql数据)

此系列记录PN视频学习笔记
* 本博客涉及到的数据为bjpowernode.sql,数据见文末。* 该数据有三张表:部门表dept(deptno部门编号、dname部门名称、loc位置)、                             员工表emp(empno工号、ename员工姓名、job职位、mgr直属领导工号、                                                  hiredate入职日期、sal月薪、comm补贴、deptno部门编号)、                             薪水等级表salgrade(grade等级、losal区间下限、hisal区间上限)
1、 取得每个部门最高薪水人员的名称
mysql> select t.deptno,e.ename,t.msal from emp e
    -> join (selectdeptno,max(sal) msal from emp group by deptno) t
    -> on e.sal =t.msal;
+--------+-------+---------+
| deptno | ename | msal   |
+--------+-------+---------+
|     30 | BLAKE |2850.00 |
|     20 | SCOTT |3000.00 |
|     10 | KING  | 5000.00 |
|     20 | FORD  | 3000.00 |
+--------+-------+---------+
 
2、 哪些人的薪水在部门平均薪水之上?
思路:先求平均薪水构成表a2;联立emp e表,和a2表
mysql>select a.ename,a.sal,a.deptno
    -> from emp a
    -> join (select deptno,avg(sal) asalfrom emp group by deptno) b
    -> on a.sal > b.asal and a.deptno =b.deptno;
mysql>create table a2 as select deptno,avg(sal) asal from emp group by deptno;
mysql>select e.ename,e.sal,e.deptno,a2.asal from emp e,a2 where e.sal > a2.asaland e.deptno = a2.deptno;
+-------+---------+--------+-------------+
| ename | sal     |deptno | asal        |
+-------+---------+--------+-------------+
| ALLEN | 1600.00 |    30 | 1566.666667 |
| JONES | 2975.00 |    20 | 2175.000000 |
| BLAKE | 2850.00 |    30 | 1566.666667 |
| SCOTT | 3000.00 |    20 | 2175.000000 |
| KING  | 5000.00 |     10 | 2916.666667 |
| FORD  | 3000.00 |     20 | 2175.000000 |
+-------+---------+--------+-------------+
 
3、 取得部门中(所有人的)平均的薪水等级
思路:计算每个人的薪水等级;然后根据部门编号分组
select e.ename,e.deptno,s.gradefrom emp e
join salgrades on e.sal between s.losal and s.hisal
group by e.deptno;
 
mysql>select e.deptno,avg(s.grade) agrade from emp e
    -> join salgrade s on e.sal betweens.losal and s.hisal
    -> group by e.deptno;
+--------+--------+
| deptno |agrade |
+--------+--------+
|     10 | 3.6667 |
|     20 | 2.8000 |
|     30 | 2.5000 |
+--------+--------+
 
4、 求最高薪水(给出两种解决方案)
法一:mysql>select ename, max(sal) from emp;
+--------+----------+
| ename | max(sal) |
+--------+----------+
| SIMITH | 5000.00 |
+--------+----------+
法二:mysql>select ename,sal from emp order by sal desc limit 1;
+-------+---------+
| ename | sal     |
+-------+---------+
| KING | 5000.00 |
+-------+---------+
法三:mysql>select ename,sal from emp where sal not in(select distinct a.sal from emp ajoin emp b on a.sal < b.sal);
+-------+---------+
| ename | sal     |
+-------+---------+
| KING | 5000.00 |
+-------+---------+
 
5、 取得平均薪水最高的部门和部门编号(至少给出两种解决方案)
mysql>create table a5 as select deptno,avg(sal) asal from emp group by deptno;
法一:mysql> select deptno,max(asal) masal from a5;
+--------+-------------+
| deptno | masal       |
+--------+-------------+
|     10| 2916.666667 |
+--------+-------------+
select deptno,avg(sal) asal from emp group by deptno havingavg(sal) = (select max(t.asal) from (select deptno,avg(sal) asal from emp groupby deptno having avg(sal)) t);
法二:mysql>select deptno, asal from a5 order by asal desc limit 1;
+--------+-------------+
| deptno | asal        |
+--------+-------------+
|     10| 2916.666667 |
+--------+-------------+
    select deptno,avg(sal) asal from emp group by deptno having avg(sal) =(select avg(sal) from emp group by deptno order by avg(sal) desc limit 1);
 
6、 取得平均薪水最高的部门和部门名称
mysql>create table a6 as select deptno,avg(sal)  asal from emp group by deptno;
mysql>select d.dname, max(a6.asal) from dept d,a6 where d.deptno = a6.deptno;
+------------+--------------+
|dname      | max(a6.asal) |
+------------+--------------+
|ACCOUNTING |  2916.666667 |
+------------+--------------+
select d.dname,avg(e.sal)asal from emp e join dept d on e.deptno = d.deptno group by d.dname havingavg(e.sal) = (select avg(sal) from emp group by deptno order by avg(sal) desclimit 1);
 
7、 求平均薪水等级最低的部门的部门名称
mysql>select d.dname, avg(s.grade) agrade from emp e join dept d on e.deptno =d.deptno join salgrade s on e.sal between s.losal and s.hisal group by d.dnameorder by agrade asc limit 1;
+-------+--------+
| dname |agrade |
+-------+--------+
| SALES |2.5000 |
+-------+--------+
 
8、 取得比普通员工(院代码没有在mgr字段出现的)的最高薪水还要高的领导人姓名
mysql>select * from emp where empno not in(select distinct mgr from emp);
Empty set(0.00 sec)
无法查询到结果,原因是not in语句不会自动忽略空值,需要程序员手动排除NULL,即在语句后添加‘where mgr is not null’(这里KING没有mgr),但是in可以自动忽略空值
mysql>select * from emp where empno not in(select distinct mgr from emp where mgr isnot null);
+-------+--------+----------+------+------------+---------+---------+--------+
| empno |ename  | job      | mgr | hiredate   | sal     | comm   | deptno |
+-------+--------+----------+------+------------+---------+---------+--------+
|  7369 | SIMITH | CLERK    | 7902 |
4000
1980-12-17 |  800.00 |   NULL |     20 |
|  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 | SALEDMAN | 7698 | 1981-09-28| 1250.00 | 1400.00 |     30 |
|  7844 | TURNER | SALESMAN | 7698 | 1981-09-08| 1500.00 |    NULL |     30 |
|  7876 | ADAMS | CLERK    | 7788 | 1987-05-23 |1100.00 |    NULL |     20 |
|  7900 | JAMES | CLERK    | 7698 | 1981-12-03|  950.00 |    NULL |    30 |
|  7934 | MILLER | CLERK    |7782 | 1982-01-23 | 1300.00 |    NULL|     10 |
+-------+--------+----------+------+------------+---------+---------+--------+
mysql>select * from emp where empno in(select distinct mgr from emp);
+-------+-------+-----------+------+------------+---------+------+--------+
| empno |ename | job       | mgr  | hiredate  | sal     | comm | deptno |
+-------+-------+-----------+------+------------+---------+------+--------+
|  7902 | FORD | ANALYST   | 7566 | 1981-12-03 |3000.00 | NULL |     20 |
|  7698 | BLAKE | MANAGER   | 7839 | 1981-05-01 | 2850.00 | NULL |     30 |
|  7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL |     10 |
|  7566 | JONES | MANAGER   | 7839 | 1981-04-02 | 2975.00 | NULL |     20 |
|  7788 | SCOTT | ANALYST   | 7566 | 1987-04-19 | 3000.00 | NULL |     20 |
|  7782 | CLARK | MANAGER   | 7839 | 1981-06-09 | 2450.00 | NULL |     10 |
+-------+-------+-----------+------+------------+---------+------+--------+
selectb.ename,b.sal
from (selectmax(sal) msal from emp where empno not in(select distinct mgr from emp wheremgr is not null)) a
join (select* from emp where empno in(select distinct mgr from emp) b
on a.msal< b.sal;
+-------+---------+
| ename |sal     |
+-------+---------+
| JONES |2975.00 |
| BLAKE | 2850.00|
| CLARK |2450.00 |
| SCOTT |3000.00 |
| KING  | 5000.00 |
| FORD  | 3000.00 |
+-------+---------+
 
9、 取得薪水最高的前五名员工
mysql> select * from emp order by sal desc limit 5;
+-------+-------+-----------+------+------------+---------+------+--------+
| empno | ename | job      | mgr  | hiredate   | sal    | comm | deptno |
+-------+-------+-----------+------+------------+---------+------+--------+
|  7839 | KING  | PRESIDENT | NULL | 1981-11-17 | 5000.00 |NULL |     10 |
|  7902 | FORD  | ANALYST  | 3000 | 1981-12-03 | 3000.00 | NULL |     20 |
|  7788 | SCOTT |ANALYST   | 7566 | 1987-04-19 | 3000.00 |NULL |     20 |
|  7566 | JONES |MANAGER   | 7839 | 1981-04-02 | 2975.00 |NULL |     20 |
|  7698 | BLAKE |MANAGER   | 7839 | 1981-05-01 | 2850.00 |NULL |     30 |
+-------+-------+-----------+------+------------+---------+------+--------+
 
10、取得薪水最高的第六到第十名员工
mysql> select * from emp order by sal desc limit 5,5;
+-------+--------+----------+------+------------+---------+--------+--------+
| empno | ename  |job      | mgr  | hiredate  | sal     | comm   | deptno |
+-------+--------+----------+------+------------+---------+--------+--------+
|  7782 | CLARK  | MANAGER | 7839 | 1981-06-09 | 2450.00 |  NULL |     10 |
|  7499 | ALLEN  | SALESMAN | 7698 | 1981-02-20 | 1600.00 |300.00 |     30 |
|  7844 | TURNER |SALESMAN | 7698 | 1981-09-08 | 1500.00 |  NULL |     30 |
|  7934 | MILLER |CLERK    | 7782 | 1982-01-23 | 1300.00|   NULL |     10 |
|  7521 | WARD   | SALESMAN | 7698 | 1921-02-22 | 1250.00 |500.00 |     30 |
+-------+--------+----------+------+------------+---------+--------+--------+
 
11、取得最后入职的5名员工
mysql> select * from emp order by hiredate desc limit 5;
+-------+--------+---------+------+------------+---------+------+--------+
| empno | ename  |job     | mgr  | hiredate  | sal     | comm | deptno |
+-------+--------+---------+------+------------+---------+------+--------+
|  7876 | ADAMS  | CLERK  | 7788 | 1987-05-23 | 1100.00 | NULL |     20 |
|  7788 | SCOTT  | ANALYST | 7566 | 1987-04-19 | 3000.00 |NULL |     20 |
|  7934 | MILLER |CLERK   | 7782 | 1982-01-23 | 1300.00 |NULL |     10 |
|  7900 | JAMES  | CLERK  | 7698 | 1981-12-03 |  950.00 |NULL |     30 |
|  7902 | FORD   | ANALYST | 3000 | 1981-12-03 | 3000.00 |NULL |     20 |
+-------+--------+---------+------+------------+---------+------+--------+
 
12、取得每个薪水等级有多少员工
mysql> select s.grade,count(e.empno) from emp e joinsalgrade s on e.sal between s.losal and s.hisal group by s.grade;
+-------+----------------+
| grade | count(e.empno) |
+-------+----------------+
|     1 |              3 |
|     2 |              3 |
|     3 |              2 |
|     4 |              5 |
|     5 |              1 |
+-------+----------------+
 
13、面试题(58-59)
有三个表S(学生表),C(课程表),SC(学生选课表)
S(SNO,SNAME) 代表(学号,姓名)
C(CNO,CNAME,CTEACHER)代表(课号,课名,教师)
SC(SNO,CNO,SCGRADE)代表(学号、课号、成绩)
问题:
1、找出没选过‘黎明’老师的所有学生姓名;
2、列出2门以上(含2门)不及格学生姓名及平均成绩;
3、既学过1号课程又学过2号课所有学生的姓名。
思路:先在草稿纸模拟数据
s 学生表
sno(pk)   sname
-------------------------------------
1              a
2              b
3              c
4              d
 
c 学生表
cno(pk)   cname  cteacher
----------------------------------------
1              java   王老师
2              C++    张老师
3              C#     李老师
4              mysql  周老师
5              oracle 黎明
 
sc 学生选课表【一个主键,两个外键,sno+cno是复合主键,同时sno是外键,con也是外键】
sno    cno    scgrade
----------------------------------------
1         1      50
1      2      50
1      3      50
2      2      80
2      3      70
2      4      59
3      1      60
3      2      61
3      3      99
3      4      100
3      5      52
4      3      82
4      4      99
4      5      40
1、找出没选过‘黎明’老师的所有学生姓名;
第一步:找出黎明老师所授课课程编号
          select cno fromc where cteacher = ‘黎明’
第二步:通过学生选课表查询cno=上面结果的sno,这些sno都是选过课的学号
          select sno fromsc where cno = select cno from c where cteacher = ‘黎明’
第三步:在学生表中查询sno not in上面结果的数据
          select snamefrom s where sno not in select sno from sc where cno = select cno from c wherecteacher = ‘黎明’();
 
【我的方法】select sname from s where sno not in(select distinctsno from sc where cno in(select cno from c where cteacher = '黎明'));
+-------+
| sname |
+-------+
| a     |
| b     |
+-------+
 
2、列出2门以上(含2门)不及格学生姓名及平均成绩;
第一步:列出2门以上(含2门)不及格学生姓名
select s.sname from sc join s on sc.sno = s.sno wheresc.scgrade < 60 group by s.sname having count(*) >= 2;
第二步:找出每一个学生的平均成绩
select sno,avg(scgrade) avggrade from sc group by sno;
第三步: 第一步和第二步联合
select t1.sname,t2.avggrade
from (select s.sno,s.sname from sc join s on sc.sno = s.sno
where sc.scgrade < 60 group by s.sno,s.sname havingcount(*) >= 2) t1
join (select sc.sno,avg(scgrade) avggrade from sc group bysc.sno) t2
on t1.sno = t2.sno;
+-------+----------+
| sname | avggrade |
+-------+----------+
| a     |  50.0000 |
+-------+----------+
 
【我的方法】mysql> select s.sno,s.sname,avg(sc.scgrade)avggrade from s join sc on s.sno = sc.sno where s.sno = (select sno from scwhere scgrade < 60 group by sno having count(sno) >= 2) group by s.sno;
+-----+-------+----------+
| sno | sname | avggrade |
+-----+-------+----------+
|   1 | a     | 50.0000 |
+-----+-------+----------+
 
3、既学过1号课程又学过2号课所有学生的姓名。
第一步:找出学过1号课程的学生
select sno from sc where cno = 1
第一步:找出学过2号课程的学生
select sno from sc where cno = 2
第三步:第一步和第二步联合
select s.sname from sc join s on s.sno = sc.sno where sc.cno =1 and sc.cno in(select sno from sc where cno = 2)
第四步
 
【我的方法】select sname from s where sno = (select sno from scwhere cno = 1 and cno = 2);//失败
mysql> select sname from s where sno in (select sno from scwhere cno = 1 and cno in (select sno from sc where cno = 2));
+-------+
| sname |
+-------+
| a     |
| c     |
+-------+
 
14、列出所有员工及领导的姓名
mysql> select e.ename as empname,l.ename as leadername fromemp e left join emp l on e.mgr = l.empno;
+---------+------------+
| empname | leadername |
+---------+------------+
| SIMITH  | 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      |
+---------+------------+
 
15、列出受雇日期早于其直接上级的所有员工的编号、姓名、部门名称
mysql> select e.empno eno,e.ename ename,e.hiredateedate,l.empno lno,l.ename lname,l.hiredate ldate,d.dname dname from emp e joinemp l on e.mgr = l.empno and e.hiredate < l.hiredate join dept d on e.deptno= d.deptno;
+------+--------+------------+------+-------+------------+-------------+
| eno  | ename  | edate     | lno  | lname | ldate      | dname       |
+------+--------+------------+------+-------+------------+-------------+
| 7369 | SIMITH | 1980-12-17 | 7902 | FORD  | 1981-12-03 | RESEARCHING |
| 7499 | ALLEN  |1981-02-20 | 7698 | BLAKE | 1981-05-01 | SALES       |
| 7521 | WARD   | 1981-02-22| 7698 | BLAKE | 1981-05-01 | SALES      |
| 7566 | JONES  |1981-04-02 | 7839 | KING  | 1981-11-17 |RESEARCHING |
| 7698 | BLAKE  |1981-05-01 | 7839 | KING  | 1981-11-17 |SALES       |
| 7782 | CLARK  |1981-06-09 | 7839 | KING  | 1981-11-17 | ACCOUNTING  |
+------+--------+------------+------+-------+------------+-------------+
 
16、列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
mysql> select e.*,d.dname from emp e right join dept d one.deptno = d.deptno;
+------+--------+-----------+------+----------+---------+---------+-------+-----------+
|empno | ename  | job      | mgr  |hiredate | sal     | comm    | deptno | dname     |
+------+--------+-----------+------+-----------+---------+---------+------+-----------+
| 7369 | SIMITH | CLERK     | 7902 | 1980-12-17 |  800.00 |   NULL |   20 | RESEARCHIN|
| 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     |
| 7566 | JONES  | MANAGER  | 7839 | 1981-04-02 | 2975.00 |   NULL |   20 | RESEARCHING|
| 7654 | MARTIN | SALEDMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00|   30 | SALES     |
| 7698 | BLAKE  | MANAGER  | 7839 | 1981-05-01 | 2850.00 |   NULL |   30 | SALES     |
| 7782 | CLARK  | MANAGER  | 7839 | 1981-06-09 | 2450.00 |   NULL |   10 | ACCOUNTING|
| 7788 | SCOTT  | ANALYST  | 7566 | 1987-04-19 | 3000.00 |   NULL |   20 | RESEARCHING|
| 7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00|    NULL |   10 | ACCOUNTING|
| 7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    NULL |  30 | SALES     |
| 7876 | ADAMS  | CLERK    | 7788 | 1987-05-23 | 1100.00 |   NULL |   20 | RESEARCHING|
| 7900 | JAMES  | CLERK    | 7698 | 1981-12-03 |  950.00|    NULL |   30 | SALES     |
| 7902 | FORD   | ANALYST  | 7566 | 1981-12-03 | 3000.00 |   NULL |   20 | RESEARCHING|
| 7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |  10 | ACCOUNTING|
| NULL | NULL   | NULL     | NULL | NULL       |    NULL |   NULL | NULL | OPERATIONS|
+------+--------+-----------+------+-----------+---------+---------+------+-----------+
 
17、列出至少有5个员工的所有部门
mysql> select d.deptno,d.dname,e.ename,count(e.deptno) fromemp e join dept d on e.deptno = d.deptno group by e.deptno havingcount(e.deptno) >= 5;
+--------+-------------+--------+-----------------+
| deptno | dname       |ename  | count(e.deptno) |
+--------+-------------+--------+-----------------+
|     20 | RESEARCHING |SIMITH |               5 |
|     30 | SALES       | ALLEN |               6 |
+--------+-------------+--------+-----------------+
 
18、列出薪金比‘simith’多的所有员工信息
mysql> select * from emp where sal > (select sal from empwhere ename = 'simith');
+-------+--------+-----------+------+------------+---------+---------+--------+
| 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 |SALEDMAN  | 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 |   NU
f0be
LL |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00|    NULL |     10 |
|  7844 | TURNER |SALESMAN  | 7698 | 1981-09-08 | 1500.00|    NULL |     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 |
+-------+--------+-----------+------+------------+---------+---------+--------+
 
19、列出所有‘clerk’(办事员)的姓名及部门名称,部门人数
mysql> select e.ename,d.dname,c.deptcount
    -> from (select *from emp where job = 'clerk') e
    -> join dept d one.deptno = d.deptno
    -> join (selectdeptno,count(deptno) deptcount from emp group by deptno) c
    -> on e.deptno =c.deptno;
+--------+-------------+-----------+
| ename  | dname       | deptcount |
+--------+-------------+-----------+
| SIMITH | RESEARCHING |        5 |
| ADAMS  | RESEARCHING|         5 |
| JAMES  | SALES       |        6 |
| MILLER | ACCOUNTING |         3 |
+--------+-------------+-----------+
 
20、列出最低薪金大于1500的各种工作及从事此工作的全部雇员人数
mysql> select job,min(sal) minsal,count(job) jobcount fromemp group by job having min(sal) >1500;
+-----------+---------+----------+
| job       | minsal  | jobcount |
+-----------+---------+----------+
| ANALYST   | 3000.00|        2 |
| MANAGER   | 2450.00|        3 |
| PRESIDENT | 5000.00 |       1 |
+-----------+---------+----------+
 
21、列出在部门‘sales’(销售部)工作的员工的姓名,假定不知道销售部的部门编号
mysql> select d.deptno,d.dname,e.ename from emp e join deptd on e.deptno = d.deptno having d.deptno = (select deptno from dept where dname= 'sales');
+--------+-------+--------+
| deptno | dname | ename |
+--------+-------+--------+
|     30 | SALES |ALLEN  |
|     30 | SALES |WARD   |
|     30 | SALES | MARTIN|
|     30 | SALES |BLAKE  |
|     30 | SALES | TURNER|
|     30 | SALES |JAMES  |
+--------+-------+--------+
 
22、列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,雇员的工资等级
mysql> select a.empno,a.ename,a.mgr,a.deptno,s.grade fromemp a join (select avg(sal) avgsal from emp) b on a.sal > b.avgsal joinsalgrade s on a.sal between s.losal and s.hisal;
+-------+-------+------+--------+-------+
| empno | ename | mgr  |deptno | grade |
+-------+-------+------+--------+-------+
|  7566 | JONES | 7839|     20 |     4 |
|  7698 | BLAKE | 7839|     30 |     4 |
|  7782 | CLARK | 7839|     10 |     4 |
|  7788 | SCOTT | 7566|     20 |     4 |
|  7902 | FORD  | 7566 |    20 |     4 |
|  7839 | KING  | NULL |    10 |     5 |
+-------+-------+------+--------+-------+
 
23、列出与‘scott’从事相同工作的所有员工及部门名称
mysql> select e.ename,d.dname from emp e join dept d one.deptno = d.deptno where e.job = (select job from emp where ename = 'scott');
+-------+-------------+
| ename | dname       |
+-------+-------------+
| SCOTT | RESEARCHING |
| FORD  | RESEARCHING |
+-------+-------------+
mysql> select e.ename,d.dname from emp e join dept d one.deptno = d.deptno where e.job = (select job from emp where ename = 'scott')and ename != 'scott';
+-------+-------------+
| ename | dname       |
+-------+-------------+
| FORD  | RESEARCHING |
+-------+-------------+
 
24、列出薪金等于部门30中员工的薪金的其他员工的姓名和薪金
mysql> select deptno,ename,sal from emp where sal in(selectdistinct sal from emp where deptno = 30) and deptno != 30;
 
25、列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金,部门名称
mysql> select e.ename,e.sal,d.dname from emp e
    -> join dept d one.deptno = d.deptno
    -> where e.sal> (select max(sal) from emp where deptno = 30);
+-------+---------+-------------+
| ename | sal     |dname       |
+-------+---------+-------------+
| JONES | 2975.00 | RESEARCHING |
| SCOTT | 3000.00 | RESEARCHING |
| KING  | 5000.00 |ACCOUNTING  |
| FORD  | 3000.00 |RESEARCHING |
+-------+---------+-------------+
 
26、列出在每个部门工作的员工数量,平均工资和平均服务期限
mysql> select d.deptno,count(e.deptno)deptcount,ifnull(avg(e.sal),0) avgsal,
    ->ifnull(avg((to_days(now()) - to_days(hiredate))/365),0) days
    -> from emp e
    -> right join deptd on e.deptno = d.deptno
    -> group byd.deptno;
+--------+-----------+-------------+-------------+
| deptno | deptcount | avgsal      | days        |
+--------+-----------+-------------+-------------+
|     10 |         3 | 2916.666667 | 36.37900000 |
|     20 |         5 | 2175.000000 | 34.40602000 |
|     30 |         6 | 1566.666667 | 36.67761667 |
|     40 |         0 |   0.000000 |  0.00000000 |
+--------+-----------+-------------+-------------+
 
27、列出所有员工的姓名、部门名称、工资
mysql> select e.ename,d.dname,e.sal from emp e join dept don e.deptno = d.deptno;
+--------+-------------+---------+
| ename  | dname       | sal    |
+--------+-------------+---------+
| SIMITH | RESEARCHING | 800.00 |
| ALLEN  | SALES       | 1600.00 |
| WARD   | SALES       | 1250.00 |
| JONES  | RESEARCHING |2975.00 |
| MARTIN | SALES       |1250.00 |
| BLAKE  | SALES       | 2850.00 |
| CLARK  | ACCOUNTING  | 2450.00 |
| SCOTT  | RESEARCHING |3000.00 |
| KING   |ACCOUNTING  | 5000.00 |
| TURNER | SALES       |1500.00 |
| ADAMS  | RESEARCHING |1100.00 |
| JAMES  | SALES       | 950.00 |
| FORD   | RESEARCHING |3000.00 |
| MILLER | ACCOUNTING  |1300.00 |
+--------+-------------+---------+
 
28、列出所有部门的详细信息和人数
mysql> select d.*,count(e.deptno) deptcount from emp e rightjoin dept d on e.deptno = d.deptno group by e.deptno;
+--------+-------------+----------+-----------+
| deptno | dname       |loc      | deptcount |
+--------+-------------+----------+-----------+
|     40 |OPERATIONS  | BOSTON   |        0 |
|     10 |ACCOUNTING  | NEW YORK |         3 |
|     20 | RESEARCHING |DALLAS   |         5 |
|     30 | SALES       | CHICAGO  |        6 |
+--------+-------------+----------+-----------+
 
29、列出各种工作的最低工资以及从事此工作的雇员姓名
mysql> select e.ename,e.sal,a.minsal from emp e
    -> join (selectjob,min(sal) minsal from emp group by job) a
    -> on e.sal =a.minsal;
+--------+---------+---------+
| ename  | sal     | minsal |
+--------+---------+---------+
| SIMITH |  800.00 |  800.00 |
| WARD   | 1250.00 |1250.00 |
| MARTIN | 1250.00 | 1250.00 |
| CLARK  | 2450.00 |2450.00 |
| SCOTT  | 3000.00 |3000.00 |
| KING   | 5000.00 |5000.00 |
| FORD   | 3000.00 |3000.00 |
+--------+---------+---------+
 
30、列出各个部门的manager的最低薪金
mysql> select e.ename,e.job,min(e.sal),e.deptno minsal fromemp e where e.job = 'manager' group by e.deptno;
+-------+---------+------------+--------+
| ename | job     |min(e.sal) | minsal |
+-------+---------+------------+--------+
| CLARK | MANAGER |   2450.00 |     10 |
| JONES | MANAGER |   2975.00 |     20 |
| BLAKE | MANAGER |   2850.00 |     30 |
+-------+---------+------------+--------+
 
31、列出员工的年工资,按年薪从低到高排序
mysql> select *,(sal + ifnull(comm,0)) * 12 ysal from emporder by ysal asc;
+-------+--------+-----------+------+------------+---------+---------+--------+----------+
| empno | ename  | job      | mgr  | hiredate   | sal    | comm  | deptno |  ysal  |
+-------+--------+-----------+------+------------+---------+---------+-----+----------+
| 7369 | SIMITH | CLERK     | 7902 |1980-12-17 |  800.00 |    NULL | 20 |  9600.00 |
| 7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |   NULL |  30 | 11400.00 |
|  7876 | ADAMS | CLERK     | 7788 | 1987-05-23 |1100.00 |    NULL |  20 | 13200.00 |
| 7934 | MILLER | CLERK     | 7782 |1982-01-23 | 1300.00 |    NULL |  10 | 15600.00 |
| 7844 | TURNER | SALESMAN  | 7698 |1981-09-08 | 1500.00 |    NULL |  30 | 18000.00 |
| 7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 | 30 | 21000.00 |
| 7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 | 30 | 22800.00 |
| 7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL | 10 | 29400.00 |
| 7654 | MARTIN | SALESMAN  | 7698 |1981-09-28 | 1250.00 | 1400.00 |  30 |31800.00 |
| 7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL | 30 | 34200.00 |
| 7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL | 20 | 35700.00 |
| 7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL | 20 | 36000.00 |
| 7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL | 20 | 36000.00 |
| 7839 | KING   | PRESIDENT | NULL |1981-11-17 | 5000.00 |    NULL |  10 | 60000.00 |
+-------+--------+-----------+------+------------+---------+---------+-----+----------+
 
32、求出员工领导的薪水超过3000的员工名称与领导姓名
mysql> select e.ename empname,e.job empjob,e.salempsal,l.ename leadername,l.sal leadersal
    -> from emp e joinemp l on e.mgr = l.empno
    -> where l.sal> 3000;
+---------+---------+---------+------------+-----------+
| empname | empjob  |empsal  | leadername | leadersal |
+---------+---------+---------+------------+-----------+
| JONES   | MANAGER | 2975.00| KING       |   5000.00 |
| BLAKE   | MANAGER |2850.00 | KING       |   5000.00 |
| CLARK   | MANAGER |2450.00 | KING       |   5000.00 |
+---------+---------+---------+------------+-----------+
 
33、求出部门名称中,带有‘s’字符的部门员工的工资合计、部门人数
mysql> select d.dname,sum(e.sal) cumsal,count(e.deptno)deptcount
    -> from emp eright join dept d on e.deptno = d.deptno
    -> group bye.deptno
    -> having d.dnamelike '%s%';
+-------------+----------+-----------+
| dname       |cumsal   | deptcount |
+-------------+----------+-----------+
| OPERATIONS  |     NULL |         0 |
| RESEARCHING | 10875.00 |         5 |
| SALES       |  9400.00 |         6 |
+-------------+----------+-----------+
 
34、给任职日期超过35年的员工加薪10%
mysql> create table emp_bak as select * from emp;
mysql> update emp_bak set sal = sal * 1.1 where((to_days(now()) - to_days(hiredate))/365) > 35;
mysql> select * from emp_bak;
+-------+--------+-----------+------+------------+---------+---------+--------+
| empno | ename  |job       | mgr  | hiredate  | sal     | comm    | deptno |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7369 | SIMITH |CLERK     | 7902 | 1980-12-17 |  880.00 |   NULL |     20 |
|  7499 | ALLEN  | SALESMAN | 7698 | 1981-02-20 | 1760.00 | 300.00 |     30 |
|  7521 | WARD   | SALESMAN | 7698 | 1981-02-22 | 1375.00 | 500.00 |     30 |
|  7566 | JONES  | MANAGER  | 7839 | 1981-04-02 | 3272.50 |   NULL |     20 |
|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1375.00 | 1400.00|     30 |
|  7698 | BLAKE  | MANAGER  | 7839 | 1981-05-01 | 3135.00 |   NULL |     30 |
|  7782 | CLARK  | MANAGER  | 7839 | 1981-06-09 | 2695.00 |   NULL |     10 |
|  7788 | SCOTT  | ANALYST  | 7566 | 1987-04-19 | 3000.00 |   NULL |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5500.00|    NULL |     10 |
|  7844 | TURNER |SALESMAN  | 7698 | 1981-09-08 | 1650.00|    NULL |     30 |
|  7876 | ADAMS  | CLERK    | 7788 | 1987-05-23 | 1100.00 |   NULL |     20 |
|  7900 | JAMES  | CLERK    | 7698 | 1981-12-03 | 1045.00 |   NULL |     30 |
|  7902 | FORD   | ANALYST  | 7566 | 1981-12-03 | 3300.00 |   NULL |     20 |
|  7934 | MILLER |CLERK     | 7782 | 1982-01-23 | 1430.00|    NULL |     10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
mysql> select * from emp;
+-------+--------+-----------+------+------------+---------+---------+--------+
| empno | ename  |job       | mgr  | hiredate  | sal     | comm    | deptno |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7369 | SIMITH |CLERK     | 7902 | 1980-12-17 |  800.00 |   NULL |     20 |
|  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|    NULL |     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 |
+-------+--------+-----------+------+------------+---------+---------+--------+附录bjpowernodeSQL文drop table if exists dept;
drop table if exists salgrade;
drop table if exists emp;

create table dept(
deptno int(10) primary key,
dname varchar(14),
loc varchar(13)
);

create table salgrade(
grade int(11),
losal int(11),
hisal int(11)
);

create table emp(
empno int(4) primary key,
ename varchar(10),
job varchar(9),
mgr int(4),
hiredate date,
sal double(7,2),
comm double(7,2),
deptno int(2)
);

insert into dept(deptno,dname,loc) values(10,'ACCOUNTING','NEW YORK');
insert into dept(deptno,dname,loc) values(20,'RESEARCHING','DALLAS');
insert into dept(deptno,dname,loc) values(30,'SALES','CHICAGO');
insert into dept(deptno,dname,loc) values(40,'OPERATIONS','BOSTON');

insert into salgrade(grade,losal,hisal) values(1,700,1200);
insert into salgrade(grade,losal,hisal) values(2,1201,1400);
insert into salgrade(grade,losal,hisal) values(3,1401,2000);
insert into salgrade(grade,losal,hisal) values(4,2001,3000);
insert into salgrade(grade,losal,hisal) values(5,3001,5000);

insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
values(7369,'SIMITH','CLERK',7902,'1980-12-17',800,null,20);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,null,20);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,null,30);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,null,10);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,null,20);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
values(7839,'KING','PRESIDENT',null,'1981-11-17',5000,null,10);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,null,30);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,null,20);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
values(7900,'JAMES','CLERK',7698,'1981-12-03',950,null,30);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,null,20);
insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,null,10);

select * from dept;
select * from salgrade;
select * from emp;
13题SQL文drop table if exists s;
drop table if exists c;
drop table if exists sc;

create table s(
sno int(10) primary key,
sname varchar(14)
);

create table c(
cno int(10) primary key,
cname varchar(14),
cteacher varchar(14)
);

create table sc(
sno int(10),
cno int(10),
scgrade int(10),
primary key(sno,cno)
);

insert into s(sno,sname) values(1,'a');
insert into s(sno,sname) values(2,'b');
insert into s(sno,sname) values(3,'c');
insert into s(sno,sname) values(4,'d');

insert into c(cno,cname,cteacher) values(1,'java','王老师');
insert into c(cno,cname,cteacher) values(2,'C++','张老师');
insert into c(cno,cname,cteacher) values(3,'C#','李老师');
insert into c(cno,cname,cteacher) values(4,'mysql','周老师');
insert into c(cno,cname,cteacher) values(5,'oracle','黎明');

insert into sc(sno,cno,scgrade) values(1,1,50);
insert into sc(sno,cno,scgrade) values(1,2,50);
insert into sc(sno,cno,scgrade) values(1,3,50);
insert into sc(sno,cno,scgrade) values(2,2,80);
insert into sc(sno,cno,scgrade) values(2,3,70);
insert into sc(sno,cno,scgrade) values(2,4,59);
insert into sc(sno,cno,scgrade) values(3,1,60);
insert into sc(sno,cno,scgrade) values(3,2,61);
insert into sc(sno,cno,scgrade) values(3,3,99);
insert into sc(sno,cno,scgrade) values(3,4,100);
insert into sc(sno,cno,scgrade) values(3,5,52);
insert into sc(sno,cno,scgrade) values(4,3,82);
insert into sc(sno,cno,scgrade) values(4,4,99);
insert into sc(sno,cno,scgrade) values(4,5,40);

select * from s;
select * from c;
select * from sc;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息