TIL(2023.08.08)

JAKE·2023년 8월 8일

TIL

목록 보기
22/48
post-thumbnail

🏃‍♂️What I learned

1. JOIN

  • 하나 이상의 테이블에서 데이터를 조회하기 위해 사용
    ( 수행 결과는 하나의 Result Set으로 나옴 )

(참고) JOIN은 서로 다른 테이블의 행을 하나씩 이어 붙이기 때문에
시간이 오래 걸림

  • 관계형 데이터베이스에서 SQL을 이용해 테이블간 '관계'를 맺는 방법.

  • 관계형 데이터베이스는 최소한의 데이터를 테이블에 담고 있어
    원하는 정보를 테이블에서 조회하려면 한 개 이상의 테이블에서
    데이터를 읽어와야 되는 경우가 많다.
    이 때, 테이블간 관계를 맺기 위한 연결고리 역할이 필요한데,
    두 테이블에서 같은 데이터를 저장하는 컬럼이 연결고리가됨.


1. 내부 조인(INNER JOIN, 안시 기준) ( == 등가 조인(EQUAL JOIN), 오라클 기준)

  • 연결되는 컬럼의 값이 일치하는 행들만 조인됨.

(== 일치하는 값이 없는 행은 조인에서 제외됨. )
--> 포함시키고 시키면 외부조인

  • ANSI 표준 구문
//1) 연결에 사용할 두 컬럼명이 다른 경우 -> ON 
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);

SELECT DEPT_TITLE, LOCAL_NAME 
FROM DEPARTMENT
JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE);

// 2) 연결에 사용할 두 컬럼명이 같은 경우 -> USING
// EMPLOYEE 테이블 + JOB 테이블 참조 하여 사번, 이름, 직급코드, 직급명 조회
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING (JOB_CODE);
  • 오라클 전용 구문
//FROM절에 쉼표(,) 로 구분하여 합치게 될 테이블명을 기술하고
//WHERE절에 합치기에 사용할 컬럼명을 명시한다

//1) 연결에 사용할 두 컬럼명이 다른 경우  
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;

SELECT DEPT_TITLE, LOCAL_NAME 
FROM DEPARTMENT, LOCATION
WHERE LOCATION_ID = LOCAL_CODE;

//2) 연결에 사용할 두 컬럼명이 같은 경우 -> 테이블 별로 별칭 사용
SELECT EMP_ID, EMP_NAME, E.JOB_CODE, JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;

2. 외부 조인(OUTER JOIN)

  • 두 테이블의 지정하는 컬럼값이 일치하지 않는 행도 조인에 포함을 시킴
    --> *반드시 OUTER JOIN임을 명시해야 한다.

  • 안시 기준 : OUTER JOIN (LEFT(왼쪽 테이블), RIGHT(오른쪽 테이블), FULL(전체 테이블)) --> OUTER

생략 가능
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
FULL OUTER JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
FULL JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
  • 오라클 기준 : 반대쪽 테이블 뒤에 (+), 오라클은 FULL OUTER JOIN 없음..
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);

3. 교차 조인(CROSS JOIN == CARTESIAN PRODUCT) : 사실상 오류 확인용

  • 조인되는 테이블의 각 행들이 모두 매핑된 데이터가 검색되는 방법(곱집합)
    --> JOIN 구문을 잘못 작성하는 경우 CROSS JOIN의 결과가 조회됨
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT; -- 23 * 9 

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

  • '='(등호)를 사용하지 않는 조인문
  • 지정한 컬럼 값이 일치하는 경우가 아닌, 값의 범위에 포함되는 행들을 연결하는 방식
SELECT EMP_NAME, SALARY, SAL_GRADE.SAL_LEVEL
FROM EMPLOYEE
JOIN SAL_GRADE ON(SALARY BETWEEN MIN_SAL AND MAX_SAL);

5. 자체 조인(SELF JOIN)

  • 같은 테이블을 조인.
  • 자기 자신과 조인을 맺음

TIP! 같은 테이블 2개 있다고 생각하고 JOIN을 진행

// 1) 안시 기준
SELECT A.EMP_ID, A.EMP_NAME, NVL(A.MANAGER_ID, '없음'), NVL(B.EMP_NAME,'-')
FROM EMPLOYEE A
LEFT JOIN EMPLOYEE B ON(A.MANAGER_ID = B.EMP_ID);

// 2) 오라클 기준
SELECT A.EMP_ID, A.EMP_NAME, NVL(A.MANAGER_ID, '없음'), NVL(B.EMP_NAME,'-')
FROM EMPLOYEE A, EMPLOYEE B
WHERE A.MANAGER_ID = B.EMP_ID(+);

6. 자연 조인(NATURAL JOIN)

  • 동일한 타입과 이름을 가진 컬럼이 있는 테이블 간의 조인을 간단히 표현하는 방법
  • 반드시 두 테이블 간의 동일한 컬럼명, 타입을 가진 컬럼이 필요
    --> 없을 경우 교차조인이 됨
SELECT EMP_NAME, JOB_NAME
FROM EMPLOYEE
NATURAL JOIN JOB;

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
NATURAL JOIN DEPARTMENT; --> 교차 조인

7. 다중 조인

  • N개의 테이블을 조회할 때 사용 (순서 중요!)
  • 위에서 아래로 차례대로 진행 -> 조인된 결과에 새로운 테이블 내용을 조인
// 1) 안시 기준 
SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
JOIN LOCATION ON(LOCATION_ID = LOCAL_CODE);

// 2) 오라클 기준
SELECT EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE, DEPARTMENT, LOCATION
WHERE DEPT_CODE = DEPT_ID AND LOCATION_ID = LOCAL_CODE; -- AND 없으면 교차조인남

0개의 댓글