본문 바로가기

Languages/SQL

[SQL] 7. 여러가지 조건

728x90
반응형

0. 조건 조합하기

조건을 조합하여 더 세밀하고 구체적으로 검색할 수 있도록 3개의 논리 연산자 AND, OR, NOT에 대해 알아보자. 

 

실제로 SELECT 명령을 사용해서 데이터베이스에서 데이터를 검색할 때 단순한 조건식을 넣으면 많은 결괏값이 반환되어 한눈에 알아보기 힘들다. 따라서 통상적으로 2개 이상의 조건식을 조합해 검색하는 경우가 많다. 조건식을 조합해 사용할 경우 복수의 조건을 WHERE 구로 지정한다. 조합할 때는 AND, OR, NOT의 3가지 방법을 사용할 수 있다.

 

 

1. AND로 조합하기

복수의 조건을 조합할 경우 AND를 가장 많이 사용한다. AND는 논리 연산자의 하나로 좌우에 항목이 필요한 이항 연산자가 된다. 좌우의 식 모두 참일 경우 AND 연산자는 참을 반환한다. '모든 조건을 만족하는 경우 조건식을 참이 된다'라고 할 때 AND 연산자로 조건식을 조합한다. 

  • AND : 조건식1 AND 조건식2

sample24를 통해 AND를 사용해보자. sample24는 다음과 같다. 

SELECT * FROM sample24;

sample24 테이블에서 a열과 b열이 0이 아닌 행을 검색하는 경우를 생각해보자. a가 0이 아닌 조건은 'a<>0', b가 0이 아닌 조건은 'b<>0'이다. 이 두 조건은 AND로 조합한다. 

SELECT * FROM sample24 WHERE a<>0 AND b<>0;

a가 0이 아닌 행은 no가 1,4인 행이며, b가 0이 아닌 행은 no가 2,4,5인 행이다. a와 b 둘 다 0이 아닌 행은 no가 4인 행이다. 

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

 

 

2. OR로 조합하기

'어느 쪽이든 하나만 참이 되면 조건식을 참이 된다'라고 할 경우에는 OR로 조건식을 연결한다. OR 또한 논리 연산자의 하나로 좌우 항목이 모두 필요한 이항 연산자이다. AND와 달리 어느 쪽이든 조건을 만족하면 결과는 참이 된다. 모든 조건이 거짓을 경우 결과는 거짓이 된다. 즉  OR는 '또는'에 해당한다. 

  • OR : 조건식1 OR 조건식2

이번에는 'a<>0'과 'b<>0'을 OR로 연결해보자. 

SELECT * FROM sample24 WHERE a<>0 OR b<>0;

a가 0이 아닌 것은 no가 1,4인 행이며, b가 0이 아닌 것은 no가 2,4,5인 행이다. OR는 둘 중 하나만 참이 돼도 만족하므로 no가 1,2,4,5인 행이 출력된다. OR 연산은 조건을 만족하는 행을 집합으로 표현했을 때, 이 집합들을 합한 부분, 즉 합집합으로 계산할 수 있다. OR 연산자는 논리합을 계산하는 논리 연산자이다.

 

 

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

AND 연산자나 OR 연산자의 좌우로 참과 거짓을 반환하는 조건식을 지정하는 경우가 많다. 열이나 상수만을 지정해도 에러가 발생하지는 않지만 기대한 결괏값을 얻을 수 없다. 예를 들어 no 열의 값이 1 또는 2인 행을 추출하고 싶을 경우 다음과 같이 입력하면 원하는 결과를 얻을 수 없다.

SELECT * FROM sample24 WHERE no = 1 OR 2;

상수 2는 논리 연산으로 항상 참이 되기 때문에 결과적으로 모든 행을 반환하게 된다. 올바른 조건식을 다음과 같다.

SELECT * FROM sample24 WHERE no = 1 OR no = 2;

 

AND와 OR를 조합해 사용하기

AND와 OR를 사용해 'a<>0'을 사용했다. 0,1,2라는 3개의 값이 있다면 a<>0은 1이나 2의 경우 참이된다. 'a<>0' 대신 'a = 1 OR a = 2'를 사용해보자. 

SELECT * FROM sample24 WHERE a=1 OR a=2 AND b=1 OR b=2;

'SELECT * FROM sample24 WHERE a<>0 AND b<>0;' 결과와 다름을 알 수 있다. 왜 그럴까? 연산자의 우선순위가 다르기 때문이다.

 

연산자의 우선순위

결과가 다른 이유는 AND와 OR의 계산 우선순위가 다르기 때문이다. OR보다 AND가 우선순위가 높기 때문에 'a = 2 AND b = 1'이 먼저 계산된다. 이는 'WHERE a=1 OR (a=2 AND b=1) OR b=2'로 3개의 조건식이 OR로 연결된 것과 같다. 원하는 대로 조건을 지정하기 위해서는 다음과 같이 괄호로 우선순위를 변경하면 된다.

SELECT * FROM sample24 WHERE (a=1 OR a=2) AND (b=1 OR b=2);

일반적으로 OR 조건식은 괄호로 묶어 지정하는 경우가 많다. 조건이 잘못 지정되는 것을 미연에 방지할 수 있도록 괄호로 묶어 드는 습관을 들이는 것이 좋다.

 

 

4. NOT으로 조합

또 하나의 논리 연산자인 NOT에 대해 알아보자. 

  • NOT : NOT 조건식

NOT 연산자는 오른쪽에만 항목을 지정하는 단항 연산자이다. 오른쪽에 지정한 조건식의 반대 값을 반환한다. 만약 조건식이 참을 반환하면 이에 반하는 거짓을 반환한다. 다음을 사용해보자. 

SELECT * FROM sample24 WHERE NOT((a=1 OR a=2) AND (b=1 OR b=2));

앞선 문단의 조건에 NOT을 붙인 결과이다. no가 4인 행을 제외한 나머지 행들이 출력된다.

728x90
반응형

'Languages > SQL' 카테고리의 다른 글

[SQL] 9. 정렬 - ORDER BY  (0) 2021.05.08
[SQL] 8. 패턴 매칭에 의한 검색  (0) 2021.04.12
[SQL] 6. 검색 조건  (0) 2021.03.10
[SQL] 5. 테이블 구조 참조하기  (0) 2021.03.02
[SQL] 4. SELECT * FROM 테이블명  (0) 2021.02.22