음.. 이번에는 쿼리를 짤때 자주 사용되는 AND / OR 논리 연산에 대한 우선 순위에 대해 작성해보려고 합니다.
많은 분들이 잘 알고 계시겠지만 이 우선순위에 의해서 원하는 결과 값이 아닌 다른 값이 나올수 있다는 점!!!
AND / OR ?
- AND: 두 조건이 모두 참인 레코드를 검색
- OR : 두 조건중 하나라도 참인 레코드
예제
쿼리를 통해 AND / OR 연산자의 우선 순위를 보겠습니다.
1. 2페이지에 해당하는 데이터중 Title에 'Test'가 포함된 데이터
select * from (
select
rownum rn, bro, title, wirter
from board
where title like '%Test%' and rownum < =20
) A
where rn > 10;
2. title 이나 content 중에 'Test'라는 문자열이 있는 게시글
select
*
from
( select
rownum rn, bro, title, wirter
from board
where title like '%Test%' or content like '%Test%' and rownum <= 20
)
where rn > 10;
- 위의 구문을 보면 구문자체는 문제가 없지만 실제로 동작시켜보면 10개의 데이터가 아닌 많은 양이 데이터가 출력된다.
- 이유는 AND / OR의 연산자 우선순위에따라 실제로 실행될떄 아래와 같은 조건으로 실행이된다.
- “ROWNUM이 20보다 작거나 같으면서(AND) + Content가 ‘Test’이거나(OR) + Title이 ‘Test’라는 문자열이 있는 게시글
where title like '%Test%' or content like '%Test%' and rownum <= 20
##연산자 우선순위에 따라 아래처럼 구문이 실행된다.
where rownum <=20 and title like '%Test%' or content like '%Test%'
해결책
괄호( ) 를 사용하여 우선순이를 명확하게 해주자.
where ( title like '%Test%' or content like '%Test%' )
and rownum <= 20