-- ---------------------------- -- mysql练习sql脚本 -- ---------------------------- create database db10; -- 创建db10数据库 use db10; -- 切换到db10数据库 create table dept( -- 创建部门表 deptno int primary key, -- 部门编号 deptname varchar(50), -- 部门名称 loc varchar(50) -- 部门位置 ); create table emp( -- 创建员工表 empno int primary key, -- 员工编号 primary key设置主键:值必须唯一且不能为空 empname varchar(50), -- 员工姓名 job varchar(50), -- 职位 mgr int, -- 直属上级 hiredate date, -- 受雇日期 sal int, -- 薪资 comm int, -- 奖金 deptno int, -- 所在部门编号 foreign key(deptno) references dept(deptno) ); -- ---------------------------- -- Records of dept 部门表数据 -- ---------------------------- INSERT INTO `dept` VALUES ('10', '会计部', '北京'); INSERT INTO `dept` VALUES ('20', '调查部', '杭州'); INSERT INTO `dept` VALUES ('30', '销售部', '上海'); INSERT INTO `dept` VALUES ('40', '营销部', '深圳'); -- ---------------------------- -- Records of emp 员工表数据 -- ---------------------------- INSERT INTO `emp` VALUES ('7369', '张无忌', '办事员', '7902', '1980-12-17', '800', null, '20'); INSERT INTO `emp` VALUES ('7499', '曹操', '推销员', '7698', '1981-02-20', '1600', '300', '30'); INSERT INTO `emp` VALUES ('7521', '杨志', '推销员', '7698', '1981-02-22', '1250', '500', '30'); INSERT INTO `emp` VALUES ('7566', '朱元璋', '经理', '7839', '1981-04-02', '2975', null, '20'); INSERT INTO `emp` VALUES ('7654', '殷天正', '推销员', '7698', '1981-09-28', '1250', '1400', '30'); INSERT INTO `emp` VALUES ('7698', '张三丰', '经理', '7839', '1981-05-01', '2850', null, '30'); INSERT INTO `emp` VALUES ('7782', '关羽', '经理', '7839', '1981-06-09', '2450', null, '10'); INSERT INTO `emp` VALUES ('7788', '宋江', '分析员', '7566', '1987-04-19', '3000', null, '20'); INSERT INTO `emp` VALUES ('7839', '韩少云', '董事长', null, '1981-11-17', '5000', null, '10'); INSERT INTO `emp` VALUES ('7844', '孙二娘', '推销员', '7698', '1981-09-08', '1500', '0', '30'); INSERT INTO `emp` VALUES ('7876', '张飞', '办事员', '7788', '1987-05-23', '1100', null, '20'); INSERT INTO `emp` VALUES ('7900', '赵云', '办事员', '7698', '1981-12-03', '950', null, '30'); INSERT INTO `emp` VALUES ('7902', '诸葛亮', '分析员', '7566', '1981-12-03', '3000', null, '20'); INSERT INTO `emp` VALUES ('7934', '夏侯惇', '办事员', '7782', '1982-01-23', '1300', null, '10');
要求:
-- 1.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。 -- 2.列出薪资比关羽高的所有员工。 -- 3.列出所有员工的姓名及其直接上级的姓名。 -- 4.列出最低薪资大于1500的各种职位及从事此职位的员工人数。 -- 5.列出在销售部职位的员工的姓名,假定不知道销售部的部门编号。 -- 6.列出与曹操从事相同职位的所有员工及部门名称。 -- 7.列出薪资高于在销售部(已知部门编号为30)就职的所有员工的薪资的员工姓名和薪资、部门名称。 -- 8.列出在每个部门职位的员工数量、平均工资。 -- 9.查出至少有一个员工的部门。显示部门人数、部门编号、部门名称、部门位置。 -- 10.列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称。 -- 11.列出所有职员的姓名及其部门名称,部门的人数。
答案:
+----------+-------+---------+--------+------+------------+------+------+--------+ | deptname | empno | empname | job | mgr | hiredate | sal | comm | deptno | +----------+-------+---------+--------+------+------------+------+------+--------+ | 会计部 | 7782 | 关羽 | 经理 | 7839 | 1981-06-09 | 2450 | NULL | 10 | | 会计部 | 7839 | 韩少云 | 董事长 | NULL | 1981-11-17 | 5000 | NULL | 10 | | 会计部 | 7934 | 夏侯惇 | 办事员 | 7782 | 1982-01-23 | 1300 | NULL | 10 | | 调查部 | 7369 | 张无忌 | 办事员 | 7902 | 1980-12-17 | 800 | NULL | 20 | | 调查部 | 7566 | 朱元璋 | 经理 | 7839 | 1981-04-02 | 2975 | NULL | 20 | | 调查部 | 7788 | 宋江 | 分析员 | 7566 | 1987-04-19 | 3000 | NULL | 20 | | 调查部 | 7876 | 张飞 | 办事员 | 7788 | 1987-05-23 | 1100 | NULL | 20 | | 调查部 | 7902 | 诸葛亮 | 分析员 | 7566 | 1981-12-03 | 3000 | NULL | 20 | | 销售部 | 7499 | 曹操 | 推销员 | 7698 | 1981-02-20 | 1600 | 300 | 30 | | 销售部 | 7521 | 杨志 | 推销员 | 7698 | 1981-02-22 | 1250 | 500 | 30 | | 销售部 | 7654 | 殷天正 | 推销员 | 7698 | 1981-09-28 | 1250 | 1400 | 30 | | 销售部 | 7698 | 张三丰 | 经理 | 7839 | 1981-05-01 | 2850 | NULL | 30 | | 销售部 | 7844 | 孙二娘 | 推销员 | 7698 | 1981-09-08 | 1500 | 0 | 30 | | 销售部 | 7900 | 赵云 | 办事员 | 7698 | 1981-12-03 | 950 | NULL | 30 | +----------+-------+---------+--------+------+------------+------+------+--------+ -- 1.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。 /* 列: deptname, emp.* 条件: emp.deptno=dept.deptno */ select d.deptname, e.* from dept d left join emp e on e.deptno=d.deptno; -- 2.列出薪资比关羽高的所有员工。 /* 列: emp.* 表: emp 条件: sal>(关羽的薪资) */ -- 求出关羽的薪资: select * from emp where sal> (select sal from emp where empname='关羽'); -- 3.列出所有员工的姓名及其直接上级的姓名。 /* 列: e1.empname, (直接上级)e2.empname 表: emp e1, emp e2 条件: e1.mgr=e2.empno */ select e1.empname, e2.empname from emp e1, emp e2 where e1.mgr=e2.empno; -- 4.列出最低薪资大于1500的各种职位及从事此职位的员工人数。 /* 列: job 员工人数 表: emp 条件: 最低薪资(分组)>1500 分组条件: job */ select job, min(sal) 最低工资, count(*) 员工人数 from emp group by job having min(sal)>1500; -- 5.列出在销售部的员工的姓名,假定不知道销售部的部门编号。 /* 列: empname 表: dept d, emp e 条件: d.deptname='销售部' d.deptno=e.deptno */ select e.empname, d.deptname from dept d, emp e where d.deptname='销售部' and d.deptno=e.deptno; -- 6.列出与曹操从事相同职位的所有员工及部门名称。 /* 列: e.empname d.deptname 表: emp e, dept d 条件: job='曹操的职位' e.deptno=d.deptno */ select e.empname, d.deptname, e.job from emp e, dept d where e.deptno=d.deptno and job=(select job from emp where empname='曹操'); -- 7.列出薪资高于在销售部(已知部门编号为30)就职的所有员工的薪资的员工姓名和薪资、部门名称。 /* 列: e.empname, e.sal, d.deptname 表: emp e, dept d 条件: e.deptno=d.deptno sal> (30号部门的最高薪资) */ select d.deptname, e.* /*select d.deptname, e.sal, e.empname*/ from emp e, dept d where e.deptno=d.deptno and e.sal > (select max(sal) from emp where deptno=30); -- 8.列出在每个部门职位的员工数量、平均工资。 /* 列: 员工数量, 平均工资 表: emp 分组条件: deptno 聚合函数: count(*), avg(sal) */ select deptno, count(*) 员工数量, avg(sal) 平均工资 from emp group by deptno; -- 9.查出至少有一个员工的部门。显示部门人数、部门编号、部门名称、部门位置。 /* 列: 部门人数(count(*)) d.deptno, d.deptname, d.loc 表: emp e, dept d 条件: e.deptno=d.deptno 分组条件: e.deptno */ select d.*, count(*) 部门人数 from emp e, dept d where e.deptno=d.deptno group by e.deptno; -- 10.列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称。 /* 列: e.empno, e.empname, d.deptname 表: emp e1, emp e2, dept d 条件: e1.hiredate<e2.hiredate and e1.mgr=e2.empno and e1.deptno=d.deptno */ select e1.empno, e1.empname, d.deptname from emp e1, emp e2, dept d where e1.hiredate<e2.hiredate and e1.mgr=e2.empno and e1.deptno=d.deptno; -- 11.列出所有职员的姓名及其部门名称,部门的人数。 /* 张三丰 调查部 6 列: e.empname, count(*)(分组e.deptno), d.deptname 表: emp e, dept d 条件: e.deptno=d.deptno 分组条件: e.deptno */ --查询员工及对应的部门 select e.empname, d.deptname, d.deptno from emp e, dept d where e.deptno=d.deptno; --查询部门的人数 select deptno, count(*) cnt from emp group by deptno --关联查询 select e.empname, d.deptname, e.deptno, e2.cnt 部门人数 from emp e, dept d, ( select deptno, count(*) cnt from emp group by deptno ) e2 where e.deptno=d.deptno and e.deptno=e2.deptno;