Mysql多表联合查询练习

文章展示了如何使用SQL创建部门和员工表,并进行多表查询操作,包括部门信息、员工工资、员工与经理关系、部门工资范围、销售部员工、工资高于平均值的员工等复杂查询。同时,还包括了基于工资等级的员工筛选和年薪计算。
摘要由CSDN通过智能技术生成

1.数据准备

-- 创建部门表
CREATE TABLE dept(
	deptno int primary key,	-- 部门编号
	dname varchar(14),			-- 部门名称
	loc varchar(13)					-- 部门地址
);

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

-- 创建员工表
create table emp(
	empno int primary key,	-- 员工编号
	ename VARCHAR(20),			-- 员工姓名
	job varchar(9),					-- 员工工作			
	mgr int, 								-- 员工直属领导编号
	hiredate date,					-- 入职时间
	sal DOUBLE,							-- 工资
	comn DOUBLE,  					-- 奖金
	deptno int							-- 对应dept表的外键
);

ALTER TABLE emp ADD CONSTRAINT FOREIGN KEY emp(deptno) REFERENCES dept(deptno);


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-07-03',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-07-13',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,'1981-01-23',1300,null,10);

-- 工资等级表
CREATE TABLE salgrade(
	grade INT,			-- 等级
	loasal DOUBLE,	-- 最低工资
	hisal DOUBLE		-- 最高工资
); -- 最高工资

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

2.多表查询操作-练习

-- 1.返回拥有员工的部门名、部门号
select a.ename,b.dname,b.deptno from emp as a,dept as b where a.deptno = b.deptno;
select DISTINCT a.ename,b.dname,b.deptno FROM emp as a INNER JOIN dept as b ON a.deptno = b.deptno;
-- 2.工资水平多余smith的员工信息
select * from emp where sal > (SELECT sal FROM emp WHERE ename = 'smith');
select * from emp where sal > (SELECT sal FROM emp WHERE ename = 'smith');
-- 3.返回员工和所属经理的姓名
SELECT a.ename,b.ename FROM emp as a,emp as b where a.mgr = b.empno; 
-- 4.返回员工的雇佣日期早于其经理雇佣日期的员工及其经理姓名
SELECT a.ename,a.hiredate,b.ename,b.hiredate FROM emp as a,emp as b where a.mgr = b.empno AND a.hiredate < b.hiredate;
-- 5.返回员工姓名及其所在的部门名称。
select a.ename,b.dname from emp as a inner join dept as b on a.deptno = b.deptno;
-- 6.返回从事clerk工作的员工姓名和所在部门名称。
select a.ename,b.dname,a.job from emp as a inner join dept as b on a.deptno = b.deptno and a.job = 'clerk';
-- 7.返回部门号及其本部门的最低工资
select b.deptno,min(a.sal) from emp as a inner join dept as b on a.deptno = b.deptno group by b.deptno;
-- 8.返回销售部(sales)所有员工的姓名
select a.ename from emp as a inner join dept as b on a.deptno = b.deptno and b.dname = 'sales';
-- 9.返回工资水平多于平均工资的员工
select * from emp where sal > (select avg(sal) from emp);
-- 10.返回与scott从事相同工作的员工
select * from emp where job = (select job from emp where ename = 'scott');
-- 11.返回工资高于30部门所有员工工作水平的员工
select * from emp where sal > (select max(sal) from emp where deptno = 30);
-- 或者
select * from emp where sal > all(select sal from emp where deptno = 30);
-- 12.返回员工工作及其从事此工作的最低工资
select min(sal),job from emp group by job asc;
-- 13.计算员工年薪,并以年薪排序
select 12*sal + ifnull(comn,0) as salary from emp group by salary;
select ename,12*sal + ifnull(comn,0) as salary_year from emp order by salary_year desc;
-- 14.返回工资处于第四级的员工姓名。
select * from emp where sal between (select loasal from salgrade where grade = 4) and (select hisal from salgrade where grade = 4);
-- 15.返回工资为2等级的职员名字、部门所在地
select 
	* 
from dept as a
join emp as b on a.deptno = b.deptno
join salgrade as c on grade = 2 and b.sal >= c.loasal and b.sal <= c.hisal;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值