개요
Python에는 여러 데이터에 대한 참, 거짓을 판단할 때 사용할 수 있는 all, any 함수가 존재한다.
참고 : 2022.10.08 - [Python] any/all - 여러 요소의 참/거짓 확인
비슷한 방식으로 MySQL에서 SQL을 이용해 그룹 별 여러 데이터에 대한 참, 거짓을 판단하고 싶다.
방법을 알아보자. 참고로 Subquery로 제공되는 ALL, ANY가 아니다.
예시 테이블
| month | day | amount |
| ----- | --- | ------ |
| 1 | 3 | 9000 |
| 1 | 5 | 8000 |
| 3 | 15 | 20000 |
| 6 | 14 | 110123 |
| 6 | 18 | 3000 |
| 12 | 20 | 101000 |
| 12 | 25 | 123456 |
몇 월 며칠에 판매된 양에 대한 데이터가 저장된 sales 테이블이 있다고 하자.
DDL
더보기
CREATE TABLE sales (
month int,
day int,
amount int
);
INSERT INTO sales VALUES
(1,3,9000),
(1,5,8000),
(3,15,20000),
(6,14,110123),
(6,18,3000),
(12, 20, 101000),
(12, 25, 123456);
ANY
예로 들어 달마다 판매량이 10000 초과한 날이 하루라도 있는지 확인하고 싶다.
이런 경우, SUM(조건문) > 0으로 조회하면 된다. 0이면 False, 1이면 True에 해당한다. 예시 테이블의 경우 3월, 6월, 12월에 True로 나와야 한다.
SELECT month, SUM(amount > 10000) > 0
FROM sales
GROUP BY month
;
| month | SUM(amount > 10000) > 0 |
| ----- | ----------------------- |
| 1 | 0 |
| 3 | 1 |
| 6 | 1 |
| 12 | 1 |
또는 bit_or(조건문)를 사용할 수 있다.
SELECT month, bit_or(amount > 10000)
FROM sales
GROUP BY month
;
| month | bit_or(amount > 10000) |
| ----- | ---------------------- |
| 1 | 0 |
| 3 | 1 |
| 6 | 1 |
| 12 | 1 |
ALL
반대로 이번에는 매 달의 모든 날의 판매량이 10000 초과인지 확인하고 싶다.
이런 경우 조건을 위반하는 행의 수를 세고, 그 수가 0인지를 확인하면 된다. SUM(NOT(조건문)) = 0 형식으로 조회한다. 예시 테이블의 경우, 3월과 12월에 True로 나와야 한다.
SELECT month, SUM(NOT(amount > 10000)) = 0
FROM sales
GROUP BY month
;
| month | SUM(NOT(amount > 10000)) = 0 |
| ----- | ---------------------------- |
| 1 | 0 |
| 3 | 1 |
| 6 | 0 |
| 12 | 1 |
또는 bit_and(조건문)을 사용할 수 있다.
SELECT month, bit_and(amount > 10000)
FROM sales
GROUP BY month
;
| month | bit_and(amount > 10000) |
| ----- | ----------------------- |
| 1 | 0 |
| 3 | 1 |
| 6 | 0 |
| 12 | 1 |
참고 문서
https://dev.mysql.com/blog-archive/using-the-aggregate-functions-any-some-every-with-mysql/