[MySQL] 3.4 데이터 필터링 - IN


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


1. 연산자 IN 소개

IN 연산자를 사용하면 WHERE 절의 조건을 덕지덕지 붙일 필요 없이 값들의 집합이나 서브쿼리에서 반환된 값들 중 지정된 값과 일치하는 데이터를 보다 간편하게 불러올 수 있다. 예시를 보자.

2. IN 예시

2-1.

offices 테이블에서 미국과 프랑스 내 사무실들의 오피스코드, 도시, 전화번호, 국가를 반환하는 쿼리문을 작성하라.(IN을 사용하지 않고 작성)

SELECT
officeCode,
city,
phone
FROM
offices
WHERE
country = 'USA' OR country = 'France';

+------------+---------------+-----------------+---------+
| officecode | city | phone | country |
+------------+---------------+-----------------+---------+
| 1 | San Francisco | +1 650 219 4782 | USA |
| 2 | Boston | +1 215 837 0825 | USA |
| 3 | NYC | +1 212 555 3000 | USA |
| 4 | Paris | +33 14 723 4404 | France |
+------------+---------------+-----------------+---------+
4 rows in set (0.00 sec)

2-2.

offices 테이블에서 미국과 프랑스 내 사무실들의 오피스코드, 도시, 전화번호, 국가를 반환하는 쿼리문을 작성하라.(IN을 사용해 작성)

SELECT
officeCode,
city,
phone,
country
FROM
offices
WHERE
country IN ('USA' , 'France');
+------------+---------------+-----------------+---------+
| officecode | city | phone | country |
+------------+---------------+-----------------+---------+
| 1 | San Francisco | +1 650 219 4782 | USA |
| 2 | Boston | +1 215 837 0825 | USA |
| 3 | NYC | +1 212 555 3000 | USA |
| 4 | Paris | +33 14 723 4404 | France |
+------------+---------------+-----------------+---------+
4 rows in set (0.00 sec)

2-3.

offices 테이블에서 미국과 프랑스가 아닌 다른 나라 사무실들의 오피스코드, 도시, 전화번호, 국가를 반환하는 쿼리문을 작성하라.(IN을 사용해 작성)

SELECT
officeCode,
city,
phone,
country
FROM
offices
WHERE
country NOT IN ('USA' , 'France');
+------------+--------+------------------+-----------+
| officeCode | city | phone | country |
+------------+--------+------------------+-----------+
| 5 | Tokyo | +81 33 224 5000 | Japan |
| 6 | Sydney | +61 2 9264 2451 | Australia |
| 7 | London | +44 20 7877 2041 | UK |
+------------+--------+------------------+-----------+
3 rows in set (0.00 sec)

3. 서브쿼리와 IN

IN 연산자는 서브쿼리와 함께 사용되곤 한다.
하나 이상의 테이블에서 값 목록을 가져와 IN 연산자의 입력 값으로 서브쿼리를 사용합니다.

3-1.

ordersorderDetails 테이블에서 주문액 60000 이상인 주문의 주문번호, 고객번호, 상태, 선적일을 가져오는 쿼리를 작성하라.

이 문제는 다음처럼 두 단계로 풀 수 있다.

  1. 먼저 GROUP BYHAVING 을 사용해 주문액이 60000 이상인 주문번호를 반환하는 쿼리를 작성한다.
SELECT
orderNumber
FROM
orderdetails
GROUP BY
orderNumber
HAVING
SUM(quantityOrdered * priceEach) > 60000;
+-------------+
| orderNumber |
+-------------+
| 10165 |
| 10287 |
| 10310 |
+-------------+
3 rows in set (0.01 sec)
  1. 위에서 알아낸 주문번호를 IN 연산자에 입력해 orders 테이블에서 필요한 데이터를 가져온다.
SELECT
orderNumber,
customerNumber,
status,
shippedDate
FROM
orders
WHERE
orderNumber IN (10165,10287,10310);
+-------------+----------------+---------+-------------+
| orderNumber | customerNumber | status | shippedDate |
+-------------+----------------+---------+-------------+
| 10165 | 148 | Shipped | 2003-12-26 |
| 10287 | 298 | Shipped | 2004-09-01 |
| 10310 | 259 | Shipped | 2004-10-18 |
+-------------+----------------+---------+-------------+
3 rows in set (0.00 sec)

3-2.

위 풀이에서의 두 쿼리를 합치면 아래와 같이 쓸 수 있다.

SELECT
orderNumber,
customerNumber,
status,
shippedDate
FROM
orders
WHERE
orderNumber IN (SELECT orderNumber
FROM orderdetails
GROUP BY orderNumber
HAVING SUM(quantityOrdered * priceEach) > 60000);
+-------------+----------------+---------+-------------+
| orderNumber | customerNumber | status | shippedDate |
+-------------+----------------+---------+-------------+
| 10165 | 148 | Shipped | 2003-12-26 |
| 10287 | 298 | Shipped | 2004-09-01 |
| 10310 | 259 | Shipped | 2004-10-18 |
+-------------+----------------+---------+-------------+
3 rows in set (0.00 sec)
© 2019 THE DATASCIENTIST All Rights Reserved.
Theme by hiero