서론
실제로 SELECT 명령을 사용해서 데이터베이스에서 데이터를 검색할 때 단순한 조건식을 넣으면 많은 결괏값이 반환되어 한눈에 알아보기 힘들다.
따라서 통상적으로 2개 이상의 조건식
을 조합해 검색한다.
조건을 조합해 사용할 경우 복수의 조건을 WHERE 구로 지정한다. 조합할 때는 AND
, OR
, NOT
의 3가지 방법을 사용할 수 있다.
1. AND로 조합하기
복수의 조건을 조합할 경우 AND
를 가장 많이 사용한다.
AND는 논리 연산자 중의 하나로 좌우에 항목이 필요한 이항 연산자
이다.
좌우의 식이 모두 참일 경우 AND 연산자는 참을 반환한다.
SELECT * FROM sample_table WHERE id<>1 AND id<>2;
위의 예제는 id
가 1
이 아니면서 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로 연결된 것과 같아진다.
따라서 처음 원한 대로 조건을 지정하기 위해서는 괄호
로 우선 순위를 변경해야 한다.
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은 이에 반하는 '거짓'을 반환한다.
주로 복수의 조건식에 대해 '~ 아닌', '~ 외에', '~를 제외한 나머지' 등의 조건을 지정할 경우에 사용한다.