1. 程式人生 > >MySQL 多表連線查詢練習 (四)

MySQL 多表連線查詢練習 (四)

測試用資料來源於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