[26일 차] : Oracle - SELECT문(4), JOIN

서하루·2022년 11월 17일
0

(2) Oracle 공부기록

목록 보기
5/11

[학습목표]

  • 집합연산자 (UNION, INTERECT, UNION ALL, MINUS)
  • JOIN ( 등가조인 / 포괄조인 / 비등가조인 / 자제조인 / 다중조인 )
  • [SQL문 회사에서 작성하는 식?]

✅집합연산자 = SET OPERATION

여러개의 쿼리문을 하나의 쿼리문으로 만드는 연산자

  • UNION : 합집합 (두 쿼리문을 수행한 결과값을 더한 후, 중복되는 값은 한번만 더해짐 == OR과 비슷함)
  • INTERSECT : 교집합 (두 쿼리문을 수행한 결과값에 중복된 결과값 == AND와 비슷함)
  • UNION ALL : 합집합 + 교집합 (두 쿼리문의 결과갑을 무조건 더한 결과값 == 중복된 값이 두번 표현될 수 있음)
  • MINUS : 차집합 (선행쿼리의 값에서 후행쿼리의 결과값을 뺀 나머지)

UNION (WHERE절에 OR로 조건식 기술하는것과 출력값 같음)

INTERSECT (WHERE절에 AND로 조건식 기술하는것과 출력값 같음)

UNION ALL (중복되는 값도 출력)

MINUS

🔴 유의사항 1. SELECT문의 컬럼 수는 선행쿼리와 후행쿼리 갯수 동일
🔴 유의사항 2. 컬럼의 갯수 뿐만 아니라, 각 컬럼 자리마다 동일핱 타입 기술


✅JOIN

두 개 이상의 테이블에서 데이터를 조회할 때 사용

조회 결과는 하나의 결과물(RESULT SET)으로 나옴

# JOIN은 크게 오라클전용구문과 ANSI구문으로 존재한다.

--------------------------------------------------------------------------------  
            < 오라클전용구문 >           |             < ANSI구문 >              
-------------------------------------------------------------------------------- 
                등가조인                |           내부조인(INTER JOIN) => JOIN USING/ON
             (EQUAL JOIN)             |           자연조인(NATURAL JOIN) => JOIN USING
-------------------------------------------------------------------------------- 
                포괄조인                |           왼쪽 외부조인 (LIFT OUTER JOIN)                                           
              (LEFT OUTER)            |           오른쪽 외부조인 (RIGHT OUTER JOIN)
              (RIGHT OUTER)           |           전체 외부조인 (FULL OUTER JOIN)
 -------------------------------------------------------------------------------  
              자체조인(SELF JOIN)       |               JOIN ON
            비등가조인(NOM EQUAL JOIN)  |
 -------------------------------------------------------------------------------  
         카테시안 곱(CARTESIAN PRODUCT) |             교차조인 ( CROSS JOIN)

📢 등가조인(EQUAL JOIN) / 내부조인(INNER JOIN)

: 연결시키는 컬럼값이 "일치하는행들만" 조인되서 조회됨 ! (즉, 일치하는 값은 조회에서 제외됨)

🎉 1. 오라클전용구문 작성법

FROM절에 조회하고자 하는 테이블들 나열
WHERE절에 매칭시킬 컬럼에 대한 조건 제시


오라클전용구문으로 작성

📚 1) 연결할 두 컬럼명이 다른경우

-- 사번, 사원명, 부서코드, 부서명 조회

SELECT EMP_NO, EMP_NAME, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;
=> 일치하는 값이 없는 행은 조회에서 아예 제외 ! 
=> 즉, NULL인 사원은 조회되지 않음 

📚 2) 연결할 두 컬럼명이 다른경우

-- 테이블에 별칭을 부여해서 이용하는 방법
SELECT EMP_ID, EMP_NAME, E.JOB_CODE, JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;

🎉 1. ANSI전용구문 작성법

FROM절에 기준이 되는 테이블 한개 나열
JOIN절같이 조회하고자하는 테이블 추가기술 후, 조건 기술


ANSI 구문으로 작성

📚 1). 연결할 두 컬럼명이 다른 경우

SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

📚 2) 연결할 두 컬럼명이 다른경우

-- 테이블명 또는 별칭을 부여하는 방법
SELECT EMP_ID, EMP_NAME, J.JOB_CODE, JOB_NAME
FROM EMPLOYEE E
JOIN JOB J ON (E.JOB_CODE =  J.JOB_CODE);

추가적인 조건도 제시 가능함 ! (WHERE절 이용)


📢 포괄조인 / 외부조인 (OUTER JOIN)

: 두 테이블간의 JOIN시 일치하지 않는 행도 포함시켜 조회할 때 사용 / 단, 반드시 LEFT / RIGHT로 기준이 되는 테이블을 지정해야함 !

ANSI 구문으로 작성

📚 1). LEFT JOIN : 두 테이블 중 왼편에 기술된 테이블 기준으로 모든값조회(NULL도 포함)


SELECT EMP_NAME, DEPT_TITLE, SALARY, SALARY*12
FROM EMPLOYEE
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
=> 즉, 부서배치를 받지 않던 2명 사원도 조회됨
=> 왼쪽테이블인 EMPLOYEE를 기준으로 모든 값이 조회되도록 구문 작성함

📚 2). RIGHT JOIN : 두 테이블 중 오른쪽에 기술된 테이블 기준으로 모든값조회(NULL도 포함)


SELECT EMP_NAME, DEPT_TITLE, SALARY, SALARY*12
FROM EMPLOYEE
RIGHT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
=> 즉, 부서배치를 받지 않던 2명 사원도 조회됨
=> 오른쪽 테이블인 DEPARTMENT를 기준으로 모든 값이 조회되도록 구문 작성함

📚 3). FILL JOIN : 두 테이블이 가진 모든 행 조회 **ANSI만 가능함**


SELECT EMP_NAME, DEPT_TITLE, SALARY, SALARY*12
FROM EMPLOYEE
FULL JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
=> 모든 테이블이 가진 값 (NULL포함) 조회됨 !


오라클전용구문으로 작성

📚 1). LEFT JOIN : 두 테이블 중 왼편에 기술된 테이블 기준으로 모든값조회(NULL도 포함)


SELECT EMP_NAME, DEPT_TITLE, SALARY, SALARY*12
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID (+)
=> 기준으로 삼고자 하는 테이블의 반대편 컬럼 뒤에 (+) 작성
=> 즉, EMPLOYEE를 기준으로 한다면 DEPARTMENT의 컬럼인 DEPT_ID 뒤에 기술

📚 2). RIGHT JOIN : 두 테이블 중 오른쪽에 기술된 테이블 기준으로 모든값조회(NULL도 포함)


SELECT EMP_NAME, DEPT_TITLE, SALARY, SALARY*12
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE (+) = DEPT_ID;
=> 기준으로 삼고자 하는 테이블의 반대편 컬럼 뒤에 (+) 작성
=> 즉, DEPARTMENT를 기준으로 한다면 EMPLOYEE의 컬럼인 DEPT_CODE 뒤에 기술


📢 비등가조인 (NON EQUAL JOIN)

: 매칭시킬 컬럼에 대한 조건 작성시 ' = ' 를 사용하지 않음
ANSI구문 >> JOIN ON 가능함!


오라클전용구문으로 작성

SELECT EMP_NAME, SALARY, SAL_LEVEL
FROM EMPLOYEE, SAL_GRADE
WHERE SALARY BETWEEN MIN_SAL AND MAX_SAL;


ANSI 구문으로 작성

SELECT EMP_NAME, SALARY, SAL_LEVEL
FROM EMPLOYEE,
JOIN SAL_GRADE ON (SALARY BETWEEN MIN_SAL AND MAX_SAL);


📢 자체조인 (SELF JOIN)

: 같은 테이블을 여러번 조인하는 경우 사용됨


오라클전용구문으로 작성

ANSI 구문으로 작성


📢 다중조인

: 여러개의 테이블을 사용하여 조회하고자 할 때

  • 테이블의 컬럼마다 연결시키고자 하는 컬럼을 생각해서 조건식에 써야함

오라클전용구문으로 작성

-- 사번, 사원명, 부서명, 직급명 조회
SELECT * FROM EMPLOYEE;     -- *DEPT_CODE , **JOB_CODE
SELECT * FROM DEPARTMENT;   -- *DEPT_ID
SELECT * FROM JOB;          --              **JOB_CODE

=> 부서명을 알기 위해서는 EMPLOYEE 테이블의 DEPT_CODE(부서코드)와 DEPARTMENT테이블의 DEPT_ID로 묶어줘야함 

=> 직급명을 알기 위해서는 EMPLOYEE테이블의 JOB_CODE(직급코드)어ㅣ JOB테이블의 JOB_CODE(직급코드)를 묶어줘야함 
=> 컬럼명이 동일하여 오류가 뜰 수 있으니 테이블의 별칭을 부여해서 E.JOB_CODE = J.JOB_CODE 이런식으로 기술하자 


SELECT EMP_ID, EMP_NAME, DEPT_TITLE, JOB_NAME
FROM EMPLOYEE E,DEPARTMENT,JOB J
WHERE DEPT_CODE = DEPT_ID AND E.JOB_CODE = J.JOB_CODE;


ANSI 구문으로 작성

-- 사번, 사원명, 부서명, 직급명 조회
SELECT * FROM EMPLOYEE;     -- *DEPT_CODE , **JOB_CODE
SELECT * FROM DEPARTMENT;   -- *DEPT_ID
SELECT * FROM JOB;          --              **JOB_CODE

=> 부서명을 알기 위해서는 EMPLOYEE 테이블의 DEPT_CODE(부서코드)와 DEPARTMENT테이블의 DEPT_ID로 묶어줘야함 

=> 직급명을 알기 위해서는 EMPLOYEE테이블의 JOB_CODE(직급코드)어ㅣ JOB테이블의 JOB_CODE(직급코드)를 묶어줘야함 

SELECT EMP_ID, EMP_NAME, DEPT_TITLE, JOB_NAME
FROM EMPLOYEE E
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN JOB USING(JOB_CODE);    -- 2개 이상 테이블에 같은 컬럼 있을 경우 USING 말고 ON으로 써서 정확하게 테이블명 표시해주기
-- JOIN JOB J ON (E.JOB_CODE = J.JOB_CODE)


✨ SQL문 보기 쉽게 작성하기

0개의 댓글