Ⅰ. JOIN
JOIN이란? 두 개 이상의 테이블에서 원하는 정보를 조회하는 방법.
조회 결과는 하나의 RESULT SET.
ANSI | ORACLE 한정 | |
INNER JOIN NULL 조회 패스할 수도 있음 |
(INNER) JOIN USING NATURAL (INNER) JOIN |
EQUAL JOIN |
OUTER JOIN 기준 테이블의 값은 모두 조회 |
LEFT (OUTER) JOIN RIGHT (OUTER) JOIN FULL (OUTER) JOIN (ORACLE 불가) |
LEFT OUTER RIGHT OUTER |
자체, 비등가 | JOIN ON | SELF JOIN NON EQUAL JOIN |
교차곱 | CROSS JOIN | CATERCIAN PRODUCT |
예시)
TABLE 1 : EMPLOYEE EMP_ID, EMP_NAME, DEPT_CODE, JOB_CODE, MANAGER_ID
TABLE 2 : DEPARTMENT DEPT_ID, DEPT_NAME
TABLE 3 : JOB JOB_CODE, JOB_NAME
TABLE 4 : SAL_GRADE SAL_LEVEL, MIN_SAL, MAX_SAL
INNER JOIN
NATURAL JOIN은 모든 컬럼에 EQUAL JOIN을 하기 때문에, 조건을 따로 명시할 수 없다.
두개 이상의 공통된 중복 컬럼이 존재하는 테이블 간 JOIN은 불가능하다.
예) EMPLOYEE 테이블에서 JOB테이블과 JOB_CODE으로 조인하기
--ANSI
SELECT EMP_NAME, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING (JOB_CODE);
SELECT EMP_NAME, JOB_NAME
FROM EMPLOYEE
NATURAL JOIN JOB;
--ORACLE
SELECT EMP_NAME, JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE=J.JOB_CODE;
OUTER JOIN
예) EMPLOYEE 테이블을 기준으로, EMPLOYEE 테이블의 DEPT_CODE와 DEPARTMENT 테이블의 DEPT_ID로 JOIN하기
--ANSI
SELECT EMP_NAME, DEPT_NAME
FROM EMPLOYEE
LEFT/*RIGHT*/ JOIN DEPARTMENT ON (DEPT_CODE=DEPT_ID);
--ORACLE
SELECT EMP_NAME, JOB_NAME
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE=DEPT_ID(+);
--EMPLOYEE의 모든 내용을 조회
자체조인
--ANSI
SELECT E.EMP_NAME, M.EMP_NAME
FROM EMPLOYEE E
LEFT JOIN EMPLOYEE M ON (E.MANAGER_ID = M.EMP_ID);
--ORACLE
SELECT E.EMP_NAME, M.EMP_NAME
FROM EMPLOYEE E, EMPLOYEE M
WHERE E.MANAGER_ID = M.EMP_ID(+);
비등가
--ANSI
SELECT EMP_NAME, SAL_LEVEL
FROM EMPLOYEE
JOIN SAL_GRADE ON (SALARY BETWEEN MIN_SAL AND MAX_SAL);
--ORACLE
SELECT EMP_NAME, SALARY, E.SAL_LEVEL
FROM EMPLOYEE E, SAL_GRADE S
WHERE SALARY BETWEEN MIN_SAL AND MAX_SAL
CROSS JOIN/Cartesian Product : 조건 없이 JOIN
테이블과 테이블을 순수하게 곱하여 모든 경우의 수를 만드는 것. 과부하의 위험이 있다.
굳이 사용한다면 STUDENT 테이블에 각 SUBJECT(KOREAN, MATH, ENGLISH...등)를 분배할때나 쓰려나?
--CROSS JOIN
SELECT EMP_NAME, DEPT_NAME
FROM EMPLOYEE
CROSS JOIN DEPARTMENT;
--CARTESIAN PRODUCT
SELECT EMP_NAME, DEPT_NAME
FROM EMPLOYEE, DEPARTMENT;
Ⅱ. 집합연산자
예)
TABLE1 : STUDENT STUDENT_NAME, MATH, CLUB
CLUB='운동부' : 가, 나, 다, 라, 마
MATH>80 : 가, 나, 마, 바
UNION : 합집합
SELECT STUDENT_NAME
FROM STUDENT
WHERE CLUB='운동부'--5
UNION
SELECT STUDENT_NAME
FROM STUDENT
WHERE MATH>80;--4
--가, 나, 다, 라, 마, 바--5+4-3=6
INTERSECT : 교집합
SELECT STUDENT_NAME
FROM STUDENT
WHERE CLUB='운동부'--5
INTERSECT
SELECT STUDENT_NAME
FROM STUDENT
WHERE MATH>80;--4
--가, 나, 마--3
UNION ALL : n(A)+n(B)
SELECT STUDENT_NAME
FROM STUDENT
WHERE CLUB='운동부'--5
UNION ALL
SELECT STUDENT_NAME
FROM STUDENT
WHERE MATH>80;--4
--가, 나, 다, 라, 마, 가, 나, 마, 바--5+4=9
MINUS : 차집합
SELECT STUDENT_NAME
FROM STUDENT
WHERE CLUB='운동부'--5
MINUS
SELECT STUDENT_NAME
FROM STUDENT
WHERE MATH>80;--4
--다, 라--2
'DBMS > Oracle' 카테고리의 다른 글
[DML, TCL] 데이터 조작과 반영 (0) | 2021.11.14 |
---|---|
[DDL, DCL] 객체의 구조 설정과 권한 (0) | 2021.11.11 |
[SELECT] SUBQUERY (0) | 2021.11.11 |
[SELECT] 기초와 함수 (0) | 2021.11.07 |
DBMS 기초 (0) | 2021.11.07 |