본문 바로가기
Back-end/DB

[MySQL] 고급 데이터 필터링 - 연산자 사용

by 며루치꽃 2021. 5. 24.

전문적인 정보를 다루는 것이 아닌 개인적으로 학습한 내용에 대해

포스팅을 했기 때문에 이점을 감안하여 봐주시면 감사하겠습니다👏

 

AND 연산자 사용하기

 

WHERE 절에는 AND나 OR를 사용하여 여러 개의 조건을 지정할 수 있는데 이를 이용하여 다양한 필터링 제어가 가능하다. 

 

SELECT vend_id, prod_id, prod_price, prod_name
FROM products;

 

위의 쿼리문에 WHERE 조건에 연산자를 이용하여 필터링 할 수 있다. 

 

SELECT vend_id, prod_id, prod_price, prod_name
FROM products
WHERE vend_id = 'DLL01' AND prod_price <= 4;

이 쿼리는 vend_id가 DLL01이고 prod_price 이하인 제품의 vend_id, prod_id, prod_price, prod_name 를 가져오는 것이다.

 

AND 연산자

지정된 조건을 모두 충족하는 행을 가져오도록 WHERE 절에서 사용하는 키워드이다.

 

OR 연산자 사용하기

OR 연산자는 AND 연산자와 정반대로 동작한다. OR은 DBMS에 지정된 조건을 하나라도 만족하는 행을 가져오도록 지시한다.

 

OR 연산자OR은 지정된 조건을 하나라도 만족하는 행을 가져오도록 WHERE 절에서 사용한다.

SELECT vend_id, prod_id, prod_price, prod_name
FROM products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';

이 쿼리는 vend_id가 'DLL01' 또는 vend_id = 'BRS01' 인 제품의 vend_id, prod_id, prod_price, prod_name 를 가져오는 것이다.

 

우선순위 이해하기

WHERE 절은 수에 제한 없이 AND와 OR 연산자를 가질 수 있다. 하지만, AND와 OR 연산자를 조합하여 사용할 때 문제가 생길 수 있다. 예를 들어 가격이 10달러 이면서 vend_id가 vend_id가 'DLL01' 또는 vend_id = 'BRS01' 인 제품을 모두 검색하고 싶다고 다음과 같이 쿼리를 만들면 결과는 아래와 같다.

SELECT prod_name, prod_price
FROM products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01'
    AND prod_price >= 10;

반환된 행중 4개의 가격이 10달러보다 작은 것을 보면 의도대로 필터링이 되지 않은 것을 알 수 있다. 이는 연산자 우선순위 때문이다.

 

SQL은 다른 언어처럼 연산자 우선순위가 있는데 OR 연산자 전에 AND 연산자를 먼저 처리한다. SQL이 위와 같은 WHERE 절을 만나면, 판매처가 BRS01 이면서 10달러 이상인 제품과 가격에 관계없이 판매처가 DLL01인 제품을 함께 가져온다. 

 

이러한 문제는 괄호를 이용하여 관련 있는 연산자를 묶는 방법으로 풀 수 있다.

SELECT prod_name, prod_price
FROM products
WHERE (vend_id = 'DLL01' OR vend_id = 'BRS01')
    AND prod_price >= 10;

괄호가 AND나 OR연산자보다 운선순위가 더 높기 때문에, DBMS는 괄호 안에 있는 OR 연산자를 먼저 필터링 한다. 

그러면 의도대로 가격이 10달러 이면서 vend_id가 vend_id가 'DLL01' 또는 vend_id = 'BRS01' 인 제품을 모두 검색을 할 수 있다.

 

IN 연산자 사용하기 

 

IN 연산자는 조건의 범위를 지정할 때 사용한다. IN 연산자의 괄호 안에는 조건이 나열되는데, 각 조건은 콤마로 구분된다.

SELECT vend_id, prod_id, prod_price, prod_name
FROM products
WHERE vend_id IN ('DLL01', 'BRS01')
ORDER BY prod_name;

이 쿼리는 vend_id가 DLL01 또는 BRS01인 제품 목록을 가져온다. IN 연산자 다음에는 콤마로 구분된 목록이 나오는데, 이 목록은 모두 괄호 안에 있어야한다. 

 

IN 연산자

WHERE 절에서 값의 목록을 지정하는 키워드로, 각각의 값을 OR로 연달아 비교하는 것과 같은 효과를 준다

 

IN 연산자는 OR과 같은 일을 수행하는데 IN을 사용하는 이유는 다음과 장점이 있기 때문이다.

 

IN연산자의 장점

1. 조건이 많을 때는 IN 연산자 문법이 OR 보다 훨씬 깔끔하고 읽기 편하다2. AND나 OR 연산자와 함께 사용할 때 연산자 우선순위를 관리하기 편하다3. IN 연산자는 OR 연산자가 목록을 처리하는 것보다 속도가 빠르다4. IN 연산자의 가장 큰 장점은 SELECT 문을 포함할 수 있다는 점이다. 이를 이용해 매우 동적인 WHERE 절을 만들 수 있다

 

NOT 연산자 사용하기

 

WHERE 절의 NOT 연산자는 뒤에 오는 조건을 역으로 만든다. NOT은 단독으로 사용할 수 없기 때문에 필터링하려는 열 뒤가 아니라 앞에 적는다. 

SELECT vend_id, prod_id, prod_price, prod_name
FROM products
WHERE NOT vend_id = 'DLL01'
ORDER BY prod_name;

NOT 연산자

WHERE 절에서 조건을 부정하기 위해 사용하는 키워드

 

NOT은 다음에 나오는 조건을 부정한다. 그래서 vend_id가 DLL01이 아닌 제품을 가져온다. 

댓글