SQL 데이터 필터링 복잡한 조건 때문에 결과가 틀린다면? ‘중간 컬럼’ 설계법이 답이다

필터링은 방대한 데이터에서 정확히 필요한 행만 추출하는 기술입니다. SQL 데이터 필터링 방법은 간단한 것 부터 복잡한 것 까지 다양합니다. 복잡한 AND/OR 조건 때문에 머리가 아프신 분들은 계산 오류를 제로로 만드는 중간 컬럼(Intermediate Columns)이 답입니다.

[🚀 SQL 데이터 필터링 실무 가이드: 핵심 요약]

Q: 복잡한 AND/OR 조건을 실수 없이 필터링하는 방법은?

  • A: 전체 조건을 한꺼번에 쓰지 말고, 각 논리 단위를 **’중간 컬럼(Intermediate Columns)’**이라는 불리언(Boolean) 형태로 나누어 작성하세요. 가독성이 높아지고 개별 조건의 검증이 쉬워집니다.

Q: SELECT에서 만든 새 컬럼을 WHERE 절에서 필터링할 때 발생하는 오류 해결법은?

  • A: SQL의 실행 순서(FROM → WHERE → SELECT) 때문입니다. **WITH 절(CTE)**을 사용하여 중간 컬럼을 포함한 임시 테이블을 먼저 생성한 후 메인 쿼리에서 필터링하면 해결됩니다.

Q: 다중 조건의 여집합(반대 조건)을 구할 때 주의할 점은?

  • A: 드 모르간의 법칙에 따라 NOT을 적용할 때 ANDOR로, ORAND로 연산자가 바뀝니다. NOT (A OR B)NOT A AND NOT B와 동일하게 작동합니다.

Q: NULL 데이터 필터링 시 주의사항은?

  • A: NULL은 0이나 빈 문자열과 다릅니다. 데이터가 아예 없는 상태를 의미하므로 = 연산자가 아닌 IS NULL 또는 IS NOT NULL을 사용해야 합니다.

SQL 데이터 필터링

현재 나는 Datacamp 플랫폼을 통해서 데이터베이스의 데이터를 다루기 위해 중급 SQL를 배우고 있다. 오늘의 주제는 SQL 데이터 필터링이다. 기존 데이터 관련 포스팅이 궁금하신 분들은 본 웹사이트 DATA 카테고리를 참고하시기 바란다.

엑셀을 사용해 보신 분들이 있다면, 우리는 필터라는 것에 익숙하다. 수 많은 체크 가능 칸에서 내가 필요한 정보만 체크하면 딱 내가 원하는 데이터를 볼 수 있다.

엑셀 필터링

SQL 데이터 필터링은 특정 조건을 만족하는 데이터의 일부만 추출하는 작업이다. 필터링은 크게 2가지 용도로 사용된다. 그냥 필터링 하는 것만으로, 질문에 대한 답변이 되는 경우가 있고, 필터링 된 데이터를 가지고 다른 작업을 수행하는 준비 단계로 사용되기도 한다.


SQL 데이터 기본 필터링은 어떻게 할까? WHERE 절

SQL 데이터 필터링 작업은 WHERE 절 사용함으로써 이뤄진다. 아래가 바로 데이터 조작의 기본 필터링이다.

SELECT company,

sector,

revenue,

FROM fortune_50

WHERE sector = ‘Technology’;

fortune_50 테이블에서 sector 컬럼의 데이터 값 중에서 ‘Technology’ 인 조건을 만족하는 행의 company, sector, revenue 컬럼을 보여달라는 얘기다.

만약, 여기에서 WHERE 절이 없다면, 그냥 모든 행의 company, sector, revenue 컬럼 데이터를 보여줬을 것이다.


1) 필터링 논리 표현식

이번에 위의 WHERE sector = ‘Technology’; 대신 WHERE profit < 0;을 사용해 보자

WHERE 뒤에 있는 부분, sector = ‘Technology’와 profit < 0를 논리 표현식이라고 부른다. 논리 표현식은 크게 3부분으로 나눠진다

  • 왼쪽(LHS): 보통 컬럼 참조 (예: profitmarket_cap)
  • 논리 연산자: 비교 작업 (=!=<><=>=)
  • 오른쪽(RHS): 비교할 값 (예: 01000000'Technology')

데이터 각 행마다 이 논리 표현식이 평가되어 참 또는 거짓으로 구분되고, 참으로 되는 것만 출력이 되어서 우리 눈에 보이게 되는 거고, 그게 우리가 말하는 SQL 데이터 필터링이다. 참고로, != 이 표시는 논리 연산자로 같지 않다는 것을 뜻한다.


2) 데이터 중에 이 단어가 들어간 것만 필터링 하려면? LIKE와 와일드카드 %

가끔 전체 단어가 아닌 일부 단어만 포함되는 행을 필터링하는 경우가 있다.UnitedHealth Group, Cigna Group 이런 식으로 Group이 들어가는 행만 뽑아내야 할 때가 있다는 뜻이다. 이럴 때 유용한 것이 바로 LIKE와 와일드카드 %이다.

SELECT company,

sector

FROM fortune_50

WHERE company LIKE ‘%Group’

WHERE company LIKE ‘%Group’ 의 의미는 company 컬럼 속 데이터 중에서 앞에는 뭐가 들어가도 좋은데, 끝에는 Group으로 끝나는 조건에 만족하는 행은 다 보여줘 란 얘기다.

  • '%Group%': 어느 위치에든 ‘Group’를 포함
  • 'Group%': ‘Group’로 시작
  • '%Group': ‘Group’로 끝남

와일드카드 %를 어디에 붙이는 가에 따라 그 조건에 맞는 행을 필터링할 수 있다. 다만, LIKE 패턴 매칭은 대소문자를 구분하기 때문에 입력할 때 정확히 입력하기 바란다. (BigQuery, PostgreSQL, Oracle)

3) 특정 컬럼 데이터 값이 누락(NULL)되어 있는 행 찾기

데이터베이스에서 가져온 데이터를 잘 살펴보면, 각 행 속에서 특정 컬럼 데이터 값이 누락이 되어 있는 경우가 있다. 크게 하나는 원래부터 존재하지 않는 값이기 때문이고, 둘째는 작성을 실제로 하지 않아 생기는 NULL이다.

  • 시가 총액은 실제로 회사가 상장을 해야 생기는 데이터 값이다. 만약 비상장 기업이라면 비워져 있는 것이 이상하지 않다.
  • 기업의 직원 수가 채워져 있지 않는 것은 실제로 작성하지 않아 비워져 있는 경우다.

SELECT company,

employees

FROM fortune_50

WHERE employees IS NULL;

특정 컬럼 데이터 값이 누락된 행을 찾는 것은 쉽다. employees가 컬럼 명이고 IS NULL만 붙이면 된다. 반대로, 누락되지 않은 행을 찾는 것은 IS NOT NULL을 붙이면 된다.


4) 가장 많이 하는 필터링, Top N 필터링

방대한 데이터 속에서 필터링하면서 가장 많이 사용하는 것이 바로 Top N이다. 나 역시 Top 10, 또는 Top 3를 구하는 필터링을 자주 활용하는 것 같다

SQL 데이터 필터링 중 Top N 구하기


필터링 다중 조건(둘 이상의 조건) 어떻게 만들까?

벤 다이어그램

지금까지는 1가지 조건에 대한 SQL 데이터 필터링을 보았다. 물론 이런 필터링의 경우도 있겠지만, 일반적으로 여러 개의 조건을 만족해야 하는 필터링이 더 많을 것이다. 이런 것을 필터링 다중 조건이라고 한다.


1) 조건의 논리적 관계 연산자 AND, OR, NOT

기업 데이터 중에, 테크 기업이면서, 현 CEO가 창업자인 2가지 조건을 만족하는 행을 출력시켜 보세요 (AND 연산자를 사용)

SELECT company,

rank_2025,

sector,

is_founder_ceo,

ceo

FROM fortune_50

WHERE sector = ‘Technology’

AND is_founder_ceo = TRUE;

필터링은 조건에 만족하는 것을 보여주는 것이다. 여기에는 2가지(다중) 조건이 보인다. 하나는 sector = ‘Technology’이고, 또 다른 하나는 is_founder_ceo = TRUE이다.

섹터가 테크인 것 하고, 창업자가 현재까지 ceo인 경우이다. 2가지 조건이다. 그리고 이 조건들의 논리적 관계를 정리하는 연산자 AND가 보인다.

  • AND : 앞에 것도 만족해야 하고, 뒤에 것도 만족해야 한다. (둘 다 만족해야 True)
  • OR : 앞에 것, 뒤에 것 중에서 하나만 만족하면 된다 (하나만 만족해도 True)
  • NOT : 둘 다 만족하지 않는 것

작동하는 원리를 이해해 보자

  • 각 조건을 개별적으로 평가 → True/False
  • AND/OR로 조건들을 결합 → 최종 True/False
  • 최종 True인 행만 선택 → 결과 반환

조건 2개 sector = ‘Technology’이면 True이고 is_founder_ceo = TRUE이다. AND는 둘 다 TRUE일 때만 TRUE 출력을 해준다. 하지만, OR의 경우 하나만 TRUE여도 출력을 해준다는 얘기다.


2) 조건이 3개 이상일 때 실행 순서 정리

조건이 3개 이상이면 분명히 AND, OR, NOT 중에서 2개는 분명히 쓰인다.

A AND B OR C 이거나, A OR B OR C 이거나, A OR B AND C 이런 경우만 봐도 연산자가 2개 이상은 쓰인다. 그런데 무엇을 먼저 실행을 해야 할까, 이것이 중요한 이유는 이 순서에 따라 본인이 의도한 결과를 갖느냐, 그렇지 않느냐가 결정되기 때문이다.

SELECT company,

sector,

ceo,

is_founder_ceo

FROM fortune_50

WHERE is_founder_ceo = TRUE

AND (sector = ‘Technology’ OR sector = ‘Automotive’);

조건을 잘 생각해 보고, 먼저 실행되어야 할 부분에 괄호를 사용한다. 괄호를 사용하면 실행 순서가 명확해 진다.


복잡한 필터링 실수를 하지 않으려면?

1) 중간 컬럼 만들기

조건이 많아질수록 우리가 실수할 리스크가 커진다. 물론 눈을 크게 뜨고, 확인을 하고 또 하겠지만 그래도 우리가 인간이기에 실수는 언제든지 일어날 수 있다.

복잡한 필터링을 할 때에는 새로운 중간 컬럼을 만들어 조건의 각 부분을 표현한 다음, 최종 필터에서 이를 사용하면 조건을 쉽게 작성하고 읽고 검증할 수 있다.

질문은 상위 10위 안에 들면서, 수익성이 있거나 2024년 대비 2025년 순위가 상승한 기업을 찾는 것이다.

일단 다중 조건이라는 것은 알지만, 선뜻 머리 속으로 어떻게 시작해야 할 지 모르겠다. 그래서 중간 컬럼이 필요하다.

위에 이미지에서 원래 Is_top10, is_profitable, Is_rank_improved는 없었다. 새로 만들어진 중간 컬럼이다. 각 조건의 결과를 중간 컬럼의 데이터 값으로 넣는 것이다.

이 때 사용되는 것이 바로 불리언 컬럼(Boolean Columns)이다. 불리언 컬럼은 그 값이 True와 False로 이뤄진는 것으로 생각하면 된다.

Is_top10 중간 컬럼은 기업이 상위 10안에 들면 True 아니면 False로 나타내 달라는 것이다. 아래 코드를 보면 이해가 된다. rank_2025 <= 10 AS is_top10 2025년 상위 10위내 있는 데이터 값은 True로 이 값을 새로 생성된 중간 컬럼 is_top10에 넣어라 라고 이해하면 된다

SELECT company,

rank_2025,

rank_2024,

sector,

profit,

rank_2025 <= 10 AS is_top10, — 이 부분에서 중간 컬럼 생성

profit > 0 AS is_profitable,

rank_2025 < rank_2024 AS is_rank_improved

FROM fortune_50;

WHERE is_top10

AND (is_profitable OR is_rank_improved);

is_profitable, is_rank_improved 컬럼도 마찬가지로 True와 False 값으로 만들면 된다. 상상해 보자 그러면 뭐가 남을 지, 데이터 값은 모두 True와 False 값으로 남을 것이다.

예를 들어, WHERE절 부분을 보자, is_top10이 True이고, is_profitable가 False 그리고 is_rank_improved가 True라고 생각해 보자.

True AND ( False OR True) -> True AND (True) -> True이기 때문에 이 행은 출력이 된다. 반대로 False면 나오지 않을 것이다.


2) 실행순서 FROM , WHERE, SELECT

나도 위와 같이 중간 컬럼을 사용해서 하면, 복잡한 필터링 문제를 해결할 수 있다고 생각했다. 그리고 실행을 해 봤는데, 오류가 발생한 것이다.

SQL 코드 순서를 아는 사람은 위의 코드 어디에서 오류가 나는 지 알 것이다.

SELECT 위의 컬럼들 (설명을 위해 컬럼들을 다 적지 않겠다)

FROM fortune_50;

WHERE is_top10

AND (is_profitable OR is_rank_improved);

SQL 코드 실행 순서는 FROM -> WHERE -> SELECT이다. 그러면 WHERE에서 아직 만들어지지 않은 is_top10, is_profitable, is_rank_improved을 과연 인식할 수 있을까?

그래서 오류가 생기는 것이다. 하지만, 우리는 실행 순서를 먼저 할 수 있게 해주는 코드를 알고 있다. 바로 WITH 절이다. WITH 절이 자세히 궁금하신 분들은 아래 포스팅을 꼭 읽어 보시기 바란다.

WITH절을 사용해서 먼저 is_top10, is_profitable, is_rank_improved를 만들어 주면 되는 것이다. 그럼 WHERE 절에서 위의 중간 컬럼을 인식하고 실행을 이어 나갈 수 있다.

SQL 데이터 필터링 with절까지

WITH절은 그 어떤 코드보다 먼저 실행이 된다. WITH절로 중간 컬럼을 만들고 그 만들어진 것을 enriched_fortune_50 테이블에 저장해 둔다. 그리고 원 실행순서 FROM에서 그 테이블을 가져오고 WHERE절 실행 후, SELECT *에서 모든 컬럼을 보여주는 되는 것이다.


3) 그래도 나오는 실수 경험담(주의사항)

이렇게 중간 컬럼(불리언 컬럼)으로 풀어서 해도 나는 실수가 많았다. 내가 만든 실수를 아래와 같이 적어 놓았다

  • AS 뒤에 이름 지을 때에는 공백은 허락 안된다. _를 사용해서 만들어라
  • With절 select 젤 마지막 컬럼 뒤에는 , 를 붙이지 않는다
  • A or B를 말한다면, IN (’A’, ‘B’)를 사용하고, A와 B는 텍스트이기 때문에 ‘를 반드시 사용해라
  • SELECT에서 하나만 명한다면 ,는 컬럼 뒤에 붙이지 않아도 된다


아무리 강조해도 지나치지 않는 검증 단계

위의 방법으로 우리는 원하는 행을 다 구했다. 하지만 복잡한 필터링의 경우, 검증의 단계가 아래와 같이 필요하다

  • 작성 중 — 각 중간 컬럼이 개별적으로 올바르게 작동하는지 확인
  • 작성 후 — 최종 필터링 결과에 올바른 행이 포함되고 잘못된 행이 제외되었는지 확인

1) 검증 프로세스 요약

  • 1단계 (작성 중): 각 중간 컬럼이 개별적으로 올바른지 샘플로 확인
  • 2단계 (작성 후): 최종 결과에서
  • 포함 확인: 결과에 포함된 행들이 전체 조건을 만족하는지 확인
  • 제외 확인: 제외된 행들이 전체 조건을 만족하지 않는지 확인

검증은 쉽게 말하면 샘플 몇 개 가지고 와서 중간 컬럼과 최종 결과에서 그 조건대로 한번 확인해 보는 것이다.


필터링 조건 반전 및 복합 반전

1) 조건 반전

조건 반전은 원래 조건의 밖에 있는 것을 구하는 것이다. 지금까지는 우리는 조건에 만족하는 행을 구했다. 그런데 이번에는 조건에 불만족하는 행을 구하고 싶다는 뜻이다.

FROM fortune_50

WHERE NOT (rank_2025 <= 10 OR profit / revenue > 0.25);

()안이 원래 조건이었고, 그 앞에 NOT를 붙이기만 하면 조건에 만족하지 않는 행을 구하게 되는 것이다. 참고로, NOT은 논리적 연산자 중에서 가장 최우선적으로 실행을 시킨다.


2) 복합 반전

조건을 만들 때 AND, OR과 같은 논리적 연산자를 사용하는 경우가 있다. 이런 복합 조건에 만족하는 것의 밖에 있는 것을 구할 때를 복합 반전이라 한다.

  • `NOT (A AND B)` → `NOT A OR NOT B`
  • `NOT (A OR B)` → `NOT A AND NOT B`

괄호 안의 연산자가 바뀌게 되기 때문에 이 점만 유의하면 된다. 이 부분을 드 모르간의 법칙(De Morgan’s Law)이라고 부른다.


마무리

오늘은 우리가 꼭 필요한 데이터를 추출하는데, 가장 중요한 SQL 데이터 필터링에 대해서 이야기해 보았다.

필터링으로 보여지는 데이터는 우리가 가진 전체 데이터가 아니다. 필터링에 의해서 조건에 맞는 행만 보여지는 것이다. 그 생각을 항상 가지면서 추가 필터링이나, 대시보드에서 차트 및 그래프를 만드는 것을 진행해야 한다.

가끔, 필터링으로 인해서 내가 생각한 데이터 행이 나오지 않거나, 차트에서도 예상하지 않은 값이 나올 때가 많기 때문이다.


유사한 게시물