: 여러 개의 쿼리문을 가지고 하나의 쿼리문으로 만드는 연산자
※ 쿼리문?
: DB에 정보를 요청해서 요청 값을 돌려받는 질의문
(자바의 메소드와 같은 느낌, SELECT문, CREATE문... )
: 초보자가 쉽게 사용할 수 있지만 다른 방식으로도 쿼리문 연결가능 (즉, 다른방식으로도 연결가능)
(예를 들면 조건 추가할 때 OR, AND 등 이용 ..)
: 합집합 ( 두 쿼리문 수행한 결과값을 더하지만 단, 중복되는 결과는 한번만 조회)
[표현법] 쿼리문 UNION 쿼리문; (단, 각 쿼리문의 컬럼 갯수가 맞아야 함)
: 여러개의 쿼리 결과를 무조건 더하는 연산자 (중복 값이 여러개 들어갈 수 있음)
[표현법] 쿼리문 UNION ALL 쿼리문; (단, 각 쿼리문의 컬럼 갯수가 맞아야 함)
: 교집합 - 여러 쿼리 결과의 중복된 결과만을 조회
[표현법] 쿼리문 INTERSECT 쿼리문;
: 차집합 (선행쿼리 - 후행쿼리)
[표현법] 쿼리문 MINUS 쿼리문;
오라클 전용구문 | ANSI(미국국립표준협회) 구문
엑셀로 구분해서 올리자.
=> 사용하는 이유?
: 테이블이 다를 경우, 일일이 하나씩 매칭해서 조회해야하는 수고로움 있음
: 서로 연결되어 있는 공통적인 요소가 없을경우에는 조회에 나오지 않음
<예시>
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;
-- 한계 : 서로 연결되어 있는 공통적인 요소가 없을경우에는 조회에 나오지 않음
-- (DEPT_CODE가 NULL이였던 2명 사원데이터 조회안됨)
-- (DEPT_ID에 D3, D4, D7 사원이 없어 조회안됨)
[표현법]
FROM 테이블1, 테이블2
WHERE 테이블1.컬럼 = 테이블2.컬럼;
[표현법]
FROM 테이블1, 테이블2
WHERE 테이블1.컬럼 = 테이블2.컬럼;
<예시>
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;
<예시>
SELECT EMP_ID, EMP_NAME, EMPLOYEE.JOB_CODE, JOB_NAME
FROM EMPLOYEE, JOB
WHERE EMPLOYEE.JOB_CODE = JOB.JOB_CODE ;
SELECT EMP_ID, EMP_NAME, E.JOB_CODE, JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE ;
[표현법]
FROM 테이블1
JOIN 테이블2 ON (테이블1.컬럼 = 테이블2.컬럼);
=> 무조건 ON 구문만 사용가능(USING 불가)
[표현법]
FROM 테이블1
JOIN 테이블2 ON (컬럼 = 컬럼);
<예시>
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
=> USING / ON 다 같이 씀
<예시>
SELECT EMP_ID, EMP_NAME, E.JOB_CODE, JOB_NAME
FROM EMPLOYEE E
JOIN JOB J ON (E.JOB_CODE = J.JOB_CODE);
<예시>
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING (JOB_CODE);
-- 참고 위의 USING 구문의 예시는 NATURAL JOIN(자연조인)으로도 가능
※ 사용될 조건 : 두 개의 테이블만 제시한 상태인데, 운좋게도 두개의 테이블에 일치하는 컬럼이 유일하게 한개 존재(JOB_CODE) 할때 사용 가능.
=> 알아서 매칭이 됨
[표현법]
FROM 테이블1
NATURAL JOIN 테이블2;
<예시>
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
NATURAL JOIN JOB;
<예시>
-- 오라클
SELECT EMP_ID, EMP_NAME, DEPT_CODE, JOB_NAME
FROM DEPARTMENT , EMPLOYEE E, JOB J
WHERE DEPT_ID = DEPT_CODE
AND J.JOB_CODE = E.JOB_CODE;
-- ANSI
SELECT EMP_ID, EMP_NAME, DEPT_CODE, JOB_NAME
FROM EMPLOYEE E
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN JOB J ON (E.JOB_CODE = J.JOB_CODE);
: 테이블 간의 JOIN시 일치하지 않은 행도 포함시켜서 조회 가능
단, 반드시 LEFT/RIGHT를 지정해야 됨! (기준이 되는 테이블 지정해야 됨)
=> 등가조인(이너조인)의 한계점 극복하게 해줌
(공통되는 컬럼이 없는 경우에는 출력이 되지않음(EX) NULL, 두
: 두 테이블 중 왼편에 기술된 테이블 기준으로 JOIN
즉, 뭐가 됐든 간에 왼편에 기술된 테이블의 데이터는 무조건 조회함(일치하는게 없다해도)
[표현법]
FROM 테이블1, 테이블2
WHERE 컬럼 = 컬럼(+);
-> 내가 기준으로 삼을 테이블의 컬럼명이 아닌 반대 테이블의 컬럼명에 (+)
=> 기준 : 테이블1
<예시>
SELECT EMP_NAME, SALARY, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);
-> 기준 : DEPARTMENT
[표현법]
FROM 테이블1(기준)
LEFT (OUTER) JOIN 테이블2 ON (컬럼 = 컬럼);
--> 테이블1 기준으로 조회해서 테이블1에 존재하는 데이터는 모두 출력!
<예시>
SELECT EMP_NAME, SALARY, DEPT_TITLE
FROM EMPLOYEE
LEFT /*OUTER*/ JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
: 두 테이블 중 오른편에 기술된 테이블 기준으로 JOIN
즉, 뭐가 됐든 간에 오른편에 기술된 테이블의 데이터는 무조건 조회함(일치하는게 없다해도)
[표현법]
FROM 테이블1, 테이블2
WHERE 컬럼(+) = 컬럼;
-> 내가 기준으로 삼을 테이블의 컬럼명이 아닌 반대 테이블의 컬럼명에 (+)
=> 기준 : 테이블2
<예시>
SELECT EMP_NAME, SALARY, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID;
-> 기준 : DEPARTMENT
[표현법]
FROM 테이블1
RIGHT (OUTER) JOIN 테이블2(기준) ON (컬럼 = 컬럼);
--> 테이블2 기준으로 조회해서 테이블2에 존재하는 데이터는 모두 출력!
<예시>
SELECT EMP_NAME, SALARY, DEPT_TITLE
FROM EMPLOYEE
LEFT /*OUTER*/ JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
: 두 테이블이 가진 모든 행을 조회할 수 있도록(단, 오라클 전용구문에서는 불가)
[표현법]
FROM 테이블1
FULL (OUTER) JOIN 테이블2 ON (컬럼 = 컬럼);
=> 기준이고 뭐고 없이, 테이블 1, 테이블 2 내용 다 조회
=> 잘 안쓰임
: 모든 테이블의 각 행들이 서로서로 매핑된 데이터가 조회됨(곱집합)
두 테이블의 행들이 모두 곱해진 행들의 조합 출력
-- >> 오라클 전용구문
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEAPRTMENT; --> 23 * 9 => 207개 행 조회
-- >> ANSI구문
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT;
: '='(등호)를 사용하지 않는 JOIN문
지정한 컬럼값이 일치하는 경우가 아닌, "범위"에 포함되는 경우 매칭
[표현법]
FROM 테이블1, 테이블2
WHERE 조건식;
<예시>
-- 오라클 전용
SELECT EMP_NAME, SALARY, SAL_LEVEL
FROM EMPLOYEE, SAL_GRADE
WHERE SALARY BETWEEN MIN_SAL AND MAX_SAL;
[표현법]
FROM 테이블1
JOIN 테이블2 ON (조건식);
-- ANSI 전용 (ON구문만 가능)
SELECT EMP_NAME, SALARY, SAL_LEVEL
FROM EMPLOYEE
JOIN SAL_GRADE ON (SALARY BETWEEN MIN_SAL AND MAX_SAL);