테이블에 중복되는 값이 있음에도 나눠 놓는 이유
- 바이트 단위로 생각했을 때 더 적게 쓰임
- 중복값을 배제해서 데이터 이상현상 낮추는 효과
DAY_4
--
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
UNION
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
-- UNION ALL : 여러 개의 쿼리 결과를 하나로 합치는 연산자
-- UNION과의 차이점은 중복 영역을 모두 포함시킨다.
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
UNION ALL
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
-- 조회하는 컬럼 수가 똑같기 때문에 에러가 발생하지 않음
-- 만약 다를 경우 빈 문자열의 경우 ''을 넣어줘야 컬럼 갯수가 맞아서 조회 가능하다.
-- INTERSECT : 여러 개의 SELECT한 결과에서 공통 부분만 결과로 추출
-- 수학에서의 교집합과 비슷하다.
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
UNION ALL
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
INTERSECT
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
-- MINUS : 선행 SELECT 결과에서 후행 SELECT 결과와 겹치는 부분을 제외한
-- 나머지 선행 SELECT 결과 부분만 추출, 수학에서 차집합과 비슷
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
UNION ALL
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, SALARY
FROM EMPLOYEE
WHERE DEPT_CODE = 'D5'
MINUS
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
-- JOIN : 두 개의 테이블을 하나로 합쳐서 결과를 조회한다.
-- ANSI 표준 구문
-- 연결에 사용할 컬럼명이 같은 경우 USING 사용한다.
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, SALARY
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, SALARY
FROM EMPLOYEE
WHERE SALARY > 3000000;
-- 연결에 사용할 컬럼 명이 같거나 다른 경우 ON()을 사용
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, SALARY
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
-- 컬럼명이 같은 경우에도 ON()을 사용할 수 있다.
SELECT
E.EMP_ID
, E.EMP_NAME
, E.JOB_CODE
, J.JOB_NAME
FROM EMPLOYEE E
JOIN JOB J ON (E.JOB_CODE = J.JOB_CODE);
-- 오라클 전용
-- FROM 절에 ','로 구분하여 합치게 될 테이블 명을 기술하고
-- WHERE절에 합치기에 사용할 컬럼명을 명시한다.
-- 연결에 사용할 두 컬럼명이 다른 경우
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, DEPT_TITLE
FROM EMPLOYEE
, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;
-- 연결에 사용할 두 컬럼명이 같은 경우
SELECT
EMPLOYEE.EMP_ID
, EMPLOYEE.EMP_NAME
, EMPLOYEE.JOB_CODE
, JOB.JOB_NAME
FROM EMPLOYEE.EMPLOYEE
, EMPLOYEE.JOB
WHERE EMPLOYEE.JOB_CODE = JOB.JOB_CODE;
-- 테이블의 별칭을 이용
SELECT
E.EMP_ID
, E.EMP_NAME
, E.JOB_CODE
, J.JOB_NAME
FROM EMPLOYEE E
, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;
-- 부서 테이블과 지역 테이블을 조인하여 테이블에 모든 데이터를 조회하세요
-- ANSI 표준
SELECT
*
FROM DEPARTMENT D
JOIN LOCATION L ON(D.LOCATION_ID = L.LOCAL_CODE);
-- 오라클 전용
SELECT
D.*
, L.*
FROM DEPARTMENT D
, LOCATION L
WHERE D.LOCATION_ID = L.LOCAL_CODE;
-- 조인은 기본이 EQUAL JOIN이다. (EQU JOIN 이라고도 함)
-- 연결되는 컬럼의 값이 일치하는 행들만 조인됨
-- 일치하는 값이 없는 행은 조인에서 제외되는 것을 INNER JOIN이라고 한다. (NULL 제외)
-- JOIN의 기본은 INNER JOIN & EQU JOIN이다.
-- OUTER JOIN : 두 테이블의 지정하는 컬럼 값이 일치하지 않는 행도(NULL)
-- 조인 결과에 포함을 시킴
-- 반드시 OUTER JOIN임을 명시해야 한다.
-- 1. LEFT OUTER JOIN
-- : 합치기에 사용한 두 테이블 중 왼편에 기술된 테이블의 행의 수를 기준으로 JOIN
-- 2. RIGHT OUTER JOIN
-- : 합치기에 사용한 두 테이블 중 오른편에 기술된 테이블의 행의 수를 기준으로 JOIN
-- 3. FULL OUTER JOIN
-- : 합치기에 사용한 두 테이블이 가진 모든 행을 결과에 포함하여 JOIN
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
-- LEFT OUTER JOIN
-- ANSI 표준
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
LEFT OUTER JOIN DEPARTMENT ON( DEPT_CODE = DEPT_ID);
-- 오라클 전용
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);
-- RIGHT OUTER JOIN
-- ANSI 표준
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
RIGHT OUTER JOIN DEPARTMENT
ON (DEPT_CODE = DEPT_ID);
-- 오라클 전용
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID;
-- FULL OUTER JOIN
-- ANSI 표준
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
FULL OUTER JOIN DEPARTMENT
ON (DEPT_CODE = DEPT_ID);
-- 오라클 전용
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);
-- 오라클 전용 구문
-- 오라클 전용 구문으로는 FULL OUTER JOIN을 하지 못한다.
-- CROSS JOIN : 카테이션 곱이라고도 한다.
-- 조인되는 테이블의 각 행들이 모두 매핑된 데이터가 검색되는 방법이다.
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT;
-- NON EQUAL JOIN(NON EQU JOIN) - 비등가조인
-- : 지정한 컬럼 값이 일치하는 경우가 아닌, 값의 범위에 포함되는 행들을 조인한다.
-- ANSI 표준
SELECT
EMP_NAME
, SALARY
, E.SAL_LEVEL
, S.SAL_LEVEL
FROM EMPLOYEE E
JOIN SAL_GRADE S ON(SALARY BETWEEN MIN_SAL AND MAX_SAL); --범위값에 의해
-- ORACLE 전용
SELECT
EMP_NAME
, SALARY
, E.SAL_LEVEL
, S.SAL_LEVEL
FROM EMPLOYEE E
, SAL_GRADE S
WHERE E.SALARY BETWEEN S.MIN_SAL AND S.MAX_SAL;
-- SELF JOIN : 같은 테이블을 조인하는 경우
-- ORACLE 전용
SELECT
E1.EMP_ID
, E1.EMP_NAME 사원이름
, E1.DEPT_CODE
, E1.MANAGE_ID
, E2.EMP_NAME 관리자이름
FROM EMPLOYEE E1, EMPLOYEE E2
WHERE E1.MANAGER_ID = E2.EMP_ID;
--ANSI 표준
SELECT
E1.EMP_ID
, E1.EMP_NAME 사원명
, E1.DEPT_CODE
, E1.MANAGER_ID
, E2.EMP_NAME 관리자이름
FROM EMPLOYEE E1
JOIN EMPLOYEE E2 ON (E1.MAMAGER_ID = E2.EMP_ID);
-- 다중 JOIN : N 개의 테이블을 조회할 때 사용
-- ANSI 표준
-- 다중 조인에는 조인 순서가 중요하다.
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, DEPT_TITLE
, LOCAL_NAME
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = LOCAL_CODE)
JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE);
-- 오라클 전용
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, DEPT_TITLE
, LOCAL_NAME
FROM EMPLOYEE
, DEPARTMENT
, LOCATION
WHERE DEPT_CODE = LOCAL_CODE
AND LOCATION_ID = LOCAL_CODE;
ON 뒤에는 서로 같은 값을 가지고 있는 행끼리 합쳐준다.
반응형
'Programming > DB' 카테고리의 다른 글
[Oracle] 테이블 생성 및 데이터 insert (0) | 2022.03.07 |
---|---|
[Oracle] subquery (0) | 2022.03.07 |
[Oracle] GROUP BY & HAVING (0) | 2022.03.07 |
[Oracle] 함수 (0) | 2022.03.07 |
[Oracle] 기본 조회 방법 및 연산자 (0) | 2022.03.07 |
댓글