😢MYSQL의 조인은 테이블 쪼개고 합치기라고 정의내리겠다!
다시 찾아 볼 일이 생길 것 같아서 내가 SQL 구문 가공과정을 기록하기로 했다.
✅내가 해결해야 하는 DB ERD
1. dept_emp는 한 사람이 근무했던 모든 부서번호가 출력되기에 최근에 근무하는 부서번호를 출력해야했다
-아래 코드는 같은 아이디의 최근 부서를 출력한 테이블이다.
SELECT emp_no,Max(to_date) From dept_emp GROUP BY emp_no;
-위 테이블에서 종업원 번호와 부서번호만 출력하는 테이블을 만든다
SELECT emp_no,dept_no FROM dept_emp WHERE (emp_no,to_date) IN(
SELECT emp_no,Max(to_date) From dept_emp GROUP BY emp_no)
2. 위 테이블에 동일한 부서번호 옆에 부서이름을 추가해주기위해 department 테이블을 조인하기로 한다.
SELECT DE.*,D.dept_name FROM (
SELECT emp_no,dept_no FROM dept_emp
WHERE (emp_no,to_date) IN(SELECT emp_no,Max(to_date) From dept_emp GROUP BY emp_no)
) AS DE
LEFT JOIN departments AS D ON DE.dept_no=D.dept_no
4. 이제 이 테이블에 emp_no이 일치하는 종업원의 정보(table:employees) 를 조인해줄것이다
(2000년도 이후의 고용된 종업원)
******👌ㅇㅕㄱ ㅣㄲ ㅏㅈ ㅣ 오신분들은 원리를 깨우치셨을거라 생각한다 ㅎㅎㅎ 도움이되길
✨일단 기본 구문을 적어보자 // 오류방지 : 2000년 이후 고용된 employee의 모든 컬럼 소환!😂
SELECT E.* FROM employees AS E WHERE YEAR(E.hire_date)>=2000
✨미리 조인 구문을 짜본다
SELECT E.* FROM employees AS E
LEFT JOIN ⭕테이블⭕ AS D ON D.emp_no=E.emp_no WHERE YEAR(E.hire_date)>=2000
✨테이블이라 적힌곳에 위에서 작성한 테이블 구문을 넣어준다
SELECT E.*,D.dept_name FROM employees AS E
LEFT JOIN
⭕(SELECT DE.*,D.dept_name FROM (SELECT emp_no,dept_no FROM dept_emp WHERE (emp_no,to_date) IN(
SELECT emp_no,Max(to_date) From dept_emp GROUP BY emp_no)) AS DE LEFT JOIN departments AS D ON DE.dept_no=D.dept_no
) AS D ⭕
ON D.emp_no=E.emp_no
WHERE YEAR(E.hire_date)>=2000
5. 이제 이 테이블을 기준으로 직급, 최대급여를 받아보자 .... 후...
이 테이블을 A라고 하면 B=A+직급 조인 , B+최대급여 조인 이렇게 완성하자 ..
6. 최신 직급 타이틀은 이렇게 구성한다.
SELECT emp_no,title FROM titles WHERE (emp_no,to_date) IN(
SELECT emp_no,Max(to_date) From titles GROUP BY emp_no)
7. 기존 테이블에 emp_no을 연결시켜주면 된다
SELECT E.*, T.title
FROM (A테이블) AS E
LEFT JOIN (최신직급테이블) AS T ON E.emp_no=T.emp_no
SELECT E.*, T.title FROM (SELECT E.*,D.dept_name FROM employees AS E
LEFT JOIN (SELECT DE.*,D.dept_name FROM (SELECT emp_no,dept_no FROM dept_emp WHERE (emp_no,to_date) IN(
SELECT emp_no,Max(to_date) From dept_emp GROUP BY emp_no)) AS DE LEFT JOIN departments AS D ON DE.dept_no=D.dept_no
) AS D ON D.emp_no=E.emp_no
WHERE YEAR(E.hire_date)>=2000
) AS E LEFT JOIN (SELECT emp_no,title FROM titles WHERE (emp_no,to_date) IN(
SELECT emp_no,Max(to_date) From titles GROUP BY emp_no)
) AS T ON E.emp_no=T.emp_no
8. 최대급여
SELECT emp_no,salary FROM salaries WHERE (emp_no,salary) IN(
SELECT emp_no,Max(salary) From salaries GROUP BY emp_no)
9.최대급여를 조인하자.... 후
SELECT E.*, S.salary
FROM (SELECT E.*, T.title FROM (SELECT E.*,D.dept_name FROM employees AS E
LEFT JOIN (SELECT DE.*,D.dept_name FROM (SELECT emp_no,dept_no FROM dept_emp WHERE (emp_no,to_date) IN(
SELECT emp_no,Max(to_date) From dept_emp GROUP BY emp_no)) AS DE LEFT JOIN departments AS D ON DE.dept_no=D.dept_no
) AS D ON D.emp_no=E.emp_no
WHERE YEAR(E.hire_date)>=2000
) AS E LEFT JOIN (SELECT emp_no,title FROM titles WHERE (emp_no,to_date) IN(
SELECT emp_no,Max(to_date) From titles GROUP BY emp_no)
) AS T ON E.emp_no=T.emp_no) AS E
LEFT JOIN (SELECT emp_no,salary FROM salaries WHERE (emp_no,salary) IN(
SELECT emp_no,Max(salary) From salaries GROUP BY emp_no)
) AS S ON E.emp_no=S.emp_no
😍성공하고 나서 무야호를 얼마나 외쳤는지~ 다중테이블로 고생하시는 분들 성공하세요!
'개발 > SQL' 카테고리의 다른 글
SQL 미니 과제와 함께하는 쿼리 공부하기 -2 GROUP BY (1) | 2022.10.06 |
---|---|
SQL 미니 과제와 함께하는 쿼리 공부하기 -3 집계함수 (1) | 2022.10.06 |
SQL 미니 과제와 함께하는 쿼리 공부하기 -1 테이블 정의 , Join (0) | 2022.10.06 |
데이터베이스의 이해 ( Database, DBMS ,SQL의 개념) (0) | 2022.08.05 |
node에서 MySQL row값 가져오기 (0) | 2022.05.24 |