[실무에서 바로 쓰는 SQL 기본과 SQL 튜닝][ORACLE] 12강

MinHee·2023년 5월 20일
0
post-thumbnail

집합 연산자 - 데이터를 위아래로 연결

JOIN은 데이터를 양옆으로 연결

UNION ALL

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 : 데이터를 정렬하여 출력
UNION ALL : 데이터를 정렬하지 않고, 단순히 붙여서 출력

INTERSECT : 데이터 교집합 출력

두 쿼리문에 대해서 중복되는 결과만 출력하며, 제일 첫번째 칼럼을 기준으로 정렬하여 출력함

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;

MINUS : 데이터 차집합 출력

위 쿼리문에서 아래 쿼리문의 결과를 뺀 결과를 출력함

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);
profile
성장하는 개발자

0개의 댓글