- 동작 순서
SELECT 6
FROM 1
JOIN 2
WHERE 3
GROUP BY 4
HAVING 5
ORDER BY 7
SELECT EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;
SELECT EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
둘 사이에 데이터를 연결해주는 컬럼을 찾는다
SELECT EMP_NAME, EMPLOYEE.JOB_CODE, JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;
SELECT EMP_NAME, E.JOB_CODE, JOB_NAME
FROM EMPLOYEE E
JOIN JOB J ON(E.JOB_CODE = J.JOB_CODE);
SELECT EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);
DEPT_CODE가 NULL인 직원 2명은 조회결과 제외
SELECT EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE=DEPT_ID);
1) LEFT JOIN
JOIN문 기준으로 왼쪽에 있는 테이블은 조건에 일치하지 않더라도
JOIN 결과에 포함. 단, 데이터는 NULL로 출력
SELECT EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE LEFT JOIN DEPARTMENT ON (DEPT_CODE=DEPT_ID);
2) RIGHT JOIN
SELECT EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE RIGHT JOIN DEPARTMENT ON (DEPT_CODE=DEPT_ID);
해외영업3(D7), 마케팅(D3), 국내영업(D4)
SELECT FROM DEPARTMENT;
SELECT FROM EMPLOYEE WHERE DEPT_CODE IN ('D7', 'D3', 'D4');
3) FULL JOIN -> LEFT JOIN + RIGHT JOIN
SELECT EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE FULL JOIN DEPARTMENT ON (DEPT_CODE=DEPT_ID);
4) CROSS JOIN : 조인되는 테이블의 각 행들이 모두 매핑되는 데이터가 검색되는 조인. 쉽게말해 티셔츠 색깔, 사이즈 다 다르면 그 색깔에 따른 사이즈 다 보여주듯이 모든 경우수 보여줌
SELECT EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT
ORDER BY 1;
5) SELF JOIN : 동일한 테이블을 JOIN
SELECT EMP.EMP_ID, EMP.EMP_NAME, EMP.MANAGER_ID, MAN.EMP_NAME
같은 테이블을 컬럼명이 다 겹치니까 소속을 다 적어줘야 한다. EMP.~ , MAN.~ 이렇게
FROM EMPLOYEE EMP
JOIN EMPLOYEE MAN ON(EMP.MANAGER_ID = MAN.EMP_ID);
SELECT EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE);
SELECT EMP_NAME 사원명, EMP_NO 주민번호, DEPT_TITLE 부서명, JOB_NAME 대리
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN JOB USING (JOB_CODE)
WHERE EMP_NO LIKE '7__2__' AND EMP_NAME LIKE '전%';
SELECT EMP_ID, EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
WHERE EMP_NAME LIKE '%형%';
SELECT EMP_NAME 사원명, DEPT_CODE 직급명, DEPT_ID 부서코드, DEPT_TITLE 부서명
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN JOB USING(JOB_CODE)
WHERE DEPT_TITLE LIKE '해외영업%';
SELECT EMP_NAME, BONUS, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID) --이 예제는 JOIN 순서 중요하다
LEFT JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE) -/EMPLOYEE와 LOCATION은 연관이 없으므로, 연관이 있는 EMPLOYEE - DEPARTMENT 우선 JOIN 시키고, 그 다음에 DEPARTMENT와 LOCATION을 JOIN 시킨다./
WHERE BONUS IS NOT NULL;
SELECT EMP_NAME, JOB_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
JOIN JOB USING (JOB_CODE)
JOIN DEPARTMENT ON (DEPT_ID = DEPT_CODE)
JOIN LOCATION ON (LOCAL_CODE = LOCATION_ID)
WHERE DEPT_ID = 'D2';
SELECT EMP_NAME 사원명, DEPT_TITLE 부서명 , LOCAL_NAME 지역명, NATIONAL_NAME 국가명
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN LOCATION L ON (LOCATION_ID = LOCAL_CODE)
JOIN NATIONAL USING(NATIONAL_CODE)
WHERE NATIONAL_NAME IN ('한국', '일본');
내정보가 들어있는 사원테이블은 E1
동료들의 정보가 들어가있는 사원테이블은 E2
같은 EMPLOYEE 테이블을 쓰지만 E1, E2로 구분해줌으로써 다른 테이블처럼 같은 테이블끼리 비교
SELECT E1.EMP_NAME 사원명, DEPT_TITLE, E2.EMP_NAME 동료이름
FROM EMPLOYEE E1
JOIN EMPLOYEE E2 ON (E1.DEPT_CODE = E2.DEPT_CODE)
JOIN DEPARTMENT ON (E1.DEPT_CODE = DEPT_ID)
WHERE E1.EMP_NAME != E2.EMP_NAME
ORDER BY 1;
SELECT EMP_NAME 사원명, JOB_NAME 직급명, SALARY 급여
FROM EMPLOYEE
JOIN JOB USING (JOB_CODE)
WHERE JOB_NAME IN ('차장', '사원') AND BONUS IS NULL;