본문 바로가기
Database/Oracle

[Oracle SQL] WHERE절 - 논리 연산자 (AND, OR, NOT)

by Amy IT 2022. 5. 8.

WHERE절에 부여할 조건이 여러 개인 경우 논리 연산자를 사용할 수 있습니다. 

 

연산자 설명
AND 두 가지 조건을 모두 만족하는 데이터 검색
OR 두 가지 조건 중 한 가지만 만족하더라도 검색
NOT 지정된 조건이 아닌 데이터 검색

 

직업이 SALESMAN이면서 월급이 1500 이상인 사람을 출력합니다.

SELECT empno, ename, job, sal FROM emp WHERE job='SALESMAN' AND sal>=1500;

 

직업이 SALESMAN이거나 월급이 1500 이상인 사람을 출력합니다.

SELECT empno, ename, job, sal FROM emp WHERE job='SALESMAN' OR sal>=1500;

 

이름이 SMITH가 아닌 사람을 출력합니다. NOT 연산자는 != 와 같은 의미를 가집니다. 

SELECT empno, ename FROM emp WHERE NOT ename='SMITH';
SELECT empno, ename FROM emp WHERE ename!='SMITH';

 

사원번호가 7698 또는 7839 또는 7902가 아닌 사람을 출력합니다.

SELECT empno, ename FROM emp WHERE empno NOT IN (7698,7839,7902);

 

이름이 J로 시작하지 않는 사람을 출력합니다.

SELECT empno, ename FROM emp WHERE ename NOT LIKE 'J%';

 

이처럼 NOT 연산자는 컬럼명 앞에 올 수도 있고, BETWEEN, IN, LIKE과 같은 연산자 앞에 올 수도 있습니다. 

 

논리 연산자를 사용할 때 주의할 점은 연산자가 처리되는 우선순위가 있다는 점입니다. 연산자의 우선순위는 다음과 같습니다.

 

연산자 우선순위 설명
1 괄호( )
2 NOT 연산자
3 비교 연산자
4 AND 연산자
5 OR 연산자

 

이 때문에 논리 연산자를 여러 개 사용할 경우 괄호를 적절히 활용하는 것이 중요합니다. 다음은 괄호를 사용하지 않아 결과값이 잘못 출력되는 예시입니다.

 

직업이 CLERK이거나 ANALYST이면서, comm이 null이고 sal이 1000 이상 3000 이하인 사람을 찾고자 합니다. 

SELECT ename, job, sal, comm FROM emp
WHERE job='CLERK' OR job='ANALYST'
AND comm IS NULL 
AND sal>=1000 AND sal<=3000;

 

출력된 값을 보면 원하던 조건식이 적용되지 않았음을 확인할 수 있습니다. CLERK에는 AND 연산자 뒤의 조건식이 적용되지 않았습니다. 즉 괄호가 누락되어 OR 연산자보다 AND 연산자가 먼저 실행된 것입니다. 결과적으로 위의 SQL문은 직업이 CLERK이거나, ANALYST이면서 comm이 null 이면서 sal이 1000 이상 3000 이하인 사람을 찾은 것입니다. 이를 다음과 같이 바꿔봅니다.

SELECT ename, job, sal, comm FROM emp
WHERE (job='CLERK' OR job='ANALYST')
AND comm IS NULL 
AND sal>=1000 AND sal<=3000;

 

의도한 대로 결과가 출력되었습니다. 이처럼 논리 연산자가 여러 개 사용되었을 때는 먼저 실행되어야 할 것을 괄호로 묶어주는 것이 필요합니다. 연산자 우선순위를 반드시 외우지 않아도 괄호를 적절히 활용한다면 결과값이 잘못 출력되는 것을 방지할 수 있습니다.

 

 

지금까지 WHERE절의 기본 문법과 활용법에 대해 알아보았습니다. 

 

 

댓글