SQL 중급 - 복습 5

강용구·2021년 5월 10일
0
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의 두번째 인자의 숫자만큼 자릿수를 잡고 첫번째 인자 값이 별을 먼저 출력하고 나머지 자리에 별을 채워 넣는다.

profile
Lifetime Value Creator

0개의 댓글