MySql之单表与多表查询(员工表)

CREATE TABLE dept(
 deptno INT(11) PRIMARY KEY,
 dname VARCHAR(20),
 loc VARCHAR(20)
);

CREATE TABLE emp(
 empno INT(11) PRIMARY KEY,
 ename VARCHAR(20) NOT NULL,
 job VARCHAR(20) CHECK (job in('CLERK','SALESMAN','MANAGER','SALESMAN','ANALYST')),
 mgp INT(11) ,
 hiredate DATETIME ,
 sal DECIMAL(10,2),
 comm DECIMAL(10,2),
  deptno INT
);

alter table emp add FOREIGN key(deptno) REFERENCES dept(deptno)
INSERT INTO dept VALUES (10,'ACCOUNTING','NEWTORK');
INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');
INSERT INTO dept VALUES (30,'SALES','CHICAGO');
INSERT INTO dept VALUES (40,'OPERATIONS','BOSTON');

insert into emp values(7369,'SMITH','CLERK',7902,'1980-12-17',1640,NULL,20);
insert into emp values(7499,'ALLEN','SALESMAN',7698,'1981-2-20',11400,300,30);
insert into emp values(7521,'WARD','SALESMAN',7698,'1981-2-22',5200,500,30);
insert into emp values(7566,'JOENS','MANAGER',7839,'1981-4-2',7015,NULL,20);
insert into emp values(7654,'MARTIN','SALESMAN',7698,'1981-9-28',5200,1400,30);
insert into emp values(7698,'BLAKE','MANAGER',7839,'1981-5-1',5900,NULL,30);
insert into emp values(7782,'CLARK','MANAGER',7839,'1981-6-9',2470,NULL,10);
insert into emp values(7788,'SCOTT','ANALYST',7566,'1987-4-19',3040,NULL,20);
insert into emp values(7844,'TURNER','SALESMAN',7698,'1980-12-17',6200,0,30);
insert into emp values(7876,'ADAMS','CLERK',7788,'1981-9-8',2240,NULL,20);
insert into emp values(7900,'JAMES','CLERK',7698,'1987-5-23',4000,NULL,30);
insert into emp values(7902,'FORD','ANALYST',7566,'1981-12-3',3040,NULL,20);
insert into emp values(7934,'MILLER','CLERK',7782,'1982-12-3',2620,NULL,10);
创建表并添加数据		
2	
(1) 查询20部门的所有员工信息。
------》select * from emp where deptno = 20;

(2) 查询所有工种为CLERK的员工的员工号、员工名和部门号。
------》 select empno '员工号',ename '员工名',deptno '部门' from emp where job = 'clerk';

(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 deptno = 10 AND job = 'MANAGER' or deptno = 20 AND job = 'ClERK';


(6) 查询所有工种不是MANAGER和CLERK,且工资大于或等于2000的员工的详细信息。
---》SELECT * FROM emp WHERE job NOT in('manager','clerk') AND (sal>=2000);


(7) 查询有奖金的员工的不同工种。
-----》SELECT DISTINCT job FROM emp WHERE comm is NOT null;

(8) 查询所有员工工资与奖金的和。
----> select sum(sal + ifnull(comm,0)) from emp;

(9) 查询没有奖金或奖金低于100的员工信息。
------>select * from emp where comm is null or comm<100;

(10) 找出各月最后一天受雇的所有雇员
select * from emp where last_day(hiredate)=hiredate;

(11) 查询工龄大于或等于25年的员工信息。
---->select * from emp where (year(now()) -year(hiredate))>=25;


(12) 查询员工信息,要求以首字母大写的方式显示所有员工的姓名。(重点)



(13) 查询员工名正好为6个字符的员工的信息。
--->select * from emp where ename like '%______';

(14) 查询员工名字中不包含字母“S”的员工。
----》SELECT ename FROM emp WHERE ename   NOT LIKE '%S%';

(15) 查询员工姓名的第二字母为“M”的员工信息。
---》SELECT ename from emp WHERE ename LIKE '_M%';

(16) 查询所有员工姓名的前三个字符。
----》SELECT ename '员工姓名', SUBSTRING(ename,1,3) FROM emp;

(18) 查询员工的姓名和入职日期,并按入职日期从先到后进行排序。
---》SELECT ename ,hiredate FROM emp ORDER BY hiredate;


(19) 显示所有员工的姓名、工种、工资和奖金,按工种降序排序,若工种相同则按工资升序排序。
---》SELECT ename ,job ,sal,comm from emp ORDER BY job desc ,sal ;

(20) 显示所有员工的姓名、入职的年份和月份,按入职日期所在的月份排序,若月份相同则按入职的年份排序。
----》select ename ,year(hiredate),MONTH(hiredate) FROM emp ORDER BY MONTH(hiredate) ,YEAR(hiredate);

(21) 查询在2月份入职的所有员工信息。
---》SELECT *FROM emp WHERE MONTH(hiredate);


(22) 查询所有员工入职以来的工作期限,用“XX年XX月XX日”的形式表示。
--》SELECT YEAR(hiredate),'年',MONTH(hiredate) ,'月', DAY(hiredate),'日'FROM emp;


(23.1) 查询至少有一个员工的部门信息。

SELECT d.dname ,count(empno) 部门人数
FROM emp e 
RIGHT JOIN dept d ON d.deptno = e.deptno
GROUP BY d.dname,e.deptno
HAVING count(empno) >=1;


(23.2) 查询至少有两个员工的部门信息。
SELECT d.dname ,count(empno) 部门人数
FROM emp e 
RIGHT JOIN dept d ON d.deptno = e.deptno
GROUP BY d.dname,e.deptno
HAVING count(empno) >=2;

(24) 查询工资比SMITH员工工资高的所有员工信息。
---》SELECT * FROM emp
WHERE sal>(SELECT sal FROM emp WHERE ename = 'smith');

(25) 查询所有员工的姓名及其直接上级的姓名
---->S
ELECT e1.ename '员工',e2.ename '上级' 
FROM (SELECT * FROM emp) e1 LEFT JOIN emp e2
ON e1.empno = e2.mgp;

(26) 查询入职日期早于其直接上级领导的所有员工信息。
---->
SELECT e1.*,e2.hiredate '上级入职时间'
FROM (SELECT * FROM emp) e1 LEFT JOIN emp e2
ON e1.empno = e2.mgp
WHERE e1.hiredate < e2.hiredate;

(27) 查询所有部门及其员工信息,包括那些没有员工的部门。
select dept.dname,emp.ename 
from emp
left outer join dept on emp.deptno=dept.deptno

(28) 查询所有员工及其部门信息,包括那些还不属于任何部门的员工。
---->>
SELECT d.dname,e.ename
FROM emp e 
RIGHT JOIN dept d ON d.deptno = e.deptno;

(29) 查询所有工种为CLERK的员工的姓名及其部门名称。
--->>
SELECT e.ename '员工姓名',d.dname '部门名称'
FROM emp e
LEFT JOIN dept d ON e.deptno = d.deptno
WHERE job = 'clerk';


(30) 查询最低工资大于2500的各种工作。
----》SELECT job FROM emp WHERE sal>2500;


(31) 查询平均工资低于2000的部门及其员工信息。
----->
select *
from dept d left join emp e on d.deptno=e.deptno
where d.deptno in (
select deptno from emp e
group by deptno
having avg(IFNULL(sal,0))<2000)

(32) 查询在SALES部门工作的员工的姓名信息。
---->>
SELECT e.ename FROM emp e 
LEFT JOIN dept d ON e.deptno = d.deptno
WHERE d.dname = 'sales';
(33) 查询工资高于公司平均工资的所有员工信息。
---->
SELECT ename,sal FROM emp
WHERE sal>(SELECT AVG(IFNULL(sal,0)) '平均工资' 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;



(36) 查询工资高于30部门工作的所有员工的工资的员工姓名和工资。
--->>
SELECT ename,sal 
FROM emp 
WHERE sal> (
SELECT MAX(sal) 
FROM emp
WHERE deptno = 30
) AND deptno != 30; 


(37) 查询每个部门中的员工数量、平均工资和平均工作年限。


(38) 查询从事同一种工作但不属于同一部门的员工信息。
---->
SELECT * FROM emp e1
WHERE e1.job IN 
(SELECT job FROM emp e2 WHERE e1.deptno != e2.deptno);

(39) 查询各个部门的详细信息以及部门人数、部门平均工资。(重点)
select d.dname 部门名称,d.deptno 部门编号,count(e.empno) 人数,avg(e.sal) 平均工资 
from dept d 
left outer join emp e on d.deptno=e.deptno
group by d.deptno,d.dname

(40) 查询各种工作的最低工资。
--->
 SELECT job ,min(IFNULL(sal,0))
 FROM emp
 GROUP BY job;
 

(41) 查询各个部门中不同工种的最高工资。(重点)
select emp.* from emp ,
(select deptno,max(sal) sal from emp group by deptno)a
where emp.deptno=a.deptno and emp.sal=a.sal


(42) 查询10号部门员工及其领导的信息。
--->
SELECT e1.ename '员工姓名',e2.ename '上级姓名'
FROM emp e1 LEFT JOIN emp e2 on e1.mgp = e2.empno
WHERE e1.deptno = 10;


(43) 查询各个部门的人数及平均工资。
 SELECT d.dname 部门 ,count(ename) '人数',avg(IFNULL(sal,0)) 平均工资 
 FROM dept d LEFT JOIN emp e  on e.deptno = d.deptno
 group by d.dname;

(44) 查询工资为某个部门平均工资的员工的信息。
 SELECT *
 FROM emp e 
 WHERE e.sal = any(select avg(ifnull(sal,0)) 
from dept d left outer join emp e on d.deptno=e.deptno
group by d.dname)
 


(45) 查询工资高于本部门平均工资的员工的信息。
 SELECT * FROM emp e1
 WHERE e1.sal > (
 SELECT avg(sal) FROM emp e2 
 WHERE e1.deptno = e2.deptno);
 

(46) 查询工资高于本部门平均工资的员工的信息及其部门的平均工资。
 SELECT *,(SELECT avg(sal) FROM emp e2 WHERE e2.deptno = e1.deptno)
 FROM emp e1
 WHERE e1.sal > (SELECT avg(sal) FROM emp e2 WHERE e1.deptno = e2.deptno)


(47) 查询工资高于20号部门某个员工工资的员工的信息。
 SELECT * FROM emp
 WHERE sal >ANY(
 SELECT sal FROM emp 
 WHERE deptno = 20) AND deptno !=20;
 

(48)统计各个工种的员工人数与平均工资。
 SELECT job 工种, count(ename) 人数, avg(IFNULL(sal,0)) 
 FROM emp
 group by job 
 

(49) 统计每个部门中各工种的人数与平均工资。
 SELECT dname 部门,job 工种, count(ename) 人数, avg(IFNULL(sal,0)) 平均工资
 FROM emp e LEFT JOIN dept d  on d.deptno=e.deptno
 group by job ,dname;

(50) 查询其他部门中工资、奖金与30号部门某员工工资
select *
from emp
where sal in (
select sal
from emp
where deptno=30) and deptno!=30



(51) 查询部门人数大于5的部门的员工信息。
 SELECT * FROM emp 
 WHERE deptno in (
 SELECT deptno FROM emp
 GROUP BY deptno
 HAVING count(ename)>5
 )

(52) 查询所有员工工资都大于1000的部门的信息。
 SELECT * FROM dept
WHERE deptno in(
SELECT deptno FROM emp
GROUP BY deptno
HAVING min(sal)>1000)



(53) 查询所有员工工资都大于1000的部门的信息及其员工信息。
SELECT * FROM
emp e LEFT JOIN dept d on d.deptno = e.deptno
WHERE e.deptno in (
select e.deptno from emp e
group by e.deptno
having min(sal)>1000
)


(54) 查询所有员工工资都在900~3000之间的部门的信息。
--->
SELECT * FROM dept 
WHERE deptno in (
SELECT deptno FROM emp 
GROUP BY deptno
HAVING min(sal)>900 AND max(sal)<3000
)



(55) 查询有工资在900~3000之间的员工所在部门的员工信息。
SELECT * FROM emp
WHERE deptno IN(
SELECT deptno FROM emp
GROUP BY deptno 
HAVING min(sal)>900 AND max(sal)<3000
)

(56) 查询每个员工的领导所在部门的信息。
SELECT ename 员工,
(SELECT e1.ename FROM emp e1 WHERE emp.mgp = e1.empno)领导,
(SELECT d.dname FROM emp e LEFT JOIN dept d on d.deptno = e.deptno
WHERE emp .mgp=e.empno )领导所在部门
FROM emp 

(57) 查询人数最多的部门信息。
先找出各个部门的总人数
SELECT d.deptno,d.dname, d.loc FROM dept d JOIN emp e on d.deptno = e.deptno
GROUP BY d.deptno
在找到总人数后进行排序并查找到人数最多的部门
SELECT d.deptno,d.dname, d.loc FROM dept d JOIN emp e on d.deptno = e.deptno
GROUP BY d.deptno
ORDER BY  count(ename) desc LIMIT 0,1


(58) 查询30号部门中工资排序前3名的员工信息。
SELECT *FROM emp
WHERE deptno = 30
ORDER BY sal DESC LIMIT 0,3;
(59) 查询所有员工中工资排序在5到10名之间的员工信息。
SELECT *FROM emp
ORDER BY sal desc LIMIT 5,10;
(60) 查询指定年份之间入职的员工信息。(1980-1985)		
select *from emp where year(hiredate) >1980 and year(hiredate)<1985;
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值