-- 2.查询员工编号,员工姓名,工资,职务名称,职务描述,部门名称,部门位置
/*
分析:
1)员工编号,员工姓名,工资需要查询emp表
2)职务名称,职务描述需要查询job表
3)部门名称,部门位置需要查询dept表
4)查询条件 emp.job_id = job.id and emp.dept_id = dept.id
*/
select
t1.`id`,
t1.`ename`,
t1.`salary`,
t2.`jname`,
t2.`description`,
t3.`dname`,
t3.`loc`
from
emp t1, job t2, dept t3
where
t1.`job_id` = t2.`id` and t1.`dept_id` = t3.`id`;
-- 3.查询员工姓名,工资,工资等级
/*
分析:
1)员工姓名,工资需要查询emp表
2)工资等级需要查询salarygrade表
3)查询条件
emp.salary >= salarygrade.losalary and emp.salary <= salarygrade.hisalary
emp.salary between salarygrade.losalary and salarygrade.hisalary
*/
SELECT
t1.ename ,
t1.`salary`,
t2.*
FROM
emp t1, salarygrade t2
WHERE
t1.`salary` BETWEEN t2.`losalary` AND t2.`hisalary`;
-- 4.查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
/*
分析:
1)员工姓名,工资需要查询emp表
2)职务名称,职务描述需要查询job表
3)部门名称,部门位置需要查询dept表
4)工资等级需要查询salarygrade表
5)查询条件
emp.job_id = job.id and emp.dept_id = dept.id and emp.salary between salarygrade.losalary and salarygrade.hisalary
*/
SELECT
t1.`ename`,
t1.`salary`,
t2.`jname`,
t2.`description`,
t3.`dname`,
t3.`loc`,
t4.`grade`
FROM
emp t1,job t2,dept t3,salarygrade t4
WHERE
t1.`job_id` = t2.`id`
AND t1.`dept_id` = t3.`id`
AND t1.`salary` BETWEEN t4.`losalary` AND t4.`hisalary`;
-- 5.查询出部门编号、部门名称、部门位置、部门人数
/*
分析:
1)部门人数需要去查询emp表
2)部门编号、部门名称、部门位置需要查询dept表
3)查询条件:
使用分组查询,按照emp.dept_id完成分组,查询count(id)
使用子查询将以上的查询结果和dept表进行关联查询
*/
SELECT
t1.`id`,t1.`dname`,t1.`loc` , t2.total
FROM
dept t1,
(SELECT
dept_id,COUNT(id) total
FROM
emp
GROUP BY dept_id) t2
WHERE t1.`id` = t2.dept_id;
-- 6.查询所有员工的姓名及其直接上级的姓名,没有领导的员工也需要查询
/*
分析:
1)员工姓名,直接上级的姓名需要查询emp表
2)emp表的id和mgr是自关联的
3)查询条件 emp.id = emp.mgr 且使用左外连接查询左表(员工表)的所有数据和交集数据
*/
SELECT
t1.ename,
t1.mgr,
t2.`id`,
t2.`ename`
FROM emp t1
LEFT JOIN emp t2
ON t1.`mgr` = t2.`id`;