SQL 중급 - 복습 1

강용구·2021년 5월 2일
SELECT ROWNUM
     , empno
     , ename
     , job
     , sal
  FROM emp
  WHERE ROWNUM <= 5


ROWNUM : 각 행의 번호를 출력. ROWNUMWHERE절을 사용하면 대용량 테이블의 데이터 상단 행만 살펴볼 수 있다.

SELECT empno
     , ename
     , job
     , sal
  FROM emp
  ORDER BY sal DESC FETCH FIRST 4 ROWS ONLY


TOP-N QUERY : 정렬된 결과로부터 위쪽 또는 아래쪽의 N개의 행을 반환하는 쿼리.
FETCH N ROWS ONLY : 위에서 N번째 행까지 반환.
N부분에는 20 PERCENT 와 같은 비율도 기입할 수 있다.

SELECT empno
     , ename
     , job
     , sal
  FROM emp
  ORDER BY sal DESC OFFSET 9 ROWS
                    FETCH FIRST 2 ROWS ONLY


OFFSET : 월급이 10번째(9+1)로 높은 사원을 출력!

SELECT ename
     , loc
     FROM emp, dept
     WHERE emp.deptno = dept.deptno


JOIN : 서로 다른 테이블에 있는 컬럼들을 하나의 결과로 출력하려면 필요하다.

  • emp 테이블에도 deptno가 존재하고, dept 테이블에도 deptno가 중요하다
    emp 테이블의 부서번호는 dept 테이블의 부서 번호와 같다는 조건을 주는 것이다.
SELECT ename
     , loc
     , job
     FROM emp, dept
     WHERE emp.deptno = dept.deptno
           AND emp.job = 'ANALYST'


WHERE절에 AND를 이용해 조건을 추가할 수 있다.

SELECT e.ename
     , d.loc
     , e.job
     FROM emp e, dept d
     WHERE e.deptno = d.deptno
           AND e.job = 'ANALYST'


다음과 같이 테이블에 별칭을 지정할 수 있다.
테이블마다 존재하는 컬럼이 다르므로, 가져오는 컬럼을 어느 테이블에서 가져오는지 지정해주면 좋다.

SELECT e.ename
     , e.sal
     , g.grade
  FROM emp e, salgrade s
  WHERE e.sal BETWEEN s.losal AND s.hisal


non equi join : 위 예제와 같이 emp와 salgrade 사이에 동일한 컬럼이 없는 경우 사용한다.

SELECT *
  FROM salgrade


다음과 같이 salgrade 테이블은 losal과 hisal이라는 월급 구간이 있다. 따라서 BETWEEN절과 두 컬럼을 사용해서 조건을 줄 수 있다.

SELECT e.ename
     , d.loc
  FROM emp e, dept d
  WHERE e.deptno (+) = d.deptno


emp 테이블에는 deptno가 40인 데이터가 없고, dept 테이블에는 있다.
따라서 EQUI JOIN을 사용하면, deptno가 40인 데이터는 출력되지 않는다.
하지만 위의 예시처럼 (+)를 추가하면 emp테이블에 없는 deptno가 40인 데이터도 출력된다 (BOSTON)
이것을 OUTER JOIN 이라고 한다.

SELECT e.ename 사원
     , e.job 직업
     , m.ename 관리자
     , m.job 직업
  FROM emp e, emp m
  WHERE e.mgr = m.empno and e.job = 'SALESMAN'


SELF JOIN : 자기 자신 테이블과 조인하는 방법.

SELECT e.ename 이름
     , e.job 직업
     , e.sal 월급
     , d.loc "부서 위치"
  FROM emp e JOIN dept d
  ON (e.deptno = d.deptno)
  WHERE e.job = 'SALESMAN'


ON절을 사용한 JOIN : EQUI JOIN에서는 WHERE절에 작성했던 조인 조건을 ON절에 작성한다.

SELECT e.ename 이름
     , e.job 직업
     , e.sal 월급
     , d.loc "부서 위치"
  FROM emp e, dept d
  WHERE e.deptno = d.deptno AND e.job = 'SALESMAN'

동일한 결과를 나타내지만, EQUI JOIN으로 작성했을 때의 쿼리이다.

SELECT e.ename 이름
     , e.job 직업
     , e.sal 월급
     , d.loc "부서 위치"
  FROM emp e JOIN dept d
  USING (deptno)
  WHERE e.job = 'SALESMAN'


USING을 이용한 JOIN : 조인 조건 대신, 두 테이블을 연결할 때 사용할 컬럼만 괄호 안에 기입하면 된다.

SELECT e.ename 이름
     , e.job 직업
     , e.sal 월급
     , d.loc "부서 위치"
  FROM emp e NATURAL JOIN dept d
  WHERE e.job = 'SALESMAN'


NATURAL JOIN : 조인 조건을 명시적으로 작성하지 않아도 FROM절에 emp와 dept 사이에 NATURAL JOIN 하겠다고 기술하는 것.
연결고리가 되는 컬럼인 deptno를 WHERE 절에 조건으로 추가하고 싶으면, 테이블 별칭 없이 작성해야 한다.

SELECT e.ename 이름
     , e.job 직업
     , e.sal 월급
     , d.loc "부서 위치"
  FROM emp e NATURAL JOIN dept d
  WHERE e.job = 'SALESMAN' AND deptno = 30

SELECT e.ename 이름
     , e.job 직업
     , e.sal 월급
     , d.loc "부서 위치"
  FROM emp e RIGHT OUTER JOIN dept d
  ON(e.deptno = d.deptno)


LEFT/RIGHT OUTER JOIN : 위의 예시에서 emp와 dept를 조인할 때, 오른쪽의 dept 테이블의 데이터는 전부 출력된다.

SELECT e.ename 이름
     , e.job 직업
     , e.sal 월급
     , d.loc "부서 위치"
  FROM emp e FULL OUTER JOIN dept d
  ON(e.deptno = d.deptno)

FULL OUTER JOIN : 서로에게 없는 데이터 모두를 출력해주는 조인. 즉 RIGHT/LEFT OUTER JOIN을 한번에 수행하는 쿼리이다.

SELECT deptno
     , SUM(sal)
  FROM emp
  GROUP BY deptno
UNION ALL
SELECT TO_NUMBER(null) as deptno
     , SUM(sal)
  FROM emp


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)


INTERSECT : 위/아래 쿼리의 결과물 사이의 교집합을 구해준다.

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)


MINUS : 위쪽 쿼리에서 아래쪽 쿼리를 빼주는 것이다. 즉, 위쪽 쿼리에서 아래쪽 쿼리와의 교집합 부분을 제외한 부분을 출력한다.

profile
Lifetime Value Creator

0개의 댓글