SQL 중급 - 복습 5

CREATE TABLE DEPT3
(DEPTNO NUMBER(10),
 DNAME VARCHAR2(14) CONSTRAINT DEPT3_DNAME_UN UNIQUE,
 LOC   VARCHAR2(10))

UNIQUE : 중복된 데이터가 있어서는 안 되는 컬럼에 사용. PRIMARY KEY와는 다르게 NULL값을 입력할 수 있다.

CREATE TABLE DEPT5
(DEPTNO NUMBER(10)
,DNAME  VARCHAR2(14)
,LOC    VARCHAR2(10) CONSTRAINT DEPT5_LOC_NN NOT NULL)

NOT NULL : 테이블의 특정 컬럼에 NULL 값 입력을 허용하지 않음.

CREATE TABLE EMP6
( EMPNO NUMBER(10)
, ENAME VARCHAR2(20)
, SAL   NUMBER(10) CONSTRAINT EMP6_SAL_CK
  CHECK (SAL BETWEEN 0 AND 6000))

CHECK : 특정 컬럼에 특정 조건의 데이터만 입력되거나 수정되도록 제한을 거는 제약

WITH JOB_SUMSAL AS (SELECT JOB
                         , SUM(SAL) as 토탈
                      FROM emp
                      GROUP BY job)
SELECT job
     , 토탈
     FROM job_sumsal
     WHERE 토탈 > (SELECT AVG(토탈)
                    FROM job_sumsal)

WITH : 검색 시간이 오래 걸리는 SQL이 하나의 SQL 내에서 반복되어 사용될 때 성능을 높이기 위한 방법으로 사용한다.

WITH job_sumsal AS (SELECT job
                         , SUM(sal) 토탈
                      FROM emp
                      GROUP BY job)
   , deptno_sumsal as (SELECT deptno
                            , SUM(sal) 토탈
                         FROM emp
                         GROUP BY deptno
                         HAVING SUM(sal) > (SELECT AVG(토탈) + 3000
                                              FROM job_sumsal)
                                              )
SELECT deptno
     , 토탈
  FROM deptno_sumsal

SUBQUERY FACTORING : WITH 절의 쿼리의 결과를 임시 테이블로 생성하는 것을 지칭한다.

WITH LOOP_TABLE as (SELECT level as NUM
                      FROM dual
                      CONNECT BY level <= 9)
SELECT '2' || 'X' || NUM || '=' || 2 * NUM as "2단"
  FROM LOOP_TABLE


CONNECT BY LEVEL : 임의의 갯수만큼 행을 리턴하고 싶을 때 사용한다.

WITH LOOP_TABLE as (SELECT level as NUM
                      FROM dual
                      CONNECT BY level <= 9),
     GUGU_TABLE as (SELECT level + 1 as GUGU
                      FROM dual
                      CONNECT BY level <= 8)                
SELECT TO_CHAR(A.NUM) || 'X' || TO_CHAR(B.GUGU) || '=' || TO_CHAR(B.GUGU * A.NUM) as 구구단
  FROM LOOP_TABLE A, GUGU_TABLE B

WITH절과 계층형 질의문을 이용하면 이중 루프(LOOP)문을 SQL로 구현할 수 있다.

WITH LOOP_TABLE as (SELECT LEVEL as NUM
                      FROM dual
                      CONNECT BY LEVEL <= 8)
SELECT LPAD('★', num, '★') as STAR
  FROM LOOP_TABLE


LPAD를 이용하여 NUM에서 출력되는 숫자만큼 별을 채워 넣어 출력한다. LPAD의 두번째 인자의 숫자만큼 자릿수를 잡고 첫번째 인자 값이 별을 먼저 출력하고 나머지 자리에 별을 채워 넣는다.

좋은 웹페이지 즐겨찾기