MySQL 基础练习18题

生成数据

# 生成部门信息表
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;

insert into `dept`(`DEPTNO`,`DNAME`,`LOC`) values
('10','ACCOUNTING','NEW YORK'),
('20','RESEARCH','DALLAS'),
('30','SALES','CHICAGO'),
('40','OPERATIONS','BOSTON');

# 生成雇员信息表
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;

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

题目:

1. 列出至少有一个员工的所有部门。
2. 列出薪金比“SMITH”多的所有员工。
3. 列出所有员工的姓名及其直接上级的姓名。
4. 列出受雇日期早于其直接上级的所有员工。
5. 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。
6. 列出所有“CLERK”(办事员)的姓名及其部门名称。
7. 列出最低薪金大于1500的各种工作。
8. 列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号
9. 列出薪金高于公司平均薪金的所有员工。
10.列出与“SCOTT”从事相同工作的所有员工。
11.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。
12.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。
13.列出在每个部门工作的员工数量、平均工资和平均服务期限。
14.列出所有员工的姓名、部门名称和工资。
15.列出所有部门的详细信息和部门人数。
16.列出各种工作的最低工资。
17.列出各个部门的MANAGER(经理)的最低薪金。
18.列出所有员工的年工资,按年薪从低到高排序。

每个题目有多行代码的代表多个解决方案:

-- 1. 列出至少有一个员工的所有部门。 
SELECT DNAME FROM dept WHERE DEPTNO IN(SELECT DEPTNO FROM emp);
SELECT DNAME FROM dept WHERE DEPTNO IN (SELECT DEPTNO FROMM emp GROUP BY DEPTNO HAVING COUNT(DEPTNO)>=1);
SELECT DNAME FROM dept A WHERE EXISTS(SELECT NULL FROM emp B WHERE B.DEPTNO=A.DEPTNO)
-- 2. 列出薪金比“SMITH”多的所有员工。 
SELECT * FROM emp WHERE emp.SAL > (SELECT SAL FROM emp WHERE emp.ENAME='SMITH')
-- 3. 列出所有员工的姓名及其直接上级的姓名。 
SELECT A.ENAME, (SELECT B.ENAME FROM emp B WHERE B.EMPNO=A.MGR) AS BOSS FROM emp A;
-- 4. 列出受雇日期早于其直接上级的所有员工。
SELECT * FROM emp A WHERE A.HIREDATE < (SELECT B.HIREDATE FROM emp B WHERE B.EMPNO=A.MGR);
-- 5. 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。 
SELECT A.DNAME, B.EMPNO, B.ENAME, B.JOB, B.MGR, B.HIREDATE, B.SAL, B.SAL, B.DEPTNO FROM dept A LEFT JOIN emp B ON A.DEPTNO=B.DEPTNO;
-- 6. 列出所有“CLERK”(办事员)的姓名及其部门名称。
SELECT A.ENAME, (SELECT B.DNAME FROM dept B WHERE A.DEPTNO=B.DEPTNO) AS DNAME FROM emp A WHERE A.JOB='CLERK';
SELECT A.ENAME, B.DNAME FROM EMP A JOIN dept B ON A.DEPTNO=B.DEPTNO AND A.JOB='CLERK';
-- 7. 列出最低薪金大于1500的各种工作。
SELECT DISTINCT JOB FROM emp GROUP BY JOB HAVING MIN(SAL)>1500;
-- 8. 列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号
SELECT ENAME FROM emp WHERE DEPTNO NOT IN (SELECT DEPTNO FROM dept WHERE DNAME != 'SALES');
-- 9. 列出薪金高于公司平均薪金的所有员工。
SELECT emp.ENAME FROM emp WHERE emp.SAL>(SELECT AVG(SAL) FROM emp);
-- 10.列出与“SCOTT”从事相同工作的所有员工。 
SELECT emp.ENAME FROM emp WHERE emp.JOB=(SELECT emp.JOB FROM emp WHERE emp.ENAME='SCOTT');
-- 11.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。 
SELECT emp.ENAME, emp.SAL FROM emp WHERE emp.SAL IN (SELECT SAL FROM emp WHERE DEPTNO=30) AND emp.DEPTNO != 30;
-- 12.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。 
SELECT emp.ENAME, emp.SAL FROM emp WHERE emp.SAL > (SELECT MAX(SAL) FROM emp WHERE DEPTNO=30) AND emp.DEPTNO <> 30;
-- 13.列出在每个部门工作的员工数量、平均工资和平均服务期限。 
SELECT (SELECT B.DNAME FROM dept B WHERE A.DEPTNO=B.DEPTNO) AS DEPTNAME, COUNT(DEPTNO) AS DEPTCOUNT, AVG(SAL) AS DEPTAVGSAL FROM emp A GROUP BY DEPTNO;
-- 14.列出所有员工的姓名、部门名称和工资。
SELECT A.ENAME, (SELECT B.DNAME FROM dept B WHERE B.DEPTNO=A.DEPTNO) AS DNAME, A.SAL FROM emp A;
-- 15.列出所有部门的详细信息和部门人数。 
SELECT A.DEPTNO, A.DNAME, A.LOC, (SELECT COUNT(DEPTNO) FROM emp B WHERE A.DEPTNO=B.DEPTNO GROUP BY B.DEPTNO) AS EMPCOUNT FROM dept A;
-- 16.列出各种工作的最低工资。 
SELECT JOB, MIN(SAL) AS MINSAL FROM emp GROUP BY JOB;
-- 17.列出各个部门的MANAGER(经理)的最低薪金。 
SELECT A.DEPTNO, A.DNAME, (SELECT MIN(SAL) FROM emp B WHERE B.JOB='MANAGER' AND B.DEPTNO=A.DEPTNO GROUP BY DEPTNO) AS MINSAL FROM dept A;
SELECT A.DEPTNO, (SELECT B.DNAME FROM dept B WHERE B.DEPTNO=A.DEPTNO) AS DNAME, MIN(SAL) FROM emp A WHERE JOB='MANAGER' GROUP BY DEPTNO;
SELECT DEPTNO, MIN(SAL) FROM emp WHERE JOB='MANAGER' GROUP BY DEPTNO;
-- 18.列出所有员工的年工资,按年薪从低到高排序。
SELECT ENAME, (SAL + IFNULL(COMM,0))*12 YEARSAL FROM EMP ORDER BY YEARSAL;

你可能感兴趣的:(mysql)