您的位置:首页 > 数据库 > MySQL

MySQL 多表连接查询练习 (四)

2018-02-10 19:44 567 查看
测试用数据来源于Oracle数据库中的测试数据
MySQL数据库表:  employees员工表,departments部门表, locations地址表
库表测试试数据#----表连接查询练习
SELECT * FROM departments;
select * from departments
select * from locations

#--1.显示所有职员的姓名及其所在部门的名称和工资
SELECT e.first_name, d.department_name, e.salary FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id

#--2.查询在研发部('IT')工作员工的编号,姓名,工作部门,工作所在地
SELECT e.employee_id, e.first_name, d.department_name, l.street_address FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id
LEFT JOIN locations l ON d.location_id = l.location_id
WHERE d.department_name LIKE 'IT'
#--3.查询各个部门的名称和员工人数
SELECT e.department_id, d.department_name, COUNT(1) as 员工人数 FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id
GROUP BY e.department_id
#--4.查询工资相同的员工的工资和姓名
SELECT e.employee_id, e2.employee_id, e.first_name, e2.first_name, e.salary FROM employees e
LEFT JOIN employees e2 ON e.salary = e2.salary
WHERE e.employee_id < e2.employee_id
ORDER BY e.salary
#--5.显示10号部门的经理和20号部门的所有职员的详细信息
SELECT e.employee_id, e.manager_id, e.department_id FROM employees e
WHERE e.department_id = 20
OR e.employee_id = (SELECT e2.manager_id FROM employees e2 WHERE e2.department_id =10)
#--6.查询员工的基本信息,附加其上级的姓名
SELECT e.employee_id, e.first_name, e.manager_id, e2.employee_id, e2.first_name FROM employees e
LEFT JOIN employees e2 ON e.manager_id = e2.employee_id
#--7.求入职日期相同(年月日相同)的员工
#--方法一
SELECT e.employee_id, e2.employee_id, e.hire_date, e2.hire_date FROM employees e
LEFT JOIN employees e2 ON e.hire_date = e2.hire_date
WHERE e.employee_id<e2.employee_id
ORDER BY e.hire_date
#--方法二
SELECT e.employee_id, e2.employee_id, e.hire_date, e2.hire_date FROM employees e
INNER JOIN employees e2 ON e.hire_date = e2.hire_date
AND e.employee_id<e2.employee_id
ORDER BY e.hire_date
#--方法三
SELECT e.employee_id, e2.employee_id, e.hire_date, e2.hire_date FROM employees e ,employees e2
WHERE e.hire_date = e2.hire_date
AND e.employee_id<e2.employee_id
ORDER BY e.hire_date
;
select e.EMPLOYEE_ID, e.DEPARTMENT_ID, e.MANAGER_ID , e.SALARY from employees e WHERE e.DEPARTMENT_ID=20;
SELECT * FROM departments d
#--8.显示各个部门经理的基本工资 统计要是部门表为准, 一个部门只会有一个领导
#--employees表存在的情况是一个人一个部门,没有上级领导,一个部门中存在多个不同领导
#--departments表存在有的部门没有领导
SELECT e.department_id, e.manager_id, e.salary FROM employees e
GROUP BY e.department_id
HAVING !ISNULL(e.department_id) and !ISNULL(e.manager_id)
#--第一步 查询各个部门的经理编号 --tb1
select * from departments d where d.manager_id is not null ;
#--第二步 员工表与 tb1创建连接
select e.employee_id, d.department_id,d.manager_id, e.salary FROM employees e
INNER JOIN departments d ON e.employee_id = d.manager_id
ORDER BY d.department_id

#--9. 查询平均工资最高的部门信息
#--查询各部门的平均工资, --tb1
SELECT e.department_id, AVG(e.salary) avgSalary FROM employees e
GROUP BY e.department_id HAVING !ISNULL(e.department_id)
#--再查其中最高的平均工资 -tb2
SELECT tb1.department_id, MAX(tb1.avgSalary) FROM (
SELECT e.department_id, AVG(e.salary) avgSalary FROM employees e
GROUP BY e.department_id HAVING !ISNULL(e.department_id)
)tb1
#--再查其中的平均工资最高部门的部门信息
SELECT d.* FROM departments d
WHERE d.department_id = (
SELECT tb2.department_id FROM(
SELECT tb1.department_id, MAX(tb1.avgSalary) FROM (
SELECT e.department_id, AVG(e.salary) avgSalary FROM employees e
GROUP BY e.department_id HAVING !ISNULL(e.department_id)
)tb1
)tb2
);

#--10.查询工资大于本部门平均工资的员工基本信息
#--第一步 按部门查询本部门的平均工资 tb1
SELECT e.department_id, AVG(e.salary) FROM employees e GROUP BY e.DEPARTMENT_ID
#--第二步 多个返回值的条件查询用表连接查询
SELECT tb2.* FROM employees tb2 INNER JOIN (tb1) ON tb1.department_id = tb2.department_id
WHERE tb2.salary>tb1.avgsalary
#--第三步
SELECT e2.* FROM employees e2 INNER JOIN (
SELECT e.department_id, AVG(e.salary) avgSalary FROM employees e GROUP BY e.DEPARTMENT_ID
) tb1 ON tb1.department_id = e2.department_id
WHERE e2.salary>tb1.avgSalary

#--11.查询部门名称为'IT'的员工工资>5000的员工信息.
SELECT e.* FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id
WHERE d.department_name LIKE '%IT%' AND e.salary > 5000
2018-02-10
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息