oracle 基础表 mysql版

----------------------------------------------------------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');

--------------------------------------------------------dept表-------------------------------------------------

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');

--------------------------------------------salgrade----------------------------------------

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))


你可能感兴趣的:(oracle 基础表 mysql版)