모든 강의를 무료로 볼 수 있어요. 회원가입 없이도 학습 가능합니다.

8강 / 전체 8강

DISTINCT와 계산

7분 읽기 조회 0

DISTINCT로 중복 행을 제거하고, SELECT 표현식에 산술·문자열 연산을 결합해 의미 있는 계산 열을 만듭니다.

🎯 학습 목표

이 강을 마치면 결과에서 중복된 값을 제거하는 DISTINCT를 자유롭게 활용할 수 있습니다. 또한 4강에서 배운 산술 표현식을 WHERE, ORDER BY와 함께 결합해 더 복잡한 계산 쿼리를 작성할 수 있고, 다양한 내장 수학 함수(ROUND, ABS 등)를 사용할 수 있게 됩니다. 9강의 집계 함수로 넘어가기 전에, 단일 행 수준의 계산을 완전히 마스터합니다.

🔁 DISTINCT — 중복 제거

이 섹션에서는 결과에서 중복된 행을 제거하는 DISTINCT를 살펴보겠습니다.

테이블에는 같은 값이 반복 저장된 열이 많습니다. 예를 들어 books 테이블의 category 열에는 'IT', 'IT', 'IT', '경제', '경제', '소설', '소설'처럼 중복값이 있습니다. "카테고리 종류가 무엇이 있는지" 알고 싶을 때 SELECT category FROM books는 7개 행을 모두 반환합니다. 이때 DISTINCT를 사용하면 중복을 제거한 유니크한 값만 가져옵니다.

-- 중복 포함 (7행)
SELECT category FROM books;

-- 중복 제거 (3행)
SELECT DISTINCT category FROM books;

두 번째 쿼리는 'IT', '경제', '소설' 세 가지만 반환합니다. DISTINCT는 SELECT 키워드 바로 뒤, 열 이름 앞에 씁니다.

DISTINCT는 여러 열에 적용하면 열 조합이 고유한 행을 반환합니다.

SELECT DISTINCT category, author
FROM books
ORDER BY category;

카테고리와 저자의 조합이 고유한 행만 반환됩니다. 같은 카테고리라도 저자가 다르면 별도 행으로 나타납니다.

회원 테이블에서 현재 존재하는 등급 종류를 확인해 봅니다.

SELECT DISTINCT grade
FROM members
ORDER BY grade;

NULL, PREMIUM, REGULAR, VIP 네 가지 값이 나타납니다. NULL도 하나의 "다른" 값으로 취급되어 DISTINCT 결과에 포함됩니다.

DISTINCT는 중복 체크를 위해 모든 행을 비교해야 하므로 데이터가 많을 때 느려질 수 있습니다. 9강에서 배우는 GROUP BY도 유사한 효과를 낼 수 있으며 경우에 따라 더 효율적입니다.

🔢 SELECT의 산술 표현식 심화

이 섹션에서는 4강에서 소개한 산술 표현식을 WHERE와 ORDER BY와 결합하는 방법을 살펴보겠습니다.

4강에서 price * 0.9처럼 SELECT에서 계산식을 쓸 수 있음을 배웠습니다. 이 계산 결과를 ORDER BY의 정렬 기준으로도 사용할 수 있습니다.

SELECT title, price, price * 0.9 AS 할인가
FROM books
ORDER BY price * 0.9 DESC;

할인가를 내림차순으로 정렬해 가장 비싼 할인 가격부터 나타납니다. ORDER BY에서 별칭(할인가) 대신 원래 표현식(price * 0.9)을 써야 하는 것은 4강에서 배운 실행 순서(SELECT가 ORDER BY보다 먼저 실행됨) 때문입니다. 단, 일부 DBMS(MySQL, PostgreSQL)는 ORDER BY에서 SELECT 별칭을 허용하기도 합니다.

WHERE 절에서도 계산식을 조건으로 사용할 수 있습니다.

SELECT title, price, stock, price * stock AS 재고총액
FROM books
WHERE price * stock > 200000
ORDER BY price * stock DESC;

재고총액(가격 × 재고)이 200,000원을 초과하는 도서가 나타납니다. 이처럼 WHERE, SELECT, ORDER BY 모두에서 동일한 계산식을 쓸 수 있습니다. 반복이 보여도 현재 수준에서는 이것이 올바른 방법입니다(서브쿼리를 배우면 한 번만 계산하는 방법도 배웁니다).

🧮 수학 내장 함수

이 섹션에서는 SELECT에서 자주 쓰이는 수학 내장 함수를 살펴보겠습니다.

SQL에는 열 값에 적용할 수 있는 다양한 내장 함수가 있습니다. 이 강에서는 단일 행 수준에서 동작하는 수학 함수를 다룹니다.

ROUND(값, 소수자리)는 지정한 소수 자리로 반올림합니다.

SELECT
  title,
  price,
  ROUND(price * 0.9, 0)     AS 할인가_정수,
  ROUND(price * 0.9, -3)    AS 할인가_천원단위
FROM books;

두 번째 열은 소수점 없는 정수 할인가를, 세 번째 열은 천 원 단위로 반올림한 값을 보여줍니다. ROUND(22000 * 0.9, 0)은 19800이고, ROUND(19800, -3)은 20000입니다.

ABS(값)는 절댓값을 반환합니다.

SELECT ABS(-5000);   -- 결과: 5000
SELECT ABS(price - 20000) AS 기준가격차이
FROM books;

두 번째 쿼리는 각 도서의 가격이 20,000원으로부터 얼마나 차이 나는지 절댓값으로 보여줍니다. 비싸도 싸도 차이를 양수로 표현합니다.

그 외 자주 쓰이는 수학 함수입니다.

함수역할예시
ROUND(n, d)소수 d자리로 반올림ROUND(3.567, 2) → 3.57
ABS(n)절댓값ABS(-100) → 100
MAX(a, b) [비집계]두 값 중 큰 값 (SQLite)MAX(price, 20000)
MIN(a, b) [비집계]두 값 중 작은 값 (SQLite)MIN(stock, 10)
CAST(값 AS 타입)자료형 변환CAST(price AS REAL)

CAST는 자료형을 변환할 때 씁니다. 정수 나눗셈 결과를 실수로 얻고 싶을 때 CAST(price AS REAL) / 3처럼 사용합니다.

📅 날짜 함수 맛보기

이 섹션에서는 날짜 관련 내장 함수를 간략히 살펴보겠습니다.

SQLite의 날짜 함수를 사용하면 날짜 계산과 변환을 SELECT에서 바로 처리할 수 있습니다.

-- 오늘 날짜
SELECT date('now');

-- 오늘부터 30일 후
SELECT date('now', '+30 days');

-- 가입 후 경과 일수
SELECT name,
       join_date,
       CAST(julianday('now') - julianday(join_date) AS INTEGER) AS 가입경과일
FROM members
ORDER BY 가입경과일 DESC;

마지막 쿼리는 각 회원이 가입한 이후 오늘까지 며칠이 지났는지 계산합니다. julianday()는 날짜를 율리우스 일수(연속된 숫자)로 변환하는 SQLite 함수로, 두 날짜의 차이를 일수로 쉽게 계산할 수 있게 해 줍니다.

주문 날짜에서 연도와 월만 추출할 수도 있습니다.

SELECT order_id,
       order_date,
       strftime('%Y', order_date)    AS 주문연도,
       strftime('%m', order_date)    AS 주문월
FROM orders;

strftime()은 날짜 형식을 지정해 원하는 부분만 추출합니다. %Y는 4자리 연도, %m은 2자리 월, %d는 2자리 일을 나타냅니다.

📝 핵심 요약

이번 강에서 배운 내용을 정리하겠습니다.

문법/함수역할예시
SELECT DISTINCT 열중복 제거 후 유니크 값 반환SELECT DISTINCT category FROM books
계산식 + ORDER BY계산 결과를 정렬 기준으로 사용ORDER BY price * 0.9 DESC
ROUND(n, d)소수 d자리 반올림ROUND(price * 0.9, 0)
ABS(n)절댓값 반환ABS(price - 20000)
CAST(값 AS 타입)자료형 변환CAST(price AS REAL)
date('now')오늘 날짜 반환SELECT date('now')
strftime(형식, 날짜)날짜에서 원하는 부분 추출strftime('%Y', order_date)

DISTINCT와 표현식 SELECT를 자유롭게 조합할 수 있으면, 단일 테이블에서 원하는 거의 모든 정보를 뽑아낼 수 있습니다. 다음 9강부터는 여러 행을 하나의 결과로 요약하는 집계 함수를 배웁니다. COUNT, SUM, AVG, MAX, MIN으로 "주문 건수", "총 매출", "평균 가격"을 한 줄 쿼리로 구하는 강력한 기능을 익히게 됩니다.

관련 주제

  • DISTINCT
  • 중복 제거
  • ROUND ABS 함수
  • 산술 표현식
  • 계산 열
  • 개발·프로그래밍
  • 개발·프로그래밍 강의
  • SQL·데이터베이스 입문 24강
  • 무료강의
  • 무료 온라인 강의
  • NUGUNA
  • 누구나

📚 시리즈 전체 공유

SQL·데이터베이스 입문 24강

이 강의가 속한 시리즈는 총 8강, 모두 무료입니다. 처음부터 배우려는 동료에게 시리즈 전체를 알려 주세요.

댓글

0/1000

불러오는 중...