mysql 练习题
数据库及表的数据
# 创建database create database monkey1024; # 创建tables 岗位信息 create table dept( DEPTNO int(2), DNAME varchar(14), LOC varchar(13) ); # 插入数据 INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK'); INSERT INTO dept values(20, 'RESEARCH', 'DALLAS'); INSERT INTO dept values(30, 'SALES', 'CHICAGO'); INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON'); # 创建tables 员工信息 create table emp( EMPNO int(4), ENAME varchar(10), JOB varchar(9), MGR int(4), HIREDATE date, SAL double(7,2), COMM double(7,2), DEPTNO int(2) ); # 插入数据 # 括号里面的内容:员工编号;姓名;岗位;上级领导的标号;入职日期;薪水;补助;部门编号 INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20); INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30); INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30); INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20); INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30); INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30); INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10); INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20); INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10); INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30); INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20); INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30); INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20); INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10); # 创建tables 薪水级别 create table salgrade( GRADE int(11), HISAL int(11), LOSAL int(11) ); # 插入数据 INSERT INTO salgrade VALUES (1,1200,700); INSERT INTO salgrade VALUES (2,1400,1201); INSERT INTO salgrade VALUES (3,2000,1401); INSERT INTO salgrade VALUES (4,3000,2001); INSERT INTO salgrade VALUES (5,9999,3001);
练习1.获取每个部门的薪水最高的人员的名字
select ENAME,max(SAL) FROM emp group by DEPTNO;
注:如果觉得这个对的话,不妨对照以下emp表中具体的内容.可以发现匹配的名字是不准确的.这是因为分组后,select后面只能跟聚合函数,或者分组的依据.
SELECT e.ENAME, t.maxSal FROM emp e JOIN (SELECT DEPTNO, MAX(SAL) AS maxSal FROM emp GROUP BY DEPTNO) t ON e.DEPTNO = t.DEPTNO WHERE e.sal = t.maxSal;
查询结果
+-------+---------+ | ENAME | maxSal | +-------+---------+ | BLAKE | 2850.00 | | SCOTT | 3000.00 | | KING | 5000.00 | | FORD | 3000.00 | +-------+---------+
练习2:哪些人的薪水在部门平均值之上
SELECT e.ENAME, e.SAL, t.avgSal FROM emp e JOIN (SELECT DEPTNO, (SAL) AS avgSal FROM emp GROUP BY DEPTNO) t ON t.DEPTNO = e.DEPTNO WHERE e.SAL > t.avgSal;
查询结果:
+-------+---------+---------+ | ENAME | SAL | avgSal | +-------+---------+---------+ | JONES | 2975.00 | 800.00 | | BLAKE | 2850.00 | 1600.00 | | SCOTT | 3000.00 | 800.00 | | KING | 5000.00 | 2450.00 | | ADAMS | 1100.00 | 800.00 | | FORD | 3000.00 | 800.00 | +-------+---------+---------+
3.查看每个部门平均薪水等级
SELECT
t.DEPTNO, t.avgSal, s.GRADE
FROM
salgrade s
JOIN
(SELECT
DEPTNO, AVG(SAL) AS avgSal
FROM
emp
GROUP BY DEPTNO) t ON t.avgSal BETWEEN s.LOSAL AND s.HISAL;
注:这里的between后面是先小后大.
查询结果
+--------+-------------+-------+ | DEPTNO | avgSal | GRADE | +--------+-------------+-------+ | 10 | 2916.666667 | 4 | | 20 | 2175.000000 | 4 | | 30 | 1566.666667 | 3 | +--------+-------------+-------+
4.查看每个人的薪资的级别
SELECT
t.Name, t.pSal, s.GRADE
FROM
salgrade s
JOIN
(SELECT
ENAME AS Name, SAL AS pSal
FROM
emp) t ON t.pSal BETWEEN s.LOSAL AND s.HISAL;
注:与上一练习一样啦.
5.不用max()函数获得最高的薪水
select SAL from emp order by SAL desc limit 0,1;
6.获得所有部门平均薪资最高的部门编号
SELECT
MAX(t.avgSal)
FROM
emp e
JOIN
(SELECT
DEPTNO, AVG(SAL) AS avgSal
FROM
emp
GROUP BY DEPTNO) t ON e.DEPTNO = t.DEPTNO;
查询结果
+---------------+
| MAX(t.avgSal) |
+---------------+
| 2916.666667 |
+---------------+
当然可以简化查询语句
select max(t.avgSal) from (select DEPTNO,avg(SAL) as avgSal from emp group by DEPTNO) t;
接下来就要查看其部门编号了
select DEPTNO ,avg(SAL) as avgSal from emp group by DEPTNO having avgSal= (select max(t.avgSal) from (select DEPTNO,avg(SAL) as avgSal from emp group by DEPTNO) t);
查询结果
+--------+-------------+ | DEPTNO | avgSal | +--------+-------------+ | 10 | 2916.666667 | +--------+-------------+
当然还有一种简单的方法
select DEPTNO,avg(SAL) as avgSal from emp group by DEPTNO order by avgSal desc limit 0,1;
注:查询出所有部门的编号和平均薪资,然后倒序排列结果,再选取第一条数据.
7.查询最高薪资部门的名字
select d.DNAME,d.DEPTNO from dept d join (select DEPTNO,avg(SAL) as avgSal from emp group by DEPTNO order by avgSal desc limit 0,1) t on d.DEPTNO=t.DEPTNO;
查询结果
+------------+--------+
| DNAME | DEPTNO |
+------------+--------+
| ACCOUNTING | 10 |
+------------+--------+
8.求平均薪资水平最低的部门
SELECT
d.DNAME, d.DEPTNO
FROM
dept d
JOIN
(SELECT
t.DEPTNO, MIN(t.GRADE)
FROM
(SELECT
s.GRADE, t.DEPTNO
FROM
salgrade s
JOIN (SELECT
DEPTNO, AVG(SAL) AS avgSal
FROM
emp
GROUP BY DEPTNO) t ON t.avgSal BETWEEN s.LOSAL AND s.HISAL) t) t1 ON d.DEPTNO = t1.DEPTNO;
9.找出比普通员工(非MANAGER)最高工资还高的经理的名字
select e.ENAME from emp e join (select distinct(MGR) as mgr from emp where MGR is not null) t on e.EMPNO=t.mgr where e.SAL> (select max(SAL) as maxSal from emp where EMPNO not in (select distinct(MGR) from emp where MGR is not null));
查询结果
+-------+ | ENAME | +-------+ | JONES | | BLAKE | | CLARK | | SCOTT | | KING | | FORD | +-------+
10.查询每个薪水等级有多少员工
Step1查询每个员工的员工编号和薪水等级
select e.EMPNO,s.GRADE from emp e join salgrade s on e.SAL between s.LOSAL and s.HISAL;
查询结果
+-------+-------+ | EMPNO | GRADE | +-------+-------+ | 7369 | 1 | | 7499 | 3 | | 7521 | 2 | | 7566 | 4 | | 7654 | 2 | | 7698 | 4 | | 7782 | 4 | | 7788 | 4 | | 7839 | 5 | | 7844 | 3 | | 7876 | 1 | | 7900 | 1 | | 7902 | 4 | | 7934 | 2 | +-------+-------+
Step2查询每个等级里的员工个数
select t.GRADE ,count(t.EMPNO) from ( select e.EMPNO,s.GRADE from emp e join salgrade s on e.SAL between s.LOSAL and s.HISAL) t group by t.GRADE;
11.列出所有入职日期大于其上级入职日期的员工
select a.ENAME,a.HIREDATE,b.ENAME as uName from emp a join emp b on a.MGR=b.EMPNO where a.HIREDATE>b.HIREDATE;
查询结果
+--------+------------+-------+ | ENAME | HIREDATE | uName | +--------+------------+-------+ | SCOTT | 1987-04-19 | JONES | | FORD | 1981-12-03 | JONES | | MARTIN | 1981-09-28 | BLAKE | | TURNER | 1981-09-08 | BLAKE | | JAMES | 1981-12-03 | BLAKE | | MILLER | 1982-01-23 | CLARK | | ADAMS | 1987-05-23 | SCOTT | +--------+------------+-------+
12.列出至少有5个员工的部门名称
select d.DNAME,d.DEPTNO from dept d join (select e.DEPTNO,count(e.EMPNO) from emp e group by e.DEPTNO having count(DEPTNO)>=5) t on d.DEPTNO=t.DEPTNO;
查询结果
+----------+--------+ | DNAME | DEPTNO | +----------+--------+ | RESEARCH | 20 | | SALES | 30 | +----------+--------+
13.列出最低薪资大于1500的工作及其员工人数
select JOB,min(SAL),count(*) from emp group by job having min(SAL)>1500;
14.查询从事"SALES"工作的人员姓名
select e.ENAME from emp e join (select DEPTNO from dept where DNAME='SALES') t on e.DEPTNO=t.DEPTNO;
查询结果
+--------+ | ENAME | +--------+ | ALLEN | | WARD | | MARTIN | | BLAKE | | TURNER | | JAMES | +--------+
浙公网安备 33010602011771号