[MySQL] 3.3 데이터 필터링 - OR


http://www.mysqltutorial.org 내용을 따라 익히며 정리한 글입니다. 예시에 나오는 데이터셋은 MySQL 샘플 데이터셋인 classicmodels DB입니다.


1. 연산자 OR 소개

논리 연산자 OR 는 두 개의 불리언 값을 받아 하나라도 True 이면 True 를 리턴한다.

2. OR short-circuit evaluation

SELECT 1 = 1 OR 1 / 0 ;
+------------+
| 1=1 or 1/0 |
+------------+
| 1 |
+------------+
1 row in set (0.00 sec)

위 예에서 1 = 1TRUE 를 리턴한다. Short Circuit Evaluation에 따라 1 / 0 연산은 하지 않는다. 만약 연산을 했다면 division by zero 에러가 떴을 것이다.

3. 연산자 우선순위

연산자 우선 순위(Operator precedence)란 두 개 이상의 논리 연산자를 사용할 경우 어떤 논리 연산자를 먼저 평가할지 판단하는 기준을 말한다. 우선 순위가 더 높은 연산자를 먼저 평가하게 되는데, 예를 들어 ANDOR가 함께 있다면 AND 를 먼저 보고 그 뒤에 OR 를 평가한다.

3.1

SELECT true OR false AND false;
+-------------------------+
| true or false and false |
+-------------------------+
| 1 |
+-------------------------+
1 row in set (0.00 sec)
  1. false AND false 를 먼저 평가한다. false 를 리턴.
  2. 다음으로 true OR false 를 평가한다. true 를 리턴.

3.2

SELECT (true OR false) AND false;
  1. 괄호가 쳐진 true OR false 를 먼저 평가한다. true 를 리턴.
  2. 다음으로 true AND false 를 평가한다. false 를 리턴.

4. OR 예시

4.1

USA와 France에 있는 고객들의 이름, 국가를 뽑아내고 싶을 경우 다음과 같이 쿼리를 작성한다.

SELECT
customername, country
FROM
customers
WHERE
country = 'USA' OR country = 'France'
LIMIT 10;
+------------------------------+---------+
| customername | country |
+------------------------------+---------+
| Atelier graphique | France |
| Signal Gift Stores | USA |
| La Rochelle Gifts | France |
| Mini Gifts Distributors Ltd. | USA |
| Mini Wheels Co. | USA |
| Land of Toys Inc. | USA |
| Saveley & Henriot, Co. | France |
| Muscle Machine Inc | USA |
| Diecast Classics Inc. | USA |
| Technics Stores Inc. | USA |
+------------------------------+---------+
10 rows in set (0.00 sec)

4.2

USA와 France에 있는 고객들 중 신용한도가 10만 이상인 고객들의 이름, 국가를 뽑아내고 싶을 경우 다음과 같이 쿼리를 작성한다. AND 가 먼저 계산되지 않도록 OR 를 괄호로 묶어줘야 함에 주의한다.

SELECT
customername, country, creditLimit
FROM
customers
WHERE
(country = 'USA' OR country = 'France')
AND creditlimit > 100000
LIMIT 8;
+------------------------------+---------+-------------+
| customername | country | creditLimit |
+------------------------------+---------+-------------+
| La Rochelle Gifts | France | 118200.00 |
| Mini Gifts Distributors Ltd. | USA | 210500.00 |
| Land of Toys Inc. | USA | 114900.00 |
| Saveley & Henriot, Co. | France | 123900.00 |
| Muscle Machine Inc | USA | 138500.00 |
| Diecast Classics Inc. | USA | 100600.00 |
| Collectable Mini Designs Co. | USA | 105000.00 |
| Marta's Replicas Co. | USA | 123700.00 |
+------------------------------+---------+-------------+
8 rows in set (0.00 sec)

4.3

위 4.2의 예에서 OR 를 괄호로 묶어주지 않으면 AND 가 먼저 계산되면서 아래와 같이 미국 고객에 신용 한도 조건이 붙지 않은 결과가 발생한다.

SELECT
customername, country, creditLimit
FROM
customers
WHERE
country = 'USA' OR country = 'France' AND creditlimit > 100000
LIMIT 8;
+------------------------------+---------+-------------+
| customername | country | creditLimit |
+------------------------------+---------+-------------+
| Signal Gift Stores | USA | 71800.00 |
| La Rochelle Gifts | France | 118200.00 |
| Mini Gifts Distributors Ltd. | USA | 210500.00 |
| Mini Wheels Co. | USA | 64600.00 |
| Land of Toys Inc. | USA | 114900.00 |
| Saveley & Henriot, Co. | France | 123900.00 |
| Muscle Machine Inc | USA | 138500.00 |
| Diecast Classics Inc. | USA | 100600.00 |
+------------------------------+---------+-------------+
8 rows in set (0.00 sec)
© 2019 THE DATASCIENTIST All Rights Reserved.
Theme by hiero