[SQL] 다양한 데이터 활용법

jul ee·2025년 4월 3일

데이터 성장기

목록 보기
11/139

🖇  쿼리문 작성과 데이터 필터링
🖇  비교 연산자
🖇  논리 연산자
🖇  산술 연산자


SQL은 단순히 데이터를 조회하는 언어가 아니다.

어떤 데이터를 보여줄 것인가, 어떤 방식으로 분류하고 필터링할 것인가,
어떻게 더 읽기 쉽게 가공할 것인가에 따라 쿼리의 힘은 훨씬 더 커질 수 있다.

이 글에서는 기본적인 SELECT 문에 이어서

    조건을 기준으로 데이터를 걸러내고 LIKE,
    가독성을 높이기 위한 별칭을 설정하고 Alias,
    데이터 정렬 ORDER BY 및 중복을 제거하는 DISTINCT,
    조건에 따른 분류 IF, CASE,
    타입을 변환하여 활용도를 높이는CAST 등의 SQL 문법들을 정리했다.

다양한 데이터셋에 직접 적용해 보면서 SQL의 기본기를 탄탄하게 다지는 계기가 되길 바란다.



🖇  특정 데이터 조건과 별칭

지금부터 다룰 데이터셋은 아래 글에서 소개했으니 참고해도 좋다.
[SQL] 데이터 분석의 시작: SQL로 데이터 다루기

특정 데이터 조건주기(LIKE, Wildcard)

LIKE

조회 조건 값이 명확하지 않을 때 특정 내용을 찾을 수 있다

  • 조건에 문자나 숫자를 포함할 수 있다
  • 주로 Wildcard와 함께 사용

Wildcard

  • % : 조건을 포함하는 모든 문자를 의미 (0개 이상의 문자)
  • _ : 한 글자를 의미
    • _의 개수에 따라 뒤에 오는 문자열의 개수를 정할 수 있다
    • e.g.,  to_라고 지정하면 tom은 추출되지만 tomi는 추출되지 않음
-- hr이 0이고, weekday에 'ur'이란 단어가 들어간 데이터 추출하기

SELECT *
FROM bike
WHERE hr = 0
      AND weekday LIKE '%ur%'


-- hr이 0이고, weathersit이 'Cl'로 시작하는 데이터 추출하기

SELECT *
FROM bike
WHERE hr = 0
      AND weathersit LIKE 'Cl%'
-- hr이 0이고, mnth이 'ma?'인 데이터 추출하기

SELECT *
FROM bike
WHERE hr = 0
      AND mnth LIKE 'ma_'


-- hr이 0이고, mnth이 'ma?'이며 weekday에 'ur'이란 단어가 들어간 데이터를 추출하기

SELECT *
FROM bike
WHERE hr = 0
      AND mnth LIKE 'ma_'
      AND weekday LIKE '%ur%'

별칭 사용하기(Alias)

임시로 컬럼명을 변경할 때 별칭을 사용할 수 있다

💡  별칭은 왜 필요할까?

긴 컬럼명을 간결하게 표현할 수 있고,

계산식이나 CASE 문 등에서 생성한 가상 컬럼에 이름을 붙일 수 있어 가독성이 좋아진다.

특히 JOIN이나 서브쿼리에서 테이블 이름을 줄여 쿼리를 간결하게 만들 때 필수적이다.


[주의] 기존의 컬럼명이 물리적으로 변경되는 것은 아님
  • 별칭은 컬럼명/테이블명 바로 뒤에 작성
  • SELECTFROM절에서 사용
  • 컬럼명과 별칭 사이에는 AS를 작성 (생략 가능)
    • 특수문자, 대소문자, 공백을 사용하려면 따옴표로 묶어줘야 한다
-- temp와 hum를 추출하고 hum에 'humidity'란 별칭 주기

SELECT temp,
	   hum AS 'humidity'
FROM bike
LIMIT 5
-- bike 테이블 이름을 'b'로 지정하고, b 테이블의 temp와 hum를 추출하기
--   . 생략 가능
SELECT b.temp,
 	   b.hum AS 'humidity'
FROM bike AS b
LIMIT 5



🖇  데이터 정렬과 중복 제거

데이터 정렬하기(ORDER BY)

ORDER BY

오름차순, 내림차순으로 정렬된 형태의 데이터가 필요할 때가 있다

  • SQL 구문 하단에 작성
  • 데이터 추출시, 테이블에 입력된 순서대로 출력되는 것이 기본
# 작성 순서

SELECT
FROM 
WHERE
ORDER BY 
LIMIT
-- 오름차순
-- ASC 생략 가능
ORDER BY 컬럼명 (ASC)

-- 내림차순
ORDER BY 컬럼명 DESC

-- 컬럼명 대신 지정한 컬럼 순서를 입력하는 것도 가능
-- SELECT에 작성한 첫번째 컬럼 기준으로 내림차순으로 정렬하고, 같은 값이 있다면 두번째 컬럼 기준으로 정렬
ORDER BY 1 DESC, 2

-- dteday, temp, cnt 컬럼을 추출하고, cnt가 높은 순서대로 100개만 정렬하고 순서가 같은 것이 있다면 temp가 낮은 순서대로 정렬

SELECT dteday,
	   temp,
       cnt
FROM bike
ORDER BY cnt DESC, temp
LIMIT 100


-- 컬럼 순서로 정렬

SELECT dteday,
	   temp,
       cnt
FROM bike
ORDER BY 3 DESC, 2
LIMIT 100

중복제거하기(DISTINCT)

DISTINCT 

선택한 모든 컬럼을 고려하여 중복을 제거한다

  • 출력에서 고유한 값을 반환하기 위한 키워드
    • 선택한 컬럼들끼리의 조합이 완전히 동일해야 중복으로 인식되고,
    • 다른 컬럼들의 값은 달라도 선택한 컬럼들끼리의만 같으면 중복으로 간주해서 하나만 남기고 제거된다
  • 집계함수에도 DISTINCT 사용 가능
    • 집계함수 :  COUNTSUMAVGMAXMIN
-- weekday, weathersit 컬럼에서 중복 제거하기
--  -> weekday와 weathersit 컬럼이 동일한 행은 하나만 남기고 제거된다

SELECT DISTINCT weekday, weathersit
FROM bike


-- yr, weekday, weathersit 컬럼에서 중복 제거하기

SELECT DISTINCT yr, weekday, weathersit
FROM bike



🖇  조건문 활용하기 (IF, CASE WHEN ~ THEN ~)

IF(조건, 참일 때 반환 값, 거짓일 때 반환 값)

단일 조건문

엑셀의 IF 함수와 동일한 역할

  • SELECTWHERE 절에서 사용 가능
  • IF 내에 조건을 줄 때 함수와 함께 사용 가능
    • [참고] pandasql에서는 if함수를 iif로 표현
-- customerName 테이블에서 1990년 이전과 이후에 태어난 고객을 분리하기
-- 데이터를 이해하기 쉽게 '고객명', '생년월일', '1990년 기준'이라는 별칭을 사용
 
SELECT customerName AS "고객명",
       birthday AS "생년월일",
       iif(birthday >= '1990-01-01' , '이후', '이전') AS "1990년 기준"
FROM customers


CASE WHEN ~ THEN

다중 조건문

조건에 따른 값을 다르게 출력하고 싶은 경우 사용

  • 조건에 따라 기존에 있는 컬럼을 이용해 새로운 컬럼을 만들기도 한다

작성 순서

CASE WHEN '조건1' THEN '조건1 반환값' 
     WHEN '조건2' THEN '조건2 반환값' 
     ELSE '만족하는 조건이 없을 때 반환 값'
END
  • CASE문은 WHEN 의 조건을 순차적으로 체크하고 조건이 충족되면 THEN 에 명시된 값을 반환
    • WHEN 과 THEN 은 한 쌍으로 존재

    • WHEN과 THEN 은 여러 개가 존재할 수 있다

    • ELSE 는 앞의 조건들에 모두 해당하지 않았을 때 정해줄 기본 값

    • ELSE가 없고 조건에 맞는 값이 없으면 NULL값을 반환

      Tip) CASE WHENTHENEND를 먼저 작성한 후에 조건을 적으면 문법 실수를 줄일 수 있다

-- 고객 한도를 5만원, 십만원 단위로 분리하기

SELECT customerName,
	   creditLimit,
       CASE WHEN creditLimit <= 50000 THEN '5만원이하'
            WHEN creditLimit <= 100000 THEN '10만원이하'
            ELSE '10만원초과'
       END AS '고객한도분리'
FROM customers

-> 출력 셸에서만 컬럼이 생성되어 보이는 거지,
   Alias와 마찬가지로 실제 결과에는 영향을 주지 않는다 (물리적 변경 X)



🖇  데이터 타입 변환하기(CAST)

CAST

데이터의 타입을 변환하는 함수

  • 변환할 타입: int, float, varchar(문자열), datetime(날짜) 등
CAST(컬럼 AS 변환할 타입)

-- 예시
SELECT CAST(14.58 AS int)  -- [결과] 14

-- 데이터 bike의 정보 확인하기
bike.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 17379 entries, 0 to 17378
Data columns (total 16 columns):
 #   Column      Non-Null Count  Dtype  
---  ------      --------------  -----  
 0   dteday      17379 non-null  object 
 1   season      17379 non-null  object 
 2   yr          17379 non-null  int64  
 3   mnth        17379 non-null  object 
 4   hr          17379 non-null  int64  
 5   holiday     17379 non-null  int64  
 6   weekday     17379 non-null  object 
 7   workingday  17379 non-null  int64  
 8   weathersit  17378 non-null  object 
 9   temp        17379 non-null  float64
 10  atemp       17379 non-null  float64
 11  hum         17379 non-null  float64
 12  windspeed   17379 non-null  float64
 13  casual      17379 non-null  int64  
 14  registered  17379 non-null  int64  
 15  cnt         17379 non-null  int64  
dtypes: float64(4), int64(7), object(5)
memory usage: 2.1+ MB

=> 현재 yr은 int 타입임을 알 수 있다
-- 2011년 데이터 5개 추출하기

SELECT *
FROM bike
WHERE yr = 2011 
LIMIT 5


-- yr을 문자열타입으로 변환한 후, 2011년 데이터 5개 추출하기

SELECT CAST(yr AS varchar) AS yr
FROM bike
-- 문자로 변경된 상태이기 때문에,
-- 문자열로 조건을 주는 것처럼 변경해서 사용해야 한다
WHERE CAST(yr AS varchar) = '2011'
LIMIT 5
[참고] 보통 해당 타입을 지정하지 않으면 에러가 나지만
      데이터베이스 시스템에 따라 타입에 상관 없이 데이터를 추출할 수 있다

profile
AI에 관심을 가지고, 데이터로 가치를 만들어 나가는 과정을 기록합니다.

0개의 댓글