JOIN은 데이터를 양옆으로 연결
SELECT DEPTNO, SUL(SAL)
FROM EMP
GROUP BY DEPTNO;
SELECT SUM(EMP)
FROM EMP;
위 두 쿼리문의 결과를 위아래로 연결
SELECT DEPTNO, SUL(SAL)
FROM EMP
GROUP BY DEPTNO
UNION ALL
SELECT SUM(EMP)
FROM EMP;
위와 같이 실행하면 질의 블록은 부정확한 수의 결과 열을 가지고 있습니다라는 오류 발생
두 개의 쿼리에서 컬럼의 개수가 동일해야함
SELECT DEPTNO, SUL(SAL)
FROM EMP
GROUP BY DEPTNO
UNION ALL
SELECT NULL,SUM(EMP) -- 컬럼을 추가할 게 없으니 NULL로 작성
FROM EMP;
위 아래 두 개의 쿼리문에서, 컬럼의 개수와 데이터 타입이 동일하여야 함.
null/ deptno는 일치하지 않아도 출력이 되지만, to_number(null)로 수행하는 것이 성능이 더 좋음
SELECT DEPTNO, SUL(SAL)
FROM EMP
GROUP BY DEPTNO
UNION ALL
SELECT to_number(NULL),SUM(EMP) -- number 형식으로 바꿈
FROM EMP;
컬럼명도 되도록이면 동일하게 작성 - order by절에서 정렬시 사용
SELECT DEPTNO, SUL(SAL)
FROM EMP
GROUP BY DEPTNO
UNION ALL
SELECT to_number(NULL) as deptno,SUM(EMP) -- 컬럼명 동일 (deptno)
FROM EMP
order by deptno asc; -- order by절은 맨 아래에만 작성 가능
예제) 직업과 직업별 토탈월급을 출력하는데 맨 아래에 전체 토탈 월급도 출력하세요
select job, sum(sal)
from emp
group by job
union all
select to_char(null) as job, sum(sal) -- 컬럼 개수, 타입, 컬럼명 일치
from emp
order by job asc;
?????????????????????????????????????????????????????????????????????????
UNION : 데이터를 정렬하여 출력
UNION ALL : 데이터를 정렬하지 않고, 단순히 붙여서 출력
두 쿼리문에 대해서 중복되는 결과만 출력하며, 제일 첫번째 칼럼을 기준으로 정렬하여 출력함
SELECT ENAME, SAL, JOB, DEPTNO
FROM EMP
WHERE DEPTNO IN (10,20)
INTERSECT
SELECT ENAME, SAL, JOB, DEPTNO
FROM EMP
WHERE DEPTNO IN (20,30);
사원 테이블과 부서 테이블과의 공통된 부서번호가 무엇인지 출력하시오
select deptno
from emp
intersect
select deptno
from dept;
위 쿼리문에서 아래 쿼리문의 결과를 뺀 결과를 출력함
SELECT ENAME, SAL, JOB, DEPTNO
FROM EMP
WHERE DEPTNO IN (10,20)
MINUS
SELECT ENAME, SAL, JOB, DEPTNO
FROM EMP
WHERE DEPTNO IN (20,30);
DEPTNO = 10인 행만 출력
SELECT ENAME, SAL, JOB, DEPTNO
FROM EMP
WHERE DEPTNO IN (20,30)
MINUS
SELECT ENAME, SAL, JOB, DEPTNO
FROM EMP
WHERE DEPTNO IN (10,20);
DEPTNO = 30인 행만 출력
따라서, 위 두개의 쿼리 실행 결과는 다름
부서테이블에는 존재 하는데 사원테이블에는 존재하지 않는 부서번호는?
SELECT DEPTNO
FROM DEPT
MINUS
SELECT DEPTNO
FROM EMP;
서브 쿼리에서 메인쿼리로 하나의 값이 리턴되는 경우
연산자 : =,!=,^=,<>,>,<,>=,<=
SELECT ENAME, SAL -- 메인쿼리
FROM EMP
WHERE SAL > (SELECT SAL -- 서브쿼리
FROM EMP
WHERE ENAME = 'JONE');
ALLEN 보다 더 늦게 입사한 사원들의 이름과 월급을 출력하시오
SELECT ENAME, SAL
FROM EMP
WHERE HIREDATE > (SELECT HIREDATE
FROM EMP
WHERE ENAME = 'ALLEN');
서브 쿼리에서 메인쿼리로 여러개의 값이 리턴되는 경우
연산자 : IN, NOT IN, >ALL, <ALL, >ANY, <ANY ,
SELECT ENAME, SAL
FROM EMP
WHERE SAL IN (SELECT SAL
FROM EMP
WHERE JOB = 'SALESMAN');
서브쿼리에서 다중 행을 반환하므로, IN 연산자 사용
다중 행 서브쿼리 : IN
단일 행 서브쿼리 : =
부서번호가 20번인 사원들과 같은 직업을 갖는 사원들의 이름과 직업을 출력
SELECT ENAME, JOB
FROM EMP
WHERE JOB IN (SELECT JOB
FROM EMP
WHERE DEPTNO = 20);