创建表以及添加数据
DROP TABLE IF EXISTS EMP;
DROP TABLE IF EXISTS DEPT;
DROP TABLE IF EXISTS SALGRADE;
CREATE TABLE DEPT
(DEPTNO int(2) not null ,
DNAME VARCHAR(14) ,
LOC VARCHAR(13),
primary key (DEPTNO)
);
CREATE TABLE EMP
(EMPNO int(4) not null ,
ENAME VARCHAR(10),
JOB VARCHAR(9),
MGR INT(4),
HIREDATE DATE DEFAULT NULL,
SAL DOUBLE(7,2),
COMM DOUBLE(7,2),
primary key (EMPNO),
DEPTNO INT(2)
)
;
CREATE TABLE SALGRADE
( GRADE INT,
LOSAL INT,
HISAL INT );
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES (
10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES (
20, 'RESEARCH', 'DALLAS');
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES (
30, 'SALES', 'CHICAGO');
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES (
40, 'OPERATIONS', 'BOSTON');
commit;
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
7369, 'SMITH', '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, 0, 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);
commit;
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, 9999);
commit;
开始实战
/********************************************************************************************************/
1.取得每个部门最高薪水的人员名称
第一步:求出每个部门的最高薪水
SELECT DEPTNO ,MAX(SAL) MAXSAL FROM EMP GROUP BY DEPTNO;
+--------+---------+
| deptno | maxsal |
+--------+---------+
| 10 | 5000.00 |
| 20 | 3000.00 |
| 30 | 2850.00 |
+--------+---------+
将以上查询结果当成一张临时表t(deptno,maxal)
第二步:将t表与emp表进行表连接,表连接的条件:t.deptno = e.deptno 数据过滤条件:t.maxsal = e.sal
SELECT E.ENAME,E.SAL ,E.DEPTNO
FROM EMP E
JOIN (SELECT DEPTNO ,MAX(SAL) MAXSAL FROM EMP GROUP BY DEPTNO ) ES
ON E.DEPTNO = ES.DEPTNO AND E.SAL = ES.MAXSAL
ORDER BY E.DEPTNO;
第三步:查询结果
+--------+-------+---------+
| deptno | ename | sal |
+--------+-------+---------+
| 10 | KING | 5000.00 |
| 20 | SCOTT | 3000.00 |
| 20 | FORD | 3000.00 |
| 30 | BLAKE | 2850.00 |
+--------+-------+---------+
/********************************************************************************************************/
2.哪些人的薪水在部门平均薪水之上
第一步:按照部门编号分组,求出部门的平均薪水
SELECT DEPTNO ,AVG(SAL) AVGSAL FROM EMP GROUP BY DEPTNO;
将以上查询结果当成临时表t(deptno,avgsal)
+--------+-------------+
| deptno | avgsal |
+--------+-------------+
| 10 | 2916.666667 |
| 20 | 2175.000000 |
| 30 | 1566.666667 |
+--------+-------------+
第二步:将t表与emp表进行表连接,条件:t.deptno = e.deptno 数据过滤条件:e.sal > t.avgsal
SELECT E.DEPTNO, E.ENAME,E.SAL ,AVGSAL
FROM EMP E
JOIN ( SELECT DEPTNO ,AVG(SAL) AVGSAL FROM EMP GROUP BY DEPTNO )DS
ON E.DEPTNO = DS.DEPTNO AND E.SAL > DS.AVGSAL;
+--------+-------+---------+-------------+
| deptno | ename | sal | avgsal |
+--------+-------+---------+-------------+
| 30 | ALLEN | 1600.00 | 1566.666667 |
| 20 | JONES | 2975.00 | 2175.000000 |
| 30 | BLAKE | 2850.00 | 1566.666667 |
| 20 | SCOTT | 3000.00 | 2175.000000 |
| 10 | KING | 5000.00 | 2916.666667 |
| 20 | FORD | 3000.00 | 2175.000000 |
+--------+-------+---------+-------------+
/********************************************************************************************************/
3.取得部门中(所有人的)平均薪水等级
第一步:按照部门编号分组,计算每个部门的平均工资
SELECT DEPTNO,AVG(SAL) AVGSAL FROM EMP GROUP BY DEPTNO;
+--------+-------------+
| DEPTNO | AVGSAL |
+--------+-------------+
| 10 | 2916.666667 |
| 20 | 2175.000000 |
| 30 | 1566.666667 |
+--------+-------------+
第二部:将以上查询结果当成临时表t 和薪水级别表进行连接
SELECT DS.DEPTNO ,DS.AVGSAL,G.GRADE
FROM SALGRADE G
JOIN (SELECT DEPTNO,AVG(SAL) AVGSAL FROM EMP GROUP BY DEPTNO) DS
ON DS.AVGSAL BETWEEN G.LOSAL AND G.HISAL;
+--------+-------------+-------+
| DEPTNO | AVGSAL | GRADE |
+--------+-------------+-------+
| 30 | 1566.666667 | 3 |
| 10 | 2916.666667 | 4 |
| 20 | 2175.000000 | 4 |
+--------+-------------+-------+
3 rows in set (0.00 sec)
/********************************************************************************************************/
4.不准用组函数(MAX),取得最高薪水(给出两种解决方案)
第一种:按照平均工资降序排列,取第一条数据
select sal from emp order by sal desc limit 1;
+---------+
| sal |
+---------+
| 5000.00 |
+---------+
第二种方式:
(1)把员工表当做a表 查询a表的所有的工资
SELECT SAL FROM EMP;
a表
+---------+
| sal |
+---------+
| 800.00 |
| 1600.00 |
| 1250.00 |
| 2975.00 |
| 1250.00 |
| 2850.00 |
| 2450.00 |
| 3000.00 |
| 5000.00 |
| 1500.00 |
| 1100.00 |
| 950.00 |
| 3000.00 |
| 1300.00 |
+---------+
(2)把员工表当做b表 查询b表的所有的工资
b表
+---------+
| sal |
+---------+
| 800.00 |
| 1600.00 |
| 1250.00 |
| 2975.00 |
| 1250.00 |
| 2850.00 |
| 2450.00 |
| 3000.00 |
| 5000.00 |
| 1500.00 |
| 1100.00 |
| 950.00 |
| 3000.00 |
| 1300.00 |
+---------+
(3)连接a表和b表,a表中的所有工资 < b表中的工资,也就是小于表中的最高工资
SELECT DISTINCT E.SAL FROM EMP E JOIN EMP M ON (E.SAL < M.SAL)
+---------+
| SAL |
+---------+
| 800.00 |
| 1250.00 |
| 1500.00 |
| 1100.00 |
| 950.00 |
| 1300.00 |
| 1600.00 |
| 2850.00 |
| 2450.00 |
| 2975.00 |
| 3000.00 |
+---------+
(4)从emp表中查询数据,条件是sal不在上面的结果之内
SELECT SAL
FROM EMP
WHERE SAL NOT IN (SELECT DISTINCT E.SAL FROM EMP E JOIN EMP M ON (E.SAL < M.SAL));
+---------+
| SAL |
+---------+
| 5000.00 |
+---------+
/********************************************************************************************************/
5.取得平均薪水最高的部门的部门编号(至少两个方案)
第一种方案:
(1)按照部门编号分组,求出每个部门的平均薪水.按照平均工资降序排列,去第一条数据
SELECT DEPTNO,AVG(SAL) AVGSAL
FROM EMP
GROUP BY DEPTNO
ORDER BY AVGSAL DESC
LIMIT 1;
+--------+-------------+
| deptno | avgsal |
+--------+-------------+
| 10 | 2916.666667 |
+--------+-------------+
第二种方案:
(1)按照部门编号分组,查询每个部门的平均工资
SELECT DEPTNO,AVG(SAL) AVGSAL FROM EMP GROUP BY DEPTNO
+--------+-------------+
| deptno | avgsal |
+--------+-------------+
| 10 | 2916.666667 |
| 20 | 2175.000000 |
| 30 | 1566.666667 |
+--------+-------------+
(2)将以上查询结果当成临时表t(deptno,avgsal) ,从临时表中查询最大的avgsal
SELECT DS.DEPTNO, MAX(DS.AVGSAL) MAXAVGSAL
FROM ( SELECT DEPTNO,AVG(SAL) AVGSAL FROM EMP GROUP BY DEPTNO ) DS
+--------+-------------+
| DEPTNO | MAXAVGSAL |
+--------+-------------+
| 10 | 2916.666667 |
+--------+-------------+
/********************************************************************************************************/
6.取得平均薪水最高的部门的部门名称
(1)按照部门编号分组,查询每个部门的平均工资,并且查询出平均工资最高的部门
SELECT DS.DEPTNO, MAX(DS.AVGSAL) MAXAVGSAL
FROM ( SELECT DEPTNO,AVG(SAL) AVGSAL FROM EMP GROUP BY DEPTNO ) DS
+--------+-------------+
| deptno | avgsal |
+--------+-------------+
| 10 | 2916.666667 |
| 20 | 2175.000000 |
| 30 | 1566.666667 |
+--------+-------------+
(2)将上面的查询结果当做一个临时表t,部门表d连接,条件是t.deptno = d.deptno
SELECT D.DEPTNO ,D.DNAME,DS1.MAXAVGSAL
FROM DEPT D
JOIN ( SELECT DS.DEPTNO, MAX(DS.AVGSAL) MAXAVGSAL
FROM ( SELECT DEPTNO,AVG(SAL) AVGSAL FROM EMP GROUP BY DEPTNO ) DS ) DS1
ON D.DEPTNO = DS1.DEPTNO;
+--------+------------+-------------+
| DEPTNO | DNAME | MAXAVGSAL |
+--------+------------+-------------+
| 10 | ACCOUNTING | 2916.666667 |
+--------+------------+-------------+
/********************************************************************************************************/
7.求平均薪水的等级最低的部门的部门名称
(1)求每个部门的平均薪水,查询最低的平均工资及其部门编号
SELECT DEPTNO ,AVG(SAL) AVGSAL FROM EMP GROUP BY DEPTNO ORDER BY AVGSAL ASC LIMIT 1;
+--------+-------------+
| DEPTNO | AVGSAL |
+--------+-------------+
| 30 | 1566.666667 |
+--------+-------------+
(2)将上面的查询结果单做临时表t和 薪水级别表连接,查询薪水的级别
SELECT DS.DEPTNO,DS.AVGSAL ,G.GRADE
FROM SALGRADE G
JOIN ( SELECT DEPTNO ,AVG(SAL) AVGSAL FROM EMP GROUP BY DEPTNO ORDER BY AVGSAL ASC LIMIT 1 ) DS
ON DS.AVGSAL BETWEEN G.LOSAL AND G.HISAL
+--------+-------------+-------+
| DEPTNO | AVGSAL | GRADE |
+--------+-------------+-------+
| 30 | 1566.666667 | 3 |
+--------+-------------+-------+
(3)将上面的查询结果当做临时表,和部门表连接
SELECT D.DEPTNO,D.DNAME,DSG.AVGSAL,DSG.GRADE
FROM DEPT D
JOIN ( SELECT DS.DEPTNO,DS.AVGSAL ,G.GRADE
FROM SALGRADE G
JOIN ( SELECT DEPTNO ,AVG(SAL) AVGSAL FROM EMP GROUP BY DEPTNO ORDER BY AVGSAL ASC LIMIT 1 ) DS
ON DS.AVGSAL BETWEEN G.LOSAL AND G.HISAL ) DSG
ON DSG.DEPTNO = D.DEPTNO;
+--------+-------+-------------+-------+
| DEPTNO | DNAME | AVGSAL | GRADE |
+--------+-------+-------------+-------+
| 30 | SALES | 1566.666667 | 3 |
+--------+-------+-------------+-------+
/********************************************************************************************************/
8.取得比普通员工(员工代码没有在mgr上出现的)的最高薪水还要高的经理人姓名
(1)找出来经理人,页就是出现在mgr中的数据
SELECT DISTINCT MGR FROM EMP WHERE MGR IS NOT NULL;
+------+
| mgr |
+------+
| 7902 |
| 7698 |
| 7839 |
| 7566 |
| NULL |
| 7788 |
| 7782 |
+------+
(2)找出普通员工,也就是员工编号没有出现在上面的查询结果中
SELECT EMPNO FROM EMP WHERE EMPNO NOT IN (SELECT DISTINCT MGR FROM EMP WHERE MGR IS NOT NULL)
+-------+
| empno |
+-------+
| 7369 |
| 7499 |
| 7521 |
| 7654 |
| 7844 |
| 7876 |
| 7900 |
| 7934 |
+-------+
(3)求出普通员工的最高薪水
SELECT MAX(SAL) MAXSAL FROM EMP WHERE EMPNO NOT IN(SELECT DISTINCT MGR FROM EMP WHERE MGR IS NOT NULL)
+---------+
| maxsal |
+---------+
| 1600.00 |
+---------+
(4)查询出经理的薪水,并且经理的薪水大于上面的查询结果
SELECT ENAME,SAL FROM EMP WHERE SAL > (SELECT MAX(SAL) MAXSAL FROM EMP WHERE EMPNO NOT IN(SELECT DISTINCT MGR FROM EMP WHERE MGR IS NOT NULL))
UNION
SELECT ENAME,SAL FROM EMP WHERE EMPNO 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 |
+-------+---------+
/********************************************************************************************************/
9.取得薪水最高的前五名员工
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 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 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.取得薪水最高的第六到第十名员工
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 | 0.00 | 30 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
+-------+--------+----------+------+------------+---------+---------+--------+
/********************************************************************************************************/
11.取得最后入职的5名员工
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 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
+-------+--------+---------+------+------------+---------+------+--------+
/********************************************************************************************************/
USE bjpowernode;
12.取得每个薪水等级有多少员工
(1)查询所有员工的薪水级别
SELECT GRADE FROM EMP E JOIN SALGRADE G ON E.SAL BETWEEN G.LOSAL AND G.HISAL ORDER BY G.GRADE
+-------+
| grade |
+-------+
| 1 |
| 1 |
| 1 |
| 2 |
| 2 |
| 2 |
| 3 |
| 3 |
| 4 |
| 4 |
| 4 |
| 4 |
| 4 |
| 5 |
+-------+
(2)把上面的查询结果当做一个临时表t,在临时表中按照工资等级分组,计算每组的数据总数
SELECT G.GRADE,COUNT(G.GRADE)
FROM ( SELECT GRADE FROM EMP E JOIN SALGRADE G ON E.SAL BETWEEN G.LOSAL AND G.HISAL ORDER BY G.GRADE ) G
GROUP BY G.GRADE
+-------+----------+
| grade | totalEmp |
+-------+----------+
| 1 | 3 |
| 2 | 3 |
| 3 | 2 |
| 4 | 5 |
| 5 | 1 |
+-------+----------+
/********************************************************************************************************/
14.列出所有员工及领导的名字
SELECT
E.ENAME,
M.ENAME MGRNAME
FROM
EMP E
JOIN EMP M ON E.MGR = M.EMPNO;
+--------+------------+
| ename | leadername |
+--------+------------+
| 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 |
+--------+------------+
/********************************************************************************************************/
15.列出受雇日期早于其直接上级的所有员工编号、姓名、部门名称
思路:首先对EMP表做自连接,查询员工及其经理信息,条件是员工的雇佣日期小于其经理的雇佣日期.
然后再连接部门表,取出部门名称信息
SELECT
E.EMPNO,
E.ENAME,
D.DNAME
FROM
EMP E
JOIN EMP M ON E.MGR = M.EMPNO AND E.HIREDATE < M.HIREDATE
JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
+------------+-------+-------+
| dname | empno | ename |
+------------+-------+-------+
| ACCOUNTING | 7782 | CLARK |
| RESEARCH | 7369 | SMITH |
| RESEARCH | 7566 | JONES |
| SALES | 7499 | ALLEN |
| SALES | 7521 | WARD |
| SALES | 7698 | BLAKE |
+------------+-------+-------+
/********************************************************************************************************/
16.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
使用右外连接
SELECT E.EMPNO,E.ENAME,D.DEPTNO,D.DNAME
FROM EMP E
RIGHT JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
+------------+-------+--------+-----------+------+------------+---------+---------+--------+
| 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 |
| 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 |
| OPERATIONS | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
+------------+-------+--------+-----------+------+------------+---------+---------+--------+
/********************************************************************************************************/
17.列出至少有5个员工的所有部门
按照部门分组查询每组的员工人数,然后用having过滤数据
SELECT DEPTNO ,COUNT(ENAME)
FROM EMP
GROUP BY DEPTNO
HAVING COUNT(ENAME) >= 5;
SELECT DEPTNO ,COUNT(ENAME) TOTALEMP
FROM EMP
GROUP BY DEPTNO
HAVING TOTALEMP >= 5;
+--------+----------+
| deptno | totalEmp |
+--------+----------+
| 20 | 5 |
| 30 | 6 |
+--------+----------+
/********************************************************************************************************/
18.列出薪水比“SMITH”多的所有员工信息
(1)首先查询SMITH的工资
SELECT SAL FROM EMP WHERE ENAME = 'SMITH';
+--------+
| sal |
+--------+
| 800.00 |
+--------+
(2)用上面的查询结果当做条件
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.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 |
+-------+--------+-----------+------+------------+---------+---------+--------+
/********************************************************************************************************/
19.列出所有“CLERK”(办事员)的姓名及其部门名称,部门人数
(1)查询所有办事员的姓名及其部门名称
SELECT
E.ENAME,
E.JOB,
D.DEPTNO,
D.DNAME
FROM
EMP E
JOIN DEPT D ON E.DEPTNO = D.DEPTNO
WHERE
E.JOB = 'CLERK';
+--------+-------+--------+------------+
| ENAME | JOB | DEPTNO | DNAME |
+--------+-------+--------+------------+
| MILLER | CLERK | 10 | ACCOUNTING |
| SMITH | CLERK | 20 | RESEARCH |
| ADAMS | CLERK | 20 | RESEARCH |
| JAMES | CLERK | 30 | SALES |
+--------+-------+--------+------------+
(2)求出部门的人数(按照部门编号分组,查询各部门的人数)
SELECT DEPTNO,COUNT(ENAME)
FROM EMP
GROUP BY DEPTNO
当成一个临时表t2
+--------+----------+
| deptno | totalEmp |
+--------+----------+
| 10 | 3 |
| 20 | 5 |
| 30 | 6 |
+--------+----------+
(3)把上面的查询结果当做两个临时表,连接这两个表,查询部门的员工人数
SELECT
T1.ENAME,
T1.JOB ,T1.DEPTNO,
T1.DNAME ,T2.TOTALEMP
FROM
(
SELECT
E.ENAME,
E.JOB,
D.DEPTNO,
D.DNAME
FROM
EMP E
JOIN DEPT D ON E.DEPTNO = D.DEPTNO
WHERE
E.JOB = 'CLERK'
) T1
JOIN (
SELECT
DEPTNO,
COUNT(ENAME) TOTALEMP
FROM
EMP
GROUP BY
DEPTNO
) T2 ON T1.DEPTNO = T2.DEPTNO;
+--------+------------+--------+----------+
| deptno | dname | ename | totalEmp |
+--------+------------+--------+----------+
| 10 | ACCOUNTING | MILLER | 3 |
| 20 | RESEARCH | SMITH | 5 |
| 20 | RESEARCH | ADAMS | 5 |
| 30 | SALES | JAMES | 6 |
+--------+------------+--------+----------+
/********************************************************************************************************/
20.列出最低薪水大于1500的各种工作,及从事此工作的全部雇员人数
(1)查询每个岗位的最低工资(按照岗位分组,计算每个岗位的最低工资)
SELECT JOB,MIN(SAL) AS MINSAL
FROM EMP
GROUP BY JOB
+-----------+---------+
| job | minsal |
+-----------+---------+
| ANALYST | 3000.00 |
| CLERK | 800.00 |
| MANAGER | 2450.00 |
| PRESIDENT | 5000.00 |
| SALESMAN | 1250.00 |
+-----------+---------+
(2)用having过滤大于1500的数据
SELECT JOB,MIN(SAL) AS MINSAL,COUNT(JOB)
FROM EMP
GROUP BY JOB
HAVING MINSAL > 1500
+-----------+---------+----------+
| job | minsal | totalEmp |
+-----------+---------+----------+
| ANALYST | 3000.00 | 2 |
| MANAGER | 2450.00 | 3 |
| PRESIDENT | 5000.00 | 1 |
+-----------+---------+----------+
/********************************************************************************************************/
21.列出在部门“SALES”<销售部>工作的员工的姓名,假定不知道销售部门的部门编号
(1)查询'SALES'的部门编号
SELECT DEPTNO FROM DEPT WHERE DNAME = 'SALES';
+--------+
| deptno |
+--------+
| 30 |
+--------+
(2)查询EMP表,条件是deptno = 上面的查询结果
SELECT DEPTNO,ENAME FROM EMP WHERE DEPTNO = (SELECT DEPTNO FROM DEPT WHERE DNAME = 'SALES');
+--------+--------+
| deptno | ename |
+--------+--------+
| 30 | ALLEN |
| 30 | WARD |
| 30 | MARTIN |
| 30 | BLAKE |
| 30 | TURNER |
| 30 | JAMES |
+--------+--------+
/********************************************************************************************************/
22.列出薪金高于公司平均薪金的所有员工,所在部门、上级领导、雇员的工资等级
(1)求出公司的平均薪水
SELECT AVG(SAL) AS AVGSAL FROM EMP;
+-------------+
| avgsal |
+-------------+
| 2073.214286 |
+-------------+
(2)连接部门表(经理表),员工表(职员表),薪水级别表,员工表
SELECT
D.DNAME,
E.ENAME,
S.GRADE,
B.ENAME AS LEADERNAME
FROM
EMP E
JOIN DEPT D ON E.DEPTNO = D.DEPTNO
LEFT JOIN EMP B ON E.MGR = B.EMPNO
JOIN SALGRADE S ON E.SAL BETWEEN S.LOSAL AND S.HISAL
WHERE
E.SAL > (SELECT AVG(SAL) AS AVGSAL FROM EMP);
+------------+-------+-------+------------+
| dname | ename | grade | leadername |
+------------+-------+-------+------------+
| RESEARCH | JONES | 4 | KING |
| SALES | BLAKE | 4 | KING |
| ACCOUNTING | CLARK | 4 | KING |
| RESEARCH | SCOTT | 4 | JONES |
| ACCOUNTING | KING | 5 | NULL |
| RESEARCH | FORD | 4 | JONES |
+------------+-------+-------+------------+
/********************************************************************************************************/
23.列出与“SCOTT”从事相同工作的所有员工及部门名称
先求出SCOTT的工作岗位
(1)SELECT JOB FROM EMP WHERE ENAME = 'SCOTT';
+---------+
| job |
+---------+
| ANALYST |
+---------+
SELECT
D.DNAME,
E.ENAME
FROM
EMP E
JOIN DEPT D ON E.DEPTNO = D.DEPTNO
WHERE
E.JOB = (
SELECT
JOB
FROM
EMP
WHERE
ENAME = 'SCOTT'
);
+----------+-------+
| dname | ename |
+----------+-------+
| RESEARCH | SCOTT |
| RESEARCH | FORD |
+----------+-------+
/********************************************************************************************************/
24.列出薪金等于部门30中员工的薪金的其它员工的姓名和薪金
第一步:先找出部门30的员工薪金
SELECT DISTINCT SAL FROM EMP WHERE DEPTNO = 30;
+---------+
| sal |
+---------+
| 1600.00 |
| 1250.00 |
| 2850.00 |
| 1500.00 |
| 950.00 |
+---------+
SELECT * FROM EMP WHERE SAL IN(SELECT DISTINCT SAL FROM EMP WHERE DEPTNO = 30) AND DEPTNO <> 30;
Empty set (0.00 sec)
/********************************************************************************************************/
25.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金、部门名称
第一步:求出部门30的最高薪水
SELECT MAX(SAL) AS MAXSAL FROM EMP WHERE DEPTNO = 30;
+---------+
| maxsal |
+---------+
| 2850.00 |
+---------+
SELECT
D.DNAME,
E.ENAME,
E.SAL
FROM
EMP E
JOIN DEPT D ON E.DEPTNO = D.DEPTNO
WHERE
E.SAL > (
SELECT
MAX(SAL) AS MAXSAL
FROM
EMP
WHERE
DEPTNO = 30
);
+------------+-------+---------+
| dname | ename | sal |
+------------+-------+---------+
| ACCOUNTING | KING | 5000.00 |
| RESEARCH | JONES | 2975.00 |
| RESEARCH | SCOTT | 3000.00 |
| RESEARCH | FORD | 3000.00 |
+------------+-------+---------+
/********************************************************************************************************/
26.列出在每个部门工作的员工数量、平均工资和平均服务期限
to_days(日期类型) -> 天数
select avg((to_days(now()) - to_days(hiredate))/365) as avgyearserver from emp;
SELECT
E.DEPTNO,
COUNT(E.ENAME) AS TOTALEMP,
AVG(E.SAL) AS AVGSAL,
AVG(
(
TO_DAYS(NOW()) - TO_DAYS(E.HIREDATE)
) / 365
) AS AVGYEARSERVER
FROM
EMP E
GROUP BY
E.DEPTNO;
+--------+----------+-------------+---------------+
| deptno | totalEmp | avgsal | avgyearserver |
+--------+----------+-------------+---------------+
| 10 | 3 | 2916.666667 | 34.86393333 |
| 20 | 5 | 2175.000000 | 32.89096000 |
| 30 | 6 | 1566.666667 | 35.16255000 |
+--------+----------+-------------+---------------+
/********************************************************************************************************/
27.列出所有员工的姓名、部门名称和工资
SELECT
D.DNAME,
E.ENAME,
E.SAL
FROM
EMP E
RIGHT JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
+------------+--------+---------+
| dname | ename | sal |
+------------+--------+---------+
| ACCOUNTING | CLARK | 2450.00 |
| ACCOUNTING | KING | 5000.00 |
| ACCOUNTING | MILLER | 1300.00 |
| RESEARCH | SMITH | 800.00 |
| RESEARCH | JONES | 2975.00 |
| RESEARCH | SCOTT | 3000.00 |
| RESEARCH | ADAMS | 1100.00 |
| RESEARCH | FORD | 3000.00 |
| SALES | ALLEN | 1600.00 |
| SALES | WARD | 1250.00 |
| SALES | MARTIN | 1250.00 |
| SALES | BLAKE | 2850.00 |
| SALES | TURNER | 1500.00 |
| SALES | JAMES | 950.00 |
| OPERATIONS | NULL | NULL |
+------------+--------+---------+
/********************************************************************************************************/
28.列出所有部门的详细信息和人数
SELECT
E.DEPTNO,
COUNT(E.ENAME) AS TOTALEMP
FROM
EMP E
GROUP BY
E.DEPTNO;
+--------+----------+
| deptno | totalEmp |
+--------+----------+
| 10 | 3 |
| 20 | 5 |
| 30 | 6 |
+--------+----------+
将以上查询结果当成临时表t
SELECT
D.DEPTNO,
D.DNAME,
D.LOC,
IFNULL(T.TOTALEMP, 0) AS TOTALEMP
FROM
(
SELECT
E.DEPTNO,
COUNT(E.ENAME) AS TOTALEMP
FROM
EMP E
GROUP BY
E.DEPTNO
) T
RIGHT JOIN DEPT D ON T.DEPTNO = D.DEPTNO;
+--------+------------+----------+----------+
| deptno | dname | loc | totalEmp |
+--------+------------+----------+----------+
| 10 | ACCOUNTING | NEW YORK | 3 |
| 20 | RESEARCH | DALLAS | 5 |
| 30 | SALES | CHICAGO | 6 |
| 40 | OPERATIONS | BOSTON | 0 |
+--------+------------+----------+----------+
/********************************************************************************************************/
29.列出各种工作的最低工资及从事此工作的雇员姓名
(1)查询最低工资的
SELECT
E.JOB,
MIN(E.SAL) AS MINSAL
FROM
EMP E
GROUP BY
E.JOB;
+-----------+---------+
| job | minsal |
+-----------+---------+
| ANALYST | 3000.00 |
| CLERK | 800.00 |
| MANAGER | 2450.00 |
| PRESIDENT | 5000.00 |
| SALESMAN | 1250.00 |
+-----------+---------+
将以上查询结果当成临时表t与emp 表进行表连接
select
e.job,e.ename,e.sal,t.minsal
from
(select
e.job,min(e.sal) as minsal
from
emp e
group by
e.job) t
join
emp e
on
t.job = e.job
where
t.minsal = e.sal;
+-----------+--------+---------+---------+
| job | ename | sal | minsal |
+-----------+--------+---------+---------+
| CLERK | SMITH | 800.00 | 800.00 |
| SALESMAN | WARD | 1250.00 | 1250.00 |
| SALESMAN | MARTIN | 1250.00 | 1250.00 |
| MANAGER | CLARK | 2450.00 | 2450.00 |
| ANALYST | SCOTT | 3000.00 | 3000.00 |
| PRESIDENT | KING | 5000.00 | 5000.00 |
| ANALYST | FORD | 3000.00 | 3000.00 |
+-----------+--------+---------+---------+
/********************************************************************************************************/
30.列出各个部门MANAGER的最低薪金
select
e.deptno,min(e.sal) as minsal
from
emp e
where
e.job = 'MANAGER'
group by
e.deptno;
+--------+---------+
| deptno | minsal |
+--------+---------+
| 10 | 2450.00 |
| 20 | 2975.00 |
| 30 | 2850.00 |
+--------+---------+
/********************************************************************************************************/
31.列出所有员工的年工资,按年薪从低到高排序
select ename, (sal + ifnull(comm,0))*12 as yearsal from emp order by yearsal 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 |
| FORD | 36000.00 |
| SCOTT | 36000.00 |
| KING | 60000.00 |
+--------+----------+
/********************************************************************************************************/
32.求出员工领导的薪水超过3000的员工名称和领导名称
select
e.ename,
b.ename as leadername,
b.sal
from
emp e
join
emp b
on
e.mgr = b.empno
where
b.sal > 3000;
+-------+------------+---------+
| ename | leadername | sal |
+-------+------------+---------+
| JONES | KING | 5000.00 |
| BLAKE | KING | 5000.00 |
| CLARK | KING | 5000.00 |
+-------+------------+---------+
/********************************************************************************************************/
33.求部门名称中带“S”字符的部门员工的工资合计、部门人数
select
d.dname,e.*
from
emp e
right join
dept d
on
e.deptno = d.deptno
where
d.dname like '%s%';
+----------+-------+--------+----------+------+------------+---------+---------+--------+
| dname | EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
+----------+-------+--------+----------+------+------------+---------+---------+--------+
| 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 |
+----------+-------+--------+----------+------+------------+---------+---------+--------+
将以上查询结果当成临时表t
select
t.dname,
sum(t.sal) as sumsal,
count(t.ename) as totalEmp
from
(select
d.dname,e.*
from
emp e
right join
dept d
on
e.deptno = d.deptno
where
d.dname like '%s%') t
group by
t.dname;
+----------+----------+----------+
| dname | sumsal | totalEmp |
+----------+----------+----------+
| RESEARCH | 10875.00 | 5 |
| SALES | 9400.00 | 6 |
+----------+----------+----------+
/********************************************************************************************************/
34.给任职日期超过30年的员工加薪10%
update emp_bak set sal = sal * 1.1 where (to_days(now()) - to_days(hiredate))/365 > 30;