[학습목표]
- UNION : 합집합 (두 쿼리문을 수행한 결과값을 더한 후, 중복되는 값은 한번만 더해짐 == OR과 비슷함)
- INTERSECT : 교집합 (두 쿼리문을 수행한 결과값에 중복된 결과값 == AND와 비슷함)
- UNION ALL : 합집합 + 교집합 (두 쿼리문의 결과갑을 무조건 더한 결과값 == 중복된 값이 두번 표현될 수 있음)
- MINUS : 차집합 (선행쿼리의 값에서 후행쿼리의 결과값을 뺀 나머지)
UNION (WHERE절에 OR로 조건식 기술하는것과 출력값 같음)
INTERSECT (WHERE절에 AND로 조건식 기술하는것과 출력값 같음)
UNION ALL (중복되는 값도 출력)
MINUS
🔴 유의사항 1. SELECT문의 컬럼 수는 선행쿼리와 후행쿼리 갯수 동일
🔴 유의사항 2. 컬럼의 갯수 뿐만 아니라, 각 컬럼 자리마다 동일핱 타입 기술
# 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절에 같이 조회하고자하는 테이블 추가기술 후, 조건 기술
📚 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로 기준이 되는 테이블을 지정해야함 !
📚 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;
SELECT EMP_NAME, SALARY, SAL_LEVEL
FROM EMPLOYEE,
JOIN SAL_GRADE ON (SALARY BETWEEN MIN_SAL AND MAX_SAL);
📢 자체조인 (SELF JOIN)
: 같은 테이블을 여러번 조인하는 경우 사용됨
📢 다중조인
: 여러개의 테이블을 사용하여 조회하고자 할 때
- 테이블의 컬럼마다 연결시키고자 하는 컬럼을 생각해서 조건식에 써야함
-- 사번, 사원명, 부서명, 직급명 조회
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;
-- 사번, 사원명, 부서명, 직급명 조회
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문 보기 쉽게 작성하기