员工表,部门表综合查询
注:该实验答案是本人一个一个经mysql数据库操作得出,如有错误地方,请评论或留言告知我,望与君共同进步!
-- (1)查询20号部门的所有员工信息。
SELECT * FROM emp where deptno=20;
-- (2)查询所有工种为CLERK的员工的工号、员工名和部门名。
SELECT e.EMPNO,e.ENAME,d.dname from emp e JOIN dept d ON(e.deptno=d.deptno) WHERE e.JOB='clerk';
SELECT e.EMPNO,e.ENAME,d.dname from emp e ,dept d WHERE e.JOB='clerk' and e.deptno=d.deptno;
-- (3)查询奖金(COMM)高于工资(SAL)的员工信息。
SELECT * FROM emp where COMM>SAL;
-- (4)查询奖金高于工资的20%的员工信息
SELECT * FROM emp where COMM>sal*0.2;
-- (5)查询10号部门中工种为MANAGER和20号部门中工种为CLERK的员工的信息。
SELECT * FROM emp where (JOB='manager' and deptno=10) or (job='clerk' and deptno=20);
-- (6)查询所有工种不是MANAGER和CLERK,且工资大于或等于2000的员工的详细信息。
SELECT * from emp where job NOT IN('manager','clerk') AND SAL>=2000;
-- (7)查询有奖金的员工信息。
select * from emp where COMM is not null and comm>0;
-- (8)查询所有员工工资和奖金的和。
select ENAME,(sal+IFNULL(COMM ,0)) as sum from emp;
-- (9)查询没有奖金或奖金低于100的员工信息。
SELECT * from emp where comm is null or comm<100;
SELECT * from emp where ISNULL(COMM) or comm<100;
-- (10)查询各月倒数第3天入职的员工信息。
SELECT * from emp where LAST_DAY(HIREDATE)-HIREDATE=2;
-- (13) 查询员工名正好为6个字符的员工的信息。
SELECT * from emp where LENGTH(ENAME)=6;
SELECT * from emp where ENAME LIKE '______';-- 6个下划线
-- (14)查询员工名字中不包含字母"S"员工。(逆向)
SELECT * from emp where ENAME not LIKE '%s%';
-- (15)查询员工姓名的第2个字母为"M"的员工信息。
SELECT * from emp where ENAME LIKE '_m%';
-- (16)查询所有员工姓名的前3个字符。
SELECT SUBSTR(ENAME,1,3) as name from emp;
-- (17)查询所有员工的姓名,如果包含字母"S",则用"s"替换。
SELECT REPLACE(ENAME,'S','s') as ename from emp;
-- (18)查询员工的姓名和入职日期,并按入职日期从先到后进行排列。
SELECT ENAME,HIREDATE from emp ORDER BY HIREDATE ;
-- (19)显示所有的姓名、工种、工资和奖金,按工种降序排列,若工种相同则按工资升序排列。
SELECT ENAME,JOB,SAL,COMM from emp ORDER BY JOB desc , sal ;
-- (23)查询至少有一个员工的部门信息。
select d.* from emp e,dept d where e.deptno=d.deptno GROUP BY e.deptno HAVING COUNT(*)>1;
-- (24)查询工资比SMITH员工工资高的所有员工信息。
SELECT * FROM emp WHERE SAL > ( SELECT SAL FROM emp WHERE ENAME = 'smith');
-- (25)查询所有员工的姓名及其直接上级的姓名。
SELECT e.ENAME '员工姓名',p.ENAME '上级姓名' FROM emp e,emp p WHERE e.MGR = p.EMPNO;
-- (26)查询入职日期早于其直接上级领导的所有员工信息。
select * FROM emp where HIREDATE<();
-- (27)查询所有部门及其员工信息,包括那些没有员工的部门。
SELECT d.deptno,d.dname,e.* FROM emp e RIGHT JOIN dept d ON (e.deptno = d.deptno);
-- (29)查询所有工种为CLERK的员工的姓名及其部门名称。
SELECT e.ENAME,d.dname FROM emp e JOIN dept d ON (e.deptno = d.deptno) WHERE e.job = 'clerk';
-- (30)查询最低工资大于2500的各种工作。
SELECT job,MIN(sal) FROM emp GROUP BY job HAVING min(sal) > 2500;
-- (31)查询最低工资低于900的部门及其员工信息。
SELECT e.* FROM emp e WHERE e.deptno = (SELECT e.deptno FROM emp e GROUP BY e.deptno HAVING MIN(e.sal) < 900);
-- (32)查询在SALES部门工作的员工的姓名信息。
SELECT e.ename FROM emp e JOIN dept d ON (e.deptno = d.deptno) WHERE d.dname = 'sales';
-- (33)查询工资高于公司平均工资的所有员工信息。
SELECT * FROM emp WHERE SAL > (SELECT AVG(sal) FROM emp);
-- (34)查询与SMITH员工从事相同工作的所有员工信息。
SELECT * FROM emp WHERE job = (SELECT job FROM emp WHERE ENAME = 'smith');
-- (35)查询出工资和30号部门中员工相同的所有员工的姓名和工资。
SELECT ENAME,SAL from emp WHERE sal in (SELECT sal from emp WHERE deptno=30) and deptno!=30;
SELECT ENAME,sal from emp WHERE deptno=30;-- 查询30号部门员工的姓名和工资
-- (37)查询每个部门中的员工数量、平均工资。
SELECT d.deptno,COUNT(e.EMPNO) as count,ifnull(round(avg(e.sal),2),0) as avg FROM emp e RIGHT JOIN dept d ON (e.deptno = d.deptno) GROUP BY d.deptno;
-- (39)查询各个部门的详细信息以及部门人数、部门平均工资。
SELECT d.*,COUNT(e.EMPNO) AS count,ifnull(round(avg(e.sal), 2), 0) AS avg FROM dept d LEFT JOIN emp e ON (e.deptno = d.deptno) GROUP BY d.deptno;
-- (40)查询各种工作的最低工资。
SELECT job,min(sal) from emp GROUP BY job;
-- (41)查询各个部门中的不同工种的最高工资。
SELECT d.deptno,IFNULL(e.job,'无') as job,IFNULL(MAX(sal),'无') as max FROM emp e RIGHT JOIN dept d ON (e.deptno = d.deptno) GROUP BY d.deptno,e.JOB;
-- (42)查询10号部门员工以及领导的信息。
SELECT e.*from emp e where e.deptno=10;
-- (43)查询各个部门的人数及平均工资。
SELECT d.deptno,COUNT(e.EMPNO) as count,ifnull(round(avg(e.sal),2),0) as avg FROM emp e RIGHT JOIN dept d ON (e.deptno = d.deptno) GROUP BY d.deptno;
-- (44)查询工资为某个部门平均工资的员工信息。
SELECT * FROM emp WHERE sal IN (SELECT deptno,ifnull(round(avg(sal)), 0) FROM emp GROUP BY deptno);
-- (45)查询工资高于本部门平均工资的员工的信息。
SELECT e.* FROM emp e WHERE e.sal > (SELECT avg(p.sal) FROM emp p WHERE e.deptno = p.deptno);
-- (46)查询工资高于本部门平均工资的员工的信息及其部门的平均工资。
SELECT e.*,(SELECT ROUND(avg(p.sal),2) FROM emp p WHERE e.deptno = p.deptno) as avg FROM emp e WHERE e.sal > (SELECT avg(p.sal) FROM emp p WHERE e.deptno = p.deptno);
-- (47)查询工资高于20号部门平均工资的所有员工的信息。
SELECT * FROM emp WHERE sal > (SELECT AVG(sal) FROM emp WHERE deptno = 20);
-- (48)统计各个工种的人数与平均工资。
SELECT COUNT(empno),ROUND(avg(sal)) FROM emp GROUP BY job;
-- (51)查询部门人数大于5的部门的员工的信息。
SELECT e.* from emp e where (SELECT COUNT(p.empno) from emp p where e.deptno=p.deptno)>5;
-- (52)查询所有员工工资都大于1000的部门的信息。(反向思维)
SELECT d.* FROM dept d JOIN emp e ON (d.deptno = e.deptno) WHERE (SELECT min(e1.sal) FROM emp e1 WHERE e.deptno = e1.deptno) > 1000;
-- (53)查询所有员工工资都大于1000的部门的信息及其员工信息。
SELECT d.*,e.* FROM dept d JOIN emp e ON (d.deptno = e.deptno) WHERE (SELECT min(e1.sal) FROM emp e1 WHERE e.deptno = e1.deptno) > 1000;
-- (57)查询人数最多的部门信息。
SELECT d.* FROM dept d WHERE d.deptno = (SELECT deptno FROM emp GROUP BY deptno ORDER BY COUNT(EMPNO) DESC LIMIT 1);
SELECT deptno from emp GROUP BY deptno ORDER BY COUNT(EMPNO) desc LIMIT 1;-- 获取人数最多的部门
-- (58)查询30号部门中工资排序前3名的员工信息。
SELECT * FROM emp WHERE deptno = 30 ORDER BY sal DESC LIMIT 3;
-- (59)查询所有员工中工资排在5~10名之间的员工信息。
SELECT * FROM emp ORDER BY sal DESC LIMIT 4,6;