본문 바로가기
DBMS/Oracle

[SELECT] JOIN과 집합연산자

by 로햐 2021. 11. 8.

Ⅰ. 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