Skip to main content

SELECT에서 쓰는 다양한 표현


CASE WHEN 표현식을 사용한 조건부 데이터 변환

  • CASE 표현식: SQL 내에서 IF-THEN-ELSE와 유사한 조건부 로직을 구현하여 데이터를 변환하거나 특정 값을 표시할 때 사용.
  • 기본 구조:
    CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE default_result
    END
    • ELSE default_result는 선택 사항이며, 생략 시 조건에 맞지 않으면 NULL 반환.
  • 활용:
    • 데이터 값을 특정 카테고리로 분류 (예: 신용등급에 따른 위험군 분류)
    • 조건에 따라 다른 계산 수행
    • 출력 형식 변경

단순 CASE 표현식

  • 단순 CASE 표현식: CASE 비교대상 WHEN 값1 THEN 결과1 ... END (특정 컬럼 값이 특정 값과 일치하는지 비교할 때 간결하게 사용 가능)
SELECT 
CASE COMPANY_TYPE_CAT -- 기업 분류가
WHEN '대기업' THEN '대' -- 대기업이면 대
WHEN '중소기업' THEN '중소' -- 중소기업이면 중소
ELSE '기타' END -- 이외는 기타
AS 분류
FROM TB_COMPANY_MASTER;

검색 CASE 표현식

  • 조건문을 사용
  • 예시: TB_CREDIT_INFO 테이블에서 CREDIT_GRADE에 따라 '우량', '보통', '주의'로 분류하기
SELECT BIZ_REG_NO, CREDIT_GRADE,
CASE
WHEN CREDIT_GRADE IN ('AAA', 'AA+', 'AA', 'AA-') THEN '매우 우량'
WHEN CREDIT_GRADE IN ('A+', 'A', 'A-') THEN '우량'
WHEN CREDIT_GRADE IN ('BBB+', 'BBB', 'BBB-') THEN '보통'
WHEN CREDIT_GRADE IN ('BB+', 'BB', 'BB-') THEN '주의'
ELSE '관리 필요'
END AS "신용도 평가"
FROM TB_CREDIT_INFO
WHERE CREDIT_INFO_TYPE_CD = 'GRADE' AND CREDIT_INFO_STAT_CD = 'ACTIVE';

DISTINCT 키워드로 중복 행 제거

  • DISTINCT의 역할: SELECT 문으로 조회된 결과에서 완전히 동일한 행들을 하나만 남기고 제거.
  • 사용 위치: SELECT 키워드 바로 뒤에 명시.
  • 문법:
SELECT DISTINCT column1, column2, ...
FROM table_name;
  • DISTINCT는 명시된 모든 열의 조합을 기준으로 중복을 판단.

  • TB_COMPANY_MASTER 테이블에서 COMPANY_TYPE_CAT (기업구분범주값)의 종류만 조회 (중복 제거)

SELECT DISTINCT COMPANY_TYPE_CAT
FROM TB_COMPANY_MASTER;
  • TB_LOAN_ACCOUNT 테이블에서 여신을 받은 회사들의 BIZ_REG_NO (사업자등록번호) 목록 조회 (중복 제거)
SELECT DISTINCT BIZ_REG_NO
FROM TB_LOAN_ACCOUNT;

ORDER BY 절을 사용한 결과 데이터 정렬

  • ORDER BY 절의 역할: SELECT 문으로 조회된 결과를 특정 열(컬럼)의 값을 기준으로 정렬
  • 위치: SELECT 문의 가장 마지막에 위치 (일반적으로 WHERE 절 다음)
  • 정렬 방식:
    • 오름차순 (Ascending): ASC (기본값, 생략 가능). 작은 값에서 큰 값 순서 (숫자), 알파벳 순 (문자), 과거 날짜에서 최신 날짜 순 (날짜).
    • 내림차순 (Descending): DESC. 큰 값에서 작은 값 순서.
  • 기본 문법:
    SELECT column1, column2, ...
    FROM table_name
    WHERE condition -- (선택 사항)
    ORDER BY column_to_sort [ASC | DESC];
  • 예시:
  • TB_COMPANY_MASTER 테이블의 회사들을 COMPANY_NM (업체명) 기준으로 오름차순 정렬
SELECT COMPANY_NM, CEO_NM
FROM TB_COMPANY_MASTER
ORDER BY COMPANY_NM ASC; -- ASC는 생략 가능
  • TB_LOAN_ACCOUNT 테이블의 여신들을 LOAN_AMT (여신금액) 기준으로 내림차순 정렬
SELECT LOAN_ACCT_NO, LOAN_AMT, INTEREST_RATE
FROM TB_LOAN_ACCOUNT
ORDER BY LOAN_AMT DESC;
  • TB_FINANCIAL_STATEMENT 테이블에서 BIZ_REG_NO '123-45-67890'인 회사의 재무 정보를 FS_YM (결산년월) 기준으로 최신순(내림차순) 정렬
SELECT FS_YM, REVENUE, NET_INCOME
FROM TB_FINANCIAL_STATEMENT
WHERE BIZ_REG_NO = '123-45-67890'
ORDER BY FS_YM DESC;

다중 정렬: 두 개 이상의 열 기준 정렬

  • 다중 정렬의 필요성: 첫 번째 정렬 기준의 값이 같을 경우, 두 번째 정렬 기준으로 다시 정렬
  • 사용 방법: ORDER BY 절에 여러 개의 열을 콤마(,)로 구분하여 나열. 각 열마다 ASC 또는 DESC 지정 가능.
  • 문법:
    SELECT column1, column2, ...
    FROM table_name
    ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;
  • TB_COMPANY_MASTER 테이블에서 COMPANY_TYPE_CAT (기업구분범주값)으로 오름차순 정렬하고, 같은 기업구분 내에서는 ESTABLISH_DT (설립일자)를 기준으로 오름차순(오래된 순) 정렬
SELECT COMPANY_NM, COMPANY_TYPE_CAT, ESTABLISH_DT
FROM TB_COMPANY_MASTER
ORDER BY COMPANY_TYPE_CAT ASC, ESTABLISH_DT ASC;
  • TB_LOAN_ACCOUNT 테이블에서 INTEREST_RATE (금리)로 내림차순 정렬하고, 금리가 같은 경우 LOAN_AMT (여신금액)으로 내림차순 정렬
SELECT LOAN_ACCT_NO, INTEREST_RATE, LOAN_AMT
FROM TB_LOAN_ACCOUNT
ORDER BY INTEREST_RATE DESC, LOAN_AMT DESC;

행 개수 제한

  • 행 개수 제한: 조회 결과의 처음 몇 개의 행만 가져오고 싶을 때 사용. DBMS마다 문법이 다름.

  • 기본 사용법 (상위 N개):

    SELECT column1, column2, ...
    FROM table_name
    WHERE ROWNUM <= N; -- N개의 행만 가져옴 (정렬되지 않은 상태일 수 있음)
  • TB_COMPANY_MASTER 테이블에서 처음 5개 회사 조회 (순서 보장 안 됨)

SELECT COMPANY_NM, CEO_NM
FROM TB_COMPANY_MASTER
WHERE ROWNUM <= 2;
  • MySQL/PostgreSQL은 LIMIT N, SQL Server는 TOP N을 사용
  • Oracle의 행 개수 제한 방법은 ORDER BY와 호환되지 않음(WHERE가 먼저 실행되기 때문)

FETCH NEXT

Oracle 12c 이후 버전에서는 행 개수 제한을 위해 FETCH NEXT 문법을 제공

SELECT COMPANY_NM, CEO_NM
FROM TB_COMPANY_MASTER
FETCH NEXT 2 ROWS ONLY;

NEXT 대신 FIRST, ROWS 대신 ROW를 써도 됨(영어 표현의 자연스러움을 위해 허용)

SELECT COMPANY_NM, CEO_NM
FROM TB_COMPANY_MASTER
FETCH FIRST 1 ROW ONLY;

ORDER BY와도 호환. 가장 최근에 설립된 회사

SELECT COMPANY_NM, CEO_NM, ESTABLISH_DT
FROM TB_COMPANY_MASTER
ORDER BY ESTABLISH_DT DESC
FETCH FIRST 1 ROW ONLY;

OFFSET

중간부터 시작하려면 OFFSET을 사용 2행 건너 뛰고, 그 다음 3행 조회

SELECT COMPANY_NM, CEO_NM
FROM TB_COMPANY_MASTER
OFFSET 2 ROWS
FETCH NEXT 3 ROWS ONLY;

퀴즈