0
点赞
收藏
分享

微信扫一扫

【笔记】16. 多表查询练习

福福福福福福福福福 2022-01-31 阅读 22
sql数据库

 数据创建:

-- 创建部门表
create table dept(
	deptno int primary key,
	dname varchar(20),
	loc varchar(13));
insert into dept values
	(10,'accounting','new york'),
	(20,'research','dallas'),
	(30,'sales','chicago'),
	(40,'operations','boston');
-- 创建员工表
create table emp(
	empno int primary key,
	ename varchar(20),
	job varchar(9),
	mgr int,
	hiredate date,
	sal DOUBLE,
	comm double,
	deptno int);
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, 
  -- 最低工资
  losal 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);

数据练习:

#返回拥有员工的部门名、部门号
select deptno,dname from dept where deptno in (select distinct deptno from emp);
select distinct dept.deptno,dname from dept INNER JOIN emp on dept.deptno = emp.deptno;
#工资多于smith的员工信息
select * from emp where emp.sal > (select sal from emp where ename = 'SMITH');
#返回员工和所属经理的姓名
select a.ename, b.ename as manager_name from emp a INNER JOIN emp b on a.mgr = b.empno; 
#返回雇员的雇用日期早于经理的
select a.ename, a.hiredate d1, b.ename as manager_name, b.hiredate d2 from emp a INNER JOIN emp b on a.mgr = b.empno and a.hiredate<b.hiredate; 
#返回员工姓名和所在部门名称
select ename, dname from emp INNER JOIN dept on emp.deptno = dept.deptno;
#返回从事clerk工作的员工姓名和部门
select ename, dname from emp INNER JOIN dept on emp.deptno = dept.deptno and emp.job = 'CLERK';
#返回部门号及本部门的最低工资
select dept.deptno, min(sal) from dept INNER JOIN emp on dept.deptno = emp.deptno GROUP BY dept.deptno;
SELECT deptno,min(sal) from emp GROUP BY deptno;
#返回销售部(sales)所有有员工姓名
SELECT ename from emp where deptno = (SELECT deptno from dept where dname = 'sales');
#返回工资大于平均工资的员工
SELECT ename,sal from emp where sal > (select avg(sal) from emp);
#返回和SCOTT从事相同工作的员工
select ename, job from emp where job = (SELECT job from emp WHERE ename = 'SCOTT');
#工资高于30部门所有员工的员工
select ename, sal from emp where emp.sal > all (select sal from emp where deptno = 30);
#返回员工工作及其从事此工作的最低工资
select a.ename, a.job, b.min_sal from emp a INNER JOIN (select job, min(sal) as min_sal from emp GROUP BY job) b on a.job = b.job;
#返回员工年薪并排序
select a.ename, (a.sal * 12 + IFNULL(comm,0)) t_sal from emp a ORDER BY t_sal;
#返回工资处于第四级别的员工的姓名
select ename from emp where sal BETWEEN (select losal from salgrade where grade = 4) and (select hisal from salgrade where grade = 4);
#返回工资为二等级的姓名,部门,部门所在地
select emp.ename, dept.dname, dept.loc from emp INNER JOIN dept on emp.deptno = dept.deptno and sal BETWEEN (select losal from salgrade where grade = 2) and (select hisal from salgrade where grade = 2);
举报

相关推荐

0 条评论