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