mysql之join练习

目录

一:插入数据

二:题目

1. 列出至少有4个员工的所有部门编号和名称。

​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.列出所有员工的年工资,按年薪从低到高排序。

19: 列出每个部门薪水前两名最高的人员名称以及薪水


一:插入数据

注意:要是发现代码有错误可能是复制粘贴到这出现了错误。

字段中文名字依次是:工号,姓名,工作岗位,部门经理,受雇日期,薪金,奖金,部门编号
 


DROP TABLE IF EXISTS  `emp`;
CREATE TABLE `emp` (
  `EMPNO` int(4) NOT NULL,
  `ENAME` varchar(10) DEFAULT NULL,
  `JOB` varchar(9) DEFAULT NULL,
  `MGR` varchar(10) DEFAULT NULL,
  `HIREDATE` date DEFAULT NULL,
  `SAL` int(7) DEFAULT NULL,
  `COMM` int(7) DEFAULT NULL,
  `DEPTNO` int(2) DEFAULT NULL,
  PRIMARY KEY (`EMPNO`)
) 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');

 

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

 

 

二:题目


1. 列出至少有4个员工的所有部门编号和名称。

select emp.DEPTNO, DNAME,LOC,COUNT(*) AS COUNT from emp
left join dept
on emp.DEPTNO=dept.DEPTNO
GROUP BY emp.DEPTNO
HAVING COUNT > 4;


2. 列出薪金比“SMITH”多的所有员工。

SELECT * FROM emp WHERE SAL >(select SAL from emp where ENAME = "SMITH");

 

 

3. 列出所有员工的姓名及其直接上级的姓名。

SELECT A.ENAME,A.MGR,B.ENAME AS MGRNAME FROM emp AS A
LEFT JOIN emp AS B
ON A.MGR=B.EMPNO;

 

 


4. 列出受雇日期早于其直接上级的所有员工。

SELECT * FROM (SELECT A.ENAME,A.MGR,B.ENAME AS MGRNAME,A.HIREDATE AS ETIME,B.HIREDATE AS MTIME  FROM emp AS A
LEFT JOIN emp AS B
ON A.MGR=B.EMPNO) AS C WHERE ETIME<MTIME;

 

 

5. 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。

 

 

select dname,emp.* from emp
right join dept
on emp.DEPTNO=dept.DEPTNO;

 

 6. 列出所有“CLERK”(办事员)的姓名及其部门名称。

 

SELECT ENAME,DNAME FROM (SELECT * FROM emp WHERE JOB ='CLERK') AS A
LEFT JOIN dept
ON A.DEPTNO=dept.DEPTNO;


 

 7. 列出最低薪金大于1500的各种工作。 

SELECT JOB,SAL FROM  emp WHERE SAL >1500;

 

 


8. 列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号

select * from emp where deptno =( select deptno from dept where dname = 'SALES');

 

 


9. 列出薪金高于公司平均薪金的所有员工。 

SELECT * FROM emp HAVING SAL> (SELECT FLOOR(SUM(SAL)/COUNT(*)) FROM emp);

 

 


10.列出与“SCOTT”从事相同工作的所有员工。 

SELECT * FROM emp WHERE JOB =(SELECT JOB FROM emp WHERE ENAME='SCOTT') AND ENAME<>'SCOTT';

 

 


11.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。

select ename,sal from emp where sal in (select sal from emp where deptno =30) and deptno <> 30;

 

 


12.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。

select ename,sal from emp where sal>(select max(sal) from emp where deptno =30);

 

 


13.列出在每个部门工作的员工数量、平均工资和平均服务期限。 

select  count(*),avg(sal),avg(datediff("2021-11-08",hiredate)) from emp group by deptno;

 

 


14.列出所有员工的姓名、部门名称和工资。

select ename,if(comm is null, sal,sal+comm)as sal,dname from emp
inner join dept
on emp.deptno=dept.deptno;

 

 


15.列出所有部门的详细信息和部门人数。

select dept.*,e.count from dept
inner join (select count(*)as count,deptno from emp group by deptno) as e
on dept.deptno=e.deptno;

 

 

 


16.列出各种工作的最低工资。 

SELECT JOB,MIN(IF(COMM IS NULL, SAL,SAL+COMM))AS MINSAL FROM emp GROUP BY JOB;

 

 


17.列出各个部门的MANAGER(经理)的最低薪金。

select * from (select * from emp where job='MANAGER') as e1 where 0=(
select count(*) from (select * from emp where job='MANAGER') as e2 where e1.deptno=e2.deptno and e1.sal>e2.sal );

 

 


18.列出所有员工的年工资,按年薪从低到高排序。

SELECT ENAME, IF(COMM IS NULL,SAL,SAL+COMM)*12 AS SAL FROM emp ORDER BY SAL; 

 

 


19: 列出每个部门薪水前两名最高的人员名称以及薪水

SELECT * FROM (SELECT ENAME,DEPTNO, IF(COMM IS NULL,SAL,SAL+COMM)AS SAL FROM emp ) AS S1 WHERE 2>(
SELECT COUNT(*) FROM (SELECT ENAME,DEPTNO, IF(COMM IS NULL,SAL,SAL+COMM)AS SAL FROM emp ) AS S2 WHERE S1.DEPTNO=S2.DEPTNO AND S1.SAL < S2.SAL )ORDER BY DEPTNO;


 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值