조건 조합하기

유석현(SeokHyun Yu)·2022년 8월 7일
0

SQL

목록 보기
7/45
post-thumbnail

서론

실제로 SELECT 명령을 사용해서 데이터베이스에서 데이터를 검색할 때 단순한 조건식을 넣으면 많은 결괏값이 반환되어 한눈에 알아보기 힘들다.

따라서 통상적으로 2개 이상의 조건식을 조합해 검색한다.

조건을 조합해 사용할 경우 복수의 조건을 WHERE 구로 지정한다. 조합할 때는 AND, OR, NOT의 3가지 방법을 사용할 수 있다.


1. AND로 조합하기

복수의 조건을 조합할 경우 AND를 가장 많이 사용한다.

AND는 논리 연산자 중의 하나로 좌우에 항목이 필요한 이항 연산자이다.

좌우의 식이 모두 참일 경우 AND 연산자는 참을 반환한다.

SELECT * FROM sample_table WHERE id<>1 AND id<>2;

위의 예제는 id1이 아니면서 2도 아닌 행들을 추출한다.

이렇듯 AND 연산은 조건을 만족하는 행을 집합으로 표현했을 때 이들 집합이 겹치는 부분, 즉 '교집합'으로 계산할 수 있다.

AND 연산자는 논리곱을 계산하는 논리 연산자이다.


2. OR로 조합하기

'어느 쪽이든 하나만 참이 되면 조건식은 참이 된다'라고 할 경우에는 OR로 조건식을 연결한다.

OR 또한 논리 연산자 중의 하나로 좌우 항목이 모두 필요한 이항 연산자이다.

AND와 달리 어느 한 쪽이든 조건을 만족하면 결과는 참이 된다.

모든 조건이 거짓인 경우 결과는 거짓이 된다.

즉, OR는 '또는'에 해단한다.

SELECT * FROM sample_table WHERE id<>1 OR id<>2

OR 연산은 조건을 만족하는 행을 집합으로 표현했을 때, 이 집합들을 합한 부분, 즉 '합집합'으로 계산할 수 있다.

OR 연산자는 논리합을 계산하는 논리 연산자이다.


3. AND와 OR를 사용할 경우 주의할 점

AND 연산자와 OR 연산자의 경우 좌우로 조건식을 지정하는 경우가 많다.

조건식을 지정하는 부분에 이나 상수만을 지정해도 에러가 발생하지는 않지만 기대한 결괏값을 얻을 수 없다.

예를 들어 id 열의 값이 1 또는 2인 행을 추출하고 싶을 경우, 다음과 같은 조건식을 사용하면 올바른 결과를 얻을 수 없다.

SELECT * FROM sample_table WHERE id=1 OR 2;

상수 2는 논리 연산으로 항상 이 되기 때문에 결과적으로 모든 행을 반환하게 된다.

올바른 조건식은 다음과 같다.

SELECT * FROM sample_table WHERE id=1 OR id=2;

AND와 OR를 조합해서 사용할 경우 주의가 필요하다.

다음 예제를 보면서 이유를 알아보자.

SELECT * FROM sample_table WHERE id=1 OR id=2 AND no=1 OR no=2;

위 SQL 명령을 통해 원했던 결괏값은 'id가 1 또는 2면서 no가 1 또는 2'인 행이지만 실제로는 'id가 1 또는 id가 2면서 no가 1 또는 no가 2'인 행이 출력된다.

이렇게 출력되는 이유가 무엇일까?

바로 AND와 OR의 계산 우선순위가 다르기 때문이다.

OR 보다 AND 쪽 우선 순위가 높기 때문에 id=2 AND no=1이 먼저 계산된다.

즉, 다음과 같이 3개의 조건식이 OR로 연결된 것과 같아진다.

  • id = 1

  • id = 2 AND no = 1

  • b = 2

따라서 처음 원한 대로 조건을 지정하기 위해서는 괄호로 우선 순위를 변경해야 한다.

SELECT * FROM sample_table WHERE (id=1 OR id=2) AND (no=1 OR no=2);

일반적으로 OR 조건식은 괄호로 묶어 지정하는 경우가 많다.

조건이 잘못 지정되는 것을 미연에 방지할 수 있도록 괄호로 묶어두는 습관을 붙이는 것이 좋다.


NOT으로 조합

여기까지 논리 연산자 AND와 OR에 대해서 알아보았다.

지금부터 또 하나의 논리 연산자인 NOT에 관해 알아보겠다.

SELECT * FROM sample_table WHERE NOT(id=1 OR id=2);

NOT 연산자는 오른쪽에만 항목을 지정하는 단항 연산자이다.

오른쪽에 지정한 조건식의 반대 값을 반환한다.

만약 조건식이 '참'을 반환하면 NOT은 이에 반하는 '거짓'을 반환한다.

주로 복수의 조건식에 대해 '~ 아닌', '~ 외에', '~를 제외한 나머지' 등의 조건을 지정할 경우에 사용한다.

profile
Backend Engineer

0개의 댓글