SQL WHERE 절에서 여러 조건 사용하는 방법

데이터베이스에서 원하는 정보를 정확하게 추출하려면 SQL WHERE 절에 여러 조건을 논리적으로 결합해야 합니다. AND와 OR 연산자를 중심으로 괄호를 적절히 활용하면 복잡한 데이터 속에서도 목적에 부합하는 레코드만 안전하게 선별할 수 있습니다.

AND와 OR 연산자로 다중 조건 연결하는 기본 원리

관계형 데이터베이스(RDBMS)에서 특정 행(Row)을 필터링할 때 가장 기본이 되는 키워드는 WHERE입니다. 하지만 실무에서는 ‘특정 부서이면서 입사일이 특정 일자 이후인 직원’ 또는 ‘VIP 회원이거나 누적 결제액이 100만 원 이상인 고객’처럼 복합적인 기준을 적용해야 하는 상황이 대부분입니다.

이때 두 개 이상의 조건을 묶어주는 핵심 논리 연산자가 바로 AND와 OR입니다. 각 연산자는 논리적 참(True)과 거짓(False) 판정 기준이 다르므로 명확한 목적에 맞춰 선택해야 합니다.

  • AND 연산자: 나열된 모든 조건을 동시에 만족해야만 결과에 포함됩니다. 조건이 늘어날수록 필터링 결과 행의 수는 줄어들거나 같아집니다.
  • OR 연산자: 나열된 조건 중 단 하나라도 만족하면 결과에 포함됩니다. 조건이 늘어날수록 조회되는 데이터의 범위는 넓어집니다.

예를 들어 주문 테이블에서 서울 지역에서 배송되며 결제 금액이 5만 원 이상인 주문 건을 찾고자 한다면, 두 조건 사이에 AND를 배치하여 양쪽 기준을 모두 통과한 데이터만 반환하도록 작성합니다.

혼합 사용 시 연산자 우선순위와 괄호의 중요성

SQL 문장 안에 AND와 OR이 함께 등장하면 쿼리 엔진은 사칙연산의 곱셈처럼 AND 연산자를 OR보다 먼저 평가합니다. 이 실행 우선순위를 간과하면 개발자나 분석가가 의도했던 비즈니스 로직과 전혀 다른 엉뚱한 레코드가 대량으로 출력되는 논리 오류가 발생합니다.

예를 들어 “영업부 또는 기획부 소속 중에서 근속연수가 3년 이상인 직원”을 추출하려는 경우를 가정해 보겠습니다. 괄호 없이 WHERE department = '영업부' OR department = '기획부' AND years >= 3으로 작성하면, 데이터베이스는 ‘기획부이면서 3년 이상인 사람’을 먼저 구한 뒤 ‘영업부인 모든 사람’을 합쳐서 가져오게 됩니다. 그 결과 근속연수가 1년도 채 되지 않은 영업부 직원까지 모두 출력되는 치명적인 실수가 생깁니다.

따라서 둘 이상의 논리 연산자를 섞어서 쓸 때는 우선적으로 묶여야 하는 조건 단위를 소괄호 ( )로 명확하게 감싸주어야 합니다. 소괄호는 연산 순위를 강제로 최우선으로 끌어올릴 뿐 아니라, 나중에 다른 작업자가 쿼리를 읽고 유지보수할 때도 가독성을 크게 높여줍니다.

IN 연산자와 BETWEEN으로 조건문 간결하게 축약하기

동일한 컬럼에 대해 여러 개의 OR 조건을 연속으로 나열하거나, 특정 숫자·날짜 구간을 AND로 검사할 때는 전용 연산자를 사용하는 것이 훨씬 깔끔합니다. 코드가 길어지면 오타가 발생하기 쉽고 검토 시간도 늘어나기 때문입니다.

특정 컬럼 값이 여러 후보 값 중 하나와 일치하는지 확인할 때는 IN 연산자를 활용합니다. status = 'READY' OR status = 'ING' OR status = 'DONE' 형태의 반복적인 구문을 status IN ('READY', 'ING', 'DONE') 한 줄로 단축할 수 있어 실무 작성 효율이 크게 올라갑니다.

연속된 범위 값을 필터링할 때는 BETWEEN 연산자가 유용합니다. age >= 20 AND age <= 29 대신 age BETWEEN 20 AND 29 구문을 사용하면 시작값과 끝값을 직관적으로 지정할 수 있습니다. 단, BETWEEN은 양 끝 경계값을 포함(이상, 이하)하므로 초과나 미만 기준이 필요할 때는 일반 비교 연산자(>, <)를 조합해야 합니다.

WHERE 다중 조건 처리 방식 비교

조건문의 성격과 상황에 맞춰 가장 알맞은 구문을 선택할 수 있도록 주요 다중 조건 결합 방식을 아래 표로 정리하였습니다.

연산 방식 동작 특성 적합한 사용 상황 작성 시 주의점
AND 결합 모든 조건이 TRUE여야 반환 상세 필터링, 검색 조건 구체화 조건이 모순되면 결과가 0건 발생
OR 결합 하나라도 TRUE면 반환 다양한 케이스 통합 조회 불필요하게 많은 데이터가 조회될 위험
괄호 + 혼합 결합 지정한 그룹 순서대로 조건 연산 복잡한 업무 규칙 및 분기 처리 괄호 누락 시 AND가 선순위 처리됨
IN / BETWEEN 목록 포함 및 연속 범위 검사 동일 컬럼 대상 반복 조건 단순화 NULL 값 포함 여부 및 경계값 확인 필요

대량 데이터 조회 시 다중 조건 성능 최적화 팁

다중 조건을 사용할 때 문법적인 완성도뿐 아니라 데이터베이스 인덱스(Index)의 활용도를 함께 고려해야 대용량 환경에서도 빠른 응답 속도를 유지할 수 있습니다.

  1. 인덱스 컬럼의 가공 지양: WHERE SUBSTRING(code, 1, 3) = 'ABC' AND reg_date >= '2026-01-01'처럼 조건절 좌변 컬럼에 함수나 수식을 적용하면 인덱스를 타지 못하고 전체 테이블 스캔(Full Table Scan)이 일어납니다. 좌변은 순수 컬럼명만 남겨두어야 합니다.
  2. 선택도가 높은 조건 우선 점검: 복합 인덱스(Composite Index)가 설정된 테이블에서는 인덱스 선두 컬럼이 WHERE 절 조건에 누락 없이 포함되어 있는지 확인해야 합니다.
  3. OR 절의 인덱스 비효율 주의: 서로 다른 컬럼에 OR 조건이 걸려 있으면 데이터베이스 옵티마이저가 인덱스를 활용하기 까다로워집니다. 필요한 경우 UNION 또는 UNION ALL 구문으로 쿼리를 분리해 인덱스를 타도록 유도하는 방안을 검토해야 합니다.
  4. NULL 값 비교 규칙 준수: 데이터에 NULL이 포함된 경우 = NULL 대신 반드시 IS NULL 또는 IS NOT NULL을 다중 조건 안에 결합해야 의도한 결과를 정상 취합할 수 있습니다.

자주 묻는 질문

AND와 OR 중 무엇이 먼저 실행되나요?

AND 연산자가 먼저 실행됩니다.

조건을 괄호로 묶는 이유는 무엇인가요?

연산 순서를 명확히 통제합니다.

WHERE 절에 조건 개수 제한이 있나요?

실무적 제한 없이 사용됩니다.