본문 바로가기
코딩공부/DB

Oracle - Select문 (04)

by Dobby_72 2025. 1. 20.
반응형

Oracle - Select문 (04)

2025.01.20 - [코딩공부/DB] - Oracle - Select문 (01)

2025.01.20 - [코딩공부/DB] - Oracle - Select문 (02)

2025.01.20 - [코딩공부/DB] - Oracle - Select문 (03)

 


JOIN 용어 정리

JOIN

  • 하나 이상의 테이블에서 데이터를 조회하기 위해 사용
  • 수행 결과는 하나의 RESULT SET 으로 나옴
  • 관계형 데이터 베이스에서 SQL을 이용해 테이블간 '관계'를 맺는 방법

관계형 데이터베이스는 최소환의 데이터를 테이블에 담고있어 원하는 정보를 테이블에서 조회하려면 한 개 이상의 테이블에서 데이터를 읽어와야 되는 경우가 많다.

이 때, 테이블간 관계를 맺기 위한 연결고리 역할이 필요한데 두 테이블에서 같은 데이터를 저장하는 컬럼이 연결고리가됨


 

1. 내부조인 (INNER JOIN) (== 등가 조인 (EQUAL JOIN))

연결되는 컬럼의 값이 일치하는 행들만 조인됨 ( == 일치하는 값이 없는 행은 조인에서 제외됨)

작성 방법은 크게 ANSI구문과 오라클 구문으로 나뉘고 ANSI에서 USING과 ON을 쓰는 방법으로 나뉜다.

 

*ANSI 표준 구문
ANSI는 미국 국립 표준 협회를 뜻함, 미국의 산업표준을 제정하는 민간단체로
국제표준화 기구 ISO에 가입되어있다.
ANSI에서 제정된 표준을 ANSI라고 하고
여기서 제정한 표준 중 가장 유명한 것이 ASCII 코드이다.

---------------------------------------------------------------------------------------------
*오라클 전용 구문
FROM절에 쉼표(,)로 구분하여 합치게 될 테이블 명을 기술하고
WHERE절에 합치기에 사용할 컬럼명을 명시한다.
내부 조인의 문제점

 

연결에 사용되는 컬럼의 값이 NULL이면 조회 결과에 포함되지 않는다

 


 

2. 외부 조인(OUTER JOIN)

두 테이블의 지정하는 컬럼 값이 일치하지 않는 행도 조인에 포함을 시킴

* 반드시 OUTER JOIN임을

 

1) LEFT [OUTER] JOIN : 합치기에 사용한 두 테이블 중 왼편에 기술된 테이블의
컬럼 수를 기준으로 JOIN

-- ANSI 표준
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
LEFT JOIN DEPARTMENT
ON(DEPT_CODE = DEPT_ID);
--> JOIN 구문 기준으로 왼쪽에 작성된 테이블의 모든 행이 결과(RESULT SET)에 포함


-- 오라클 
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE,DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);
-- 왼쪽 테이블 컬럼과 오른쪽 테이블 컬럼에 같은 값이 없으면
-- 오른쪽을 억지로 추가(NULL)

2) RIGHT [OUTER] JOIN : 합치기에 사용한 두 테이블중
오른 편에 기술된 테이블의 컬럼 수를 기준으로 JOIN

-- ANSI
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
RIGHT JOIN DEPARTMENT
ON(DEPT_CODE = DEPT_ID);
-- 오라클
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE,DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID;

-- 3) FULL [OUTER] JOIN : 합치기에 사용한 두 테이블이 가진 모든 행을 결과에 포함
-- ** 오라클 구문은 FULL OUTER JOIN을 사용 못함

-- ANSI
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE FULL OUTER JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
-- EMPLOYEE 테이블의 하동운, 이오리
-- DEPARTMENT 테이블의 국내영업부, 마케팅부, 해외영업 3부 모두 결과에 포함

-- 오라클은 FULL OUTER JOIN 불가

 


3. 교차 조인(CROSS JOIN == CARTESIAN PRODUCT)

조인되는 테이블의 각 행들이 모두 매핑된 데이터가 검색되는 방법 (곱집합)

JOIN 구문을 잘못 작성하면 결과로 나타남


4. 비등가 조인(NON EQUAL JOIN)

'='(등호)를 사용하지 않는 조인문

지정한 컬럼 값이 일치하는 경우가 아닌, 값의 범위에 포홤되는 행들을 연결하는 방식


5. 자체 조인(SELF JOIN)

같은 테이블을 조인

자기 자신과 조인을 맺음

--> 똑같은 테이블 두개가 조인

--사번, 이름, 사수 번호, 사수 이름 조회

-- ANSI 표준
SELECT E.EMP_ID, E.EMP_NAME, NVL(E.MANAGER_ID,'없음'), NVL(M.EMP_NAME,'없음')
FROM EMPLOYEE E
LEFT JOIN EMPLOYEE M ON(E.MANAGER_ID = M.EMP_ID);
-- 오라클 구문
SELECT E.EMP_ID, E.EMP_NAME, NVL(E.MANAGER_ID,'없음'), NVL(M.EMP_NAME,'없음')
FROM EMPLOYEE E,EMPLOYEE M
WHERE E.MANAGER_ID = M.EMP_ID(+);

6. 자연 조인 (NATURAL JOIN)

동일한 타입과 이름을 가진 컬럼이 있는 테이블 간의 조인을 간단히 표현하는 방법

반드시 두 테이블 간의 동일한 컬럼명, 타입을 가진 컬럼이 필요하다

--> 없을 경우 교차조인 됨

SELECT EMP_NAME, JOB_NAME
FROM EMPLOYEE
-- JOIN JOB USING(JOB_CODE); // 원래의 정상적인 조인코드
NATURAL JOIN JOB;

7. 다중 조인

N개의 테이블을 조회할 때 사용(순서 중요!)

** JOIN 순서대로 하나씩 진행된다!! **

--ANSI 표준
SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE);

-- 오라클 
SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE,DEPARTMENT,LOCATION
WHERE DEPT_CODE = DEPT_ID
AND LOCATION_ID = LOCAL_CODE;

-- 조인 순서를 지키지 않은 경우 (에러 발생)
SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
JOIN LOCATION ON(LOCATION_ID = LOCAL_CODE)
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

 

728x90
반응형

'코딩공부 > DB' 카테고리의 다른 글

Oracle - Select문 (05)  (0) 2025.02.08
Oracle - DML (01)  (0) 2025.02.08
Oracle - Select문 (03)  (0) 2025.01.20
Oracle - Select문 (02)  (0) 2025.01.20
Oracle - Select문 (01)  (0) 2025.01.20