코딩하는 문과생
[SQL] 6. JOIN 본문
# JOIN
논리 모델링에서 중요한 점은
- 다대다를 풀어주고
- 정규화 시키는 것이다.
- EQUAL JOIN: 공통부분을 이용해 JOIN한다.
- NON EQUAL JOIN: 공통부분이 없다. 근데 JOIN한다.
JOIN이후 하나의 논리 테이블이 만들어진다고 생각하자.
# 오라클 전용 구문 EX1)
SELECT EMP_NAME, DEPT_NAME
FROM EMPLOYEE E,
DEPARTMENT D
WHERE E.DEPT_ID = D.DEPT_ID;
# 오라클 전용 구문 EX2)
SELECT EMP_NAME
, SALARY
, SLEVEL
FROM EMPLOYEE E
, SAL_GRADE S
WHERE E.SALARY BETWEEN S.LOWEST AND S.HIGHEST;
# 오라클 전용 구문 EX3)
//OUTER JOIN 1
SELECT EMP_NAME, DEPT_NAME
FROM EMPLOYEE E,
DEPARTMENT D
WHERE E.DEPT_ID(+) = D.DEPT_ID;
//(+)기호 반대쪽에 있는 모든 것을 출력한다.
# 오라클 전용 구문 EX4)
//OUTER JOIN 2
SELECT EMP_NAME, DEPT_NAME
FROM EMPLOYEE E,
DEPARTMENT D
WHERE E.DEPT_ID = D.DEPT_ID(+);
//(+)기호 반대쪽에 있는 모든 것을 출력한다.
# 오라클 전용 구문 EX5)
//OUTER JOIN 3 - (+), (+)는 불가능
SELECT EMP_NAME, DEPT_NAME
FROM EMPLOYEE E,
DEPARTMENT D
WHERE E.DEPT_ID(+) = D.DEPT_ID(+);
//오류, 불가능
# JOIN 구문
...
JOIN TABLE ON condition1 (조건식)
JOIN TABLE USING column (칼럼명)
...
USING구문에서는 테이블 별칭을 사용할 수 없다.
EX1)
SELECT EMP_NAME, DEPT_NAME
FROM EMPLOYEE E
JOIN DEPARTMENT D
USING(DEPT_ID);
//*************************************
SELECT EMP_NAME
, SALARY
, SLEVEL
FROM EMPLOYEE E
JOIN SAL_GRADE S
ON (E.SALARY BETWEEN S.LOWEST AND S.HIGHEST);
//같은 칼럼이지만 이름이 다른 경우 ON을 써서 JOIN한다.
SELECT DEPT_NAME,
LOC_DESCRIBE
FROM DEPARTMENT
JOIN LOCATION
ON (LOC_ID = LOCATION_ID);
- LEFT JOIN: 왼쪽 테이블을 모두 출력하겠다는 의미
- RIGHT JOIN: 오른쪽 테이블을 모두 출력하겠다는 의미
- FULL JOIN: 모두 출력하겠다는 의미
- NATURAL JOIN: 부모의 기본키와 자식의 외래키가 같은 경우(칼럼이 이름이 같은 경우), 알아서 JOIN해준다.
- CROSS JOIN: 카디션 프로젝트 (큰 의미가 없는 JOIN)
EX2)
SELECT EMP_NAME, DEPT_NAME
FROM EMPLOYEE E
LEFT JOIN DEPARTMENT D
USING(DEPT_ID);
EX3)
SELECT E.EMP_NAME AS 직원,
M.EMP_NAME AS 관리자
FROM EMPLOYEE E
JOIN EMPLOYEE M
ON E.MGR_ID = M.MGR_ID
ORDER BY 1;
EX4)
SELECT E.EMP_NAME AS 직원,
M.EMP_NAME AS 관리자,
S.EMP_NAME AS 인원
FROM EMPLOYEE E
JOIN EMPLOYEE M ON (E.MGR_ID = M.EMP_ID)
JOIN EMPLOYEE S ON (M.MGR_ID = S.EMP_ID)
ORDER BY 1;
EX5)
SELECT E.EMP_NAME, J.JOB_TITLE, D.DEPT_NAME
FROM EMPLOYEE E
JOIN JOB J USING(JOB_ID)
JOIN DEPARTMENT D USING(DEPT_ID)
EX6)
//5개 테이블 조인 후, 직급이 대리, 지역이 아시아인 사원 출력
SELECT E.EMP_NAME
, J.JOB_TITLE
, D.DEPT_NAME
, S.SLEVEL
, E.SALARY
, L.LOC_DESCRIBE
, C.COUNTRY_NAME
FROM EMPLOYEE E
JOIN JOB J USING(JOB_ID)
JOIN DEPARTMENT D USING(DEPT_ID)
JOIN LOCATION L ON D.LOC_ID = L.LOCATION_ID
JOIN COUNTRY C USING(COUNTRY_ID)
JOIN SAL_GRADE S ON (E.SALARY BETWEEN S.LOWEST AND S.HIGHEST)
WHERE J.JOB_TITLE = '대리'
AND LOC_DESCRIBE LIKE '아시아%';
'프로그래밍 > SQL' 카테고리의 다른 글
[SQL] 8. Subquery (0) | 2020.01.22 |
---|---|
[SQL] 7. SET Operator (0) | 2020.01.22 |
[SQL] 5. Additional SELECT(3) (0) | 2020.01.21 |
[SQL] 4. Additional SELECT(2) (0) | 2020.01.21 |
[SQL] 3. Additional SELECT (0) | 2020.01.20 |