SELECT에서 쓰는 다양한 표현
CASE WHEN 표현식을 사용한 조건부 데이터 변환
CASE표현식: SQL 내에서IF-THEN-ELSE와 유사한 조건부 로직을 구현하여 데이터를 변환하거나 특정 값을 표시할 때 사용.- 기본 구조:
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
ENDELSE 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. 큰 값에서 작은 값 순서.
- 오름차순 (Ascending):
- 기본 문법:
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;
퀴즈
사용자 정보 입력
퀴즈를 시작하기 전에 이름과 소속을 입력해주세요.