1. first_name이 Georgi 인 직원들이 받은 가장 높은 연봉을 높은 순서로 조회하세요. (조회컬럼 emp_no, last_name, salary)
SELECT A.emp_no, A.last_name, B.salary
FROM employees A
INNER JOIN (
SELECT MAX(salary) AS 'salary'
FROM salaries
GROUP BY emp_no ) B ON A.emp_no = B.emp_no
WHERE A.first_name = 'Georgi'
ORDER BY B.salary DESC
[LEFT JOIN과 INNER JOIN 차이점]
1) LEFT OUTER JOIN ON을 수행할 때는 employees의 emp_no와 salaries의 emp_no 값이 같은 것을 불러와서 하나의 집합을 구성한 다음 ⇒ 그 집합에서 first_name이 ‘Georgi’인 것을 필터링함.
2) INNER JOIN은 테이블 조인을 불러올 때 아예 employees의 emp_no와 salaries의 emp_no 값이 같은 것과 first_name이 ‘Georgi’인 것을 바로 불러와서 조회.
👉 대용량 데이터를 가진 테이블 간의 조인이라면, 새롭게 하나의 집합을 구성하는 LEFT OUTER JOIN으로 DB 조회 시 INNER JOIN보다 큰 리소스를 사용하게 됨.
2.현재 마케팅 부서에서 근무중인 직원을 조회하세요 (조회컬럼 emp_no, first_name, last_name)
SELECT A.emp_no, A.first_name, A.last_name
FROM employees A
INNER JOIN dept_emp B ON A.emp_no = B.emp_no
INNER JOIN departments C ON B.dept_no = C.dept_no
WHERE C.dept_name = 'Marketing'
3. 생일이 6월인 여성 직원을 부서명 기준 오름차순으로 정렬하세요.
SELECT A.emp_no, A.birth_date, A.first_name, A.last_name, A.gender, C.dept_name
FROM employees A
INNER JOIN dept_emp B ON A.emp_no = B.emp_no
INNER JOIN departments C ON B.dept_no = C.dept_no
WHERE A.gender = 'F' AND MONTH(birth_date) = 06
ORDER BY dept_name
👉 MONTH(birth_date) = ‘6’을 해도 mysql에서 자동으로 숫자로 인식. 그러나 ‘06’으로 했을 경우는 숫자가 꼭 06 이여야 인식이 됨.
4. production 부서의 직원들을 누적급여 상위 50명을 조회하세요.
# 내 쿼리 = 0.0350 => 서브쿼리로 그룹을 먼저 묶어서 테이블 수가 적었나?
SELECT A.emp_no, A.first_name, A.last_name, C.dept_name, D.sum_salary
FROM employees A
INNER JOIN dept_emp B ON A.emp_no = B.emp_no
INNER JOIN departments C ON B.dept_no = C.dept_no
INNER JOIN ( SELECT emp_no, SUM(salary) AS 'sum_salary'
FROM salaries
GROUP BY emp_no
ORDER BY sum_salary DESC
) D ON A.emp_no = D.emp_no
WHERE C.dept_name = 'production'
ORDER BY sum_salary DESC
LIMIT 50
#팀원 쿼리 = 0.0600
SELECT SUM(salary) AS salary, e.last_name
FROM salaries s
JOIN dept_emp de ON de.emp_no = s.emp_no
JOIN departments d ON de.dept_no = d.dept_no AND d.dept_name = 'production'
JOIN employees e ON s.emp_no = e.emp_no
GROUP BY s.emp_no
ORDER BY salary DESC
LIMIT 50
👉 조인을 할 때 아예 조건을 주었음.
5. 자기생일에 고용된 사람중 first_name이 A로 시작하는 사람을 조회하세요.
SELECT emp_no, birth_date, first_name, last_name, hire_date
FROM employees
WHERE DATE_FORMAT(birth_date,'%m-%d') = DATE_FORMAT(hire_date, '%m-%d')
AND first_name LIKE 'A%'
👉 셀프 조인이 아니라, 테이블 하나로도 구할 수 있는 쿼리였음.