MySQL 多表連線查詢練習 (四)
阿新 • • 發佈:2018-12-22
測試用資料來源於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