----------------------------------------------------------emp表-------------------------------------------------------------
DROP TABLE IF EXISTS `emp`; CREATE TABLE `emp` ( `EMPNO` int(4) NOT NULL, `ENAME` varchar(10) DEFAULT NULL, `JOB` varchar(9) DEFAULT NULL, `MGR` int(4) DEFAULT NULL, `HIREDATE` date DEFAULT NULL, `SAL` int(7) DEFAULT NULL, `COMM` int(7) DEFAULT NULL, `DEPTNO` int(2) DEFAULT NULL, PRIMARY KEY (`EMPNO`), KEY `FK_DEPTNO` (`DEPTNO`), CONSTRAINT `FK_DEPTNO` FOREIGN KEY (`DEPTNO`) REFERENCES `dept` (`DEPTNO`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of emp -- ---------------------------- 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');
DROP TABLE IF EXISTS `dept`; CREATE TABLE `dept` ( `DEPTNO` int(2) NOT NULL, `DNAME` varchar(14) DEFAULT NULL, `LOC` varchar(13) DEFAULT NULL, PRIMARY KEY (`DEPTNO`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of dept -- ---------------------------- 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');
DROP TABLE IF EXISTS `salgrade`; CREATE TABLE `salgrade` ( `grade` int(11) NOT NULL DEFAULT '0', `losal` int(11) DEFAULT NULL, `hisal` int(11) DEFAULT NULL, PRIMARY KEY (`grade`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of salgrade -- ---------------------------- INSERT INTO `salgrade` VALUES ('1', '700', '1200'); INSERT INTO `salgrade` VALUES ('2', '1201', '1400'); INSERT INTO `salgrade` VALUES ('3', '1401', '2000'); INSERT INTO `salgrade` VALUES ('4', '2001', '3000'); INSERT INTO `salgrade` VALUES ('5', '3001', '9999');
---------------------------------------------------------------练习-----------------------------------------------------------
SELECT * from emp /*1-数据分组的重要函数: max、min、avg、sum、count*/ SELECT ename,sal FROM emp WHERE sal= (SELECT max(sal) from emp ) /*2-查询出工资高于平均工资的员工信息*/ SELECT ename,job,sal from emp WHERE SAL>(SELECT avg(sal) from emp) /*查询出每个部门的平均工资和最高工资;*/ SELECT avg(sal),max(sal),deptno from emp group by deptno /*查询出每个部门的每种岗位的平均工资和最低工资;*/ SELECT avg(sal),min(sal),DEPTNO,job from emp group by deptno,job /*查询出平均工资低于2000的部门号和它的平均工资.*/ SELECT avg(sal),deptno FROM emp GROUP BY DEPTNO having avg(sal)<2000 SELECT avg(sal),deptno FROM emp GROUP BY DEPTNO having avg(sal)>2000 ORDER BY avg(sal) /*查询出每个员工的姓名、工资及其工资的级别*/ SELECT e.ename,e.sal,s.grade from emp e,salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal /*查询出某个员工的上级领导的姓名*/ SELECT e1.ename,e2.ename from emp e1,emp e2 where e1.mgr=e2.empno /*询出工资比部门编号30的所有员工的工资高的员工的姓名、工资和部门编号*/ SELECT ename,sal,deptno from emp where sal>all (SELECT sal from emp WHERE deptno=30) /*查询出与SMITH的部门和岗位完全相同的所有雇员*/ SELECT * FROM emp WHERE (job,deptno)=(SELECT job ,deptno FROM emp WHERE ename='SMITH') /*查询出高于自己部门平均工资的员工的信息*/ SELECT e1.ename,e1.sal FROM emp e1,(SELECT deptno,avg(sal) mysal FROM emp GROUP BY deptno) e2 WHERE e1.deptno=e2.deptno AND e1.sal>e2.mysal /*谁挣的钱的最多*/ select ename, sal from emp where sal = (select max(sal) from emp); /*求部门人中那些人的薪水最高*/ /*SELECT ename,DEPTNO,max(sal) from emp GROUP BY deptno;*/ select ename, sal,emp.deptno from emp join (select max(sal) max_sal, deptno from emp group by deptno) t on (emp.sal =t.max_sal and emp.deptno =t.deptno) SELECT * FROM salgrade /*部门平均薪水的等级*/ SELECT t.deptno,s.grade FROM salgrade s, (SELECT deptno,AVG(sal) avg from emp GROUP BY deptno) t WHERE t.avg between s.losal and s.hisal; select deptno,avg_sal,grade from (select deptno,avg(sal) avg_sal from emp group by deptno) t join salgrade s on (t.avg_sal between s.losal and s.hisal); /*那些人是经理人*/ select ename from emp where empno in (select distinct mgr from emp); 或 select distinct d.ename from emp e ,emp d where e.mgr=d.empno /*不用组函数求最高薪水*/ select distinct sal from emp where sal not in (select distinct e1.sal from emp e1 join emp e2 on (e1.sal < e2.sal)) /*平均薪水最高的部门编号*/ SELECT deptno ,max(avg) FROM (SELECT avg(sal) avg,deptno FROM emp GROUP BY deptno)t /*平均薪水最高的部门名称*/ SELECT * from dept SELECT d.deptno,d.dname,max(avg) FROM (SELECT avg(sal) avg,deptno FROM emp GROUP BY deptno) t,dept d WHERE t.deptno=d.deptno /*平均薪水的等级最低的部门名称*/ SELECT t.dname,t.deptno,min(s.grade) grade,t.avg_sal FROM (SELECT avg(sal) avg_sal,e.deptno,d.dname FROM emp e,dept d WHERE e.deptno= d.deptno GROUP BY e.deptno)t join salgrade s on(t.avg_sal between s.losal and s.hisal); 或 select dname, t1.deptno,grade,avg_sal from ( select deptno, grade, avg_sal from (select deptno, avg(sal) avg_sal from emp group by deptno)t join salgrade s on(t.avg_sal between s.losal and s.hisal) )t1 join dept on (t1.deptno=dept.deptno) where t1.grade= ( select min(grade) from( select deptno, grade, avg_sal from (select deptno, avg(sal) avg_sal from emp group by deptno)t join salgrade s on(t.avg_sal between s.losal and s.hisal) )m ); /*比普通员工的最高薪水还要高的经理人*/ select ename from emp where empno in (select distinct mgr from emp where mgr is not null) and sal > (select max(sal) from emp where empno not in (select distinct mgr from emp where mgr is not null))