개발/SQL

MYSQL 다중 조인 테이블, 다중 조건 테이블 (테이블만 6개)

카레공 2022. 5. 24. 16:51

😢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

 

 

 

😍성공하고 나서 무야호를 얼마나 외쳤는지~ 다중테이블로 고생하시는 분들 성공하세요!