MySQL에서의 위치 vs
오늘은 MySQL의 WHERE
절과 HAVING
절의 차이점에 대해 알아보겠습니다. 코드 예제를 통해 절을 개별적으로 이해하고 차이점을 강조하기 위해 표 형식으로 비교합니다.
MySQL의 ‘WHERE’ 대 ‘HAVING’
WHERE
및 HAVING
절은 매우 유사합니다. 이러한 절의 주요 차이점은 GROUP BY
와 함께 사용될 때 발생합니다.
집계된 데이터에는 WHERE
절을 사용할 수 없지만 HAVING
은 사용할 수 있습니다.
WHERE
는 그룹화 전에 레코드(행)를 필터링하지만 HAVING
절은 그룹화 후 레코드(행)를 제외한다고 말할 수 있습니다.
이 기사를 단계별로 계속하려면 테이블이 있어야 합니다.
따라서 ID
, Product
, MonthOfTransaction
및 AmountInUSD
라는 네 가지 속성을 포함하는 transactions
테이블을 만듭니다.
예제 코드:
#create a table
CREATE TABLE `ms20`.`transactions` (
`ID` INT NOT NULL AUTO_INCREMENT,
`Product` VARCHAR(45) NOT NULL,
`MonthOfTransaction` VARCHAR(20) NOT NULL,
`AmountInUSD` INT NOT NULL,
PRIMARY KEY (`ID`));
#insert data into a table
INSERT INTO ms20.transactions(Product, MonthOfTransaction, AmountInUSD) VALUES
('Air Conditioner', 'January', 500),
('Television', 'January', 600),
('Refrigerator', 'January', 550),
('Television', 'March', 600),
('Air Conditioner', 'March', 500),
('Juicer Machine', 'March', 200);
#select all data from the table
SELECT * FROM ms20.transactions;
출력:
MySQL의 WHERE
절
MySQL에서는 WHERE
절을 사용하여 레코드를 필터링하고 지정된 조건을 충족하는 행(레코드)만 추출합니다. SELECT
문과 UPDATE
, INSERT
및 DELETE
명령과 함께 사용할 수 있습니다.
WHERE
절은 JOIN
절을 사용하여 단일 또는 여러 테이블에서 레코드를 검색하는 동안 선택한 열에 배치된 특정 조건과 관련됩니다. WHERE
절에서 논리 연산을 수행할 수 있습니다(예: AND
, NOT
, OR
.
테이블(관계라고도 함)에서 정보를 검색하는 동안 true
여야 하는 부울 조건이라고 부를 수도 있습니다. 이러한 논리 연산자는 <
, >
, <=
, >=
, =
및 <>
를 비롯한 비교 연산자를 사용합니다.
예제 코드:
SELECT Product, sum(AmountInUSD) AS Total
FROM ms20.transactions
WHERE Product in ( 'Television', 'Refrigerator')
GROUP BY Product;
출력:
MySQL의 HAVING
절
MySQL에서 HAVING
절은 GROUP BY
절과 결합됩니다. 이 절을 사용하는 목적은 열 연산을 수행하고 주어진 조건에 따라 집계된 데이터 또는 그룹에 적용하는 것입니다.
HAVING
절은 특정 조건을 충족하는 그룹의 결과만 반환합니다. WHERE
및 HAVING
절이 함께 사용되는 경우 WHERE
는 개별 레코드(행)를 필터링합니다.
그런 다음 레코드(행)가 그룹화되고 집계 계산이 수행되며 마지막으로 HAVING
이 그룹을 필터링합니다. HAVING
절은 GROUP BY
절이 생성한 그룹의 상태를 확인합니다.
GROUP BY
절이 없으면 HAVING
절은 WHERE
절처럼 작동합니다.
HAVING
절과 SELECT
문을 결합하여 다양한 집계 함수를 사용할 수도 있습니다. 집계(그룹) 방법에는 SUM
, MAX
, MIN
, COUNT
및 AVG
가 포함됩니다.
HAVING
절과 함께 집계 함수를 쉽게 사용할 수 있지만 WHERE
절과 함께 사용하면 잘못된 그룹 함수 사용
오류가 발생합니다.
예제 코드(집계 함수 없음):
SELECT Product, sum(AmountInUSD) AS Total
FROM ms20.transactions
GROUP BY Product
HAVING Product in ('Television', 'Refrigerator');
출력:
예제 코드(집계 기능 포함):
SELECT Product, sum(AmountInUSD) AS Total
FROM ms20.transactions
GROUP BY Product
HAVING sum(AmountInUSD) > 800;
출력:
하나의 쿼리에 여러 절이 있는 경우 실행 순서를 아는 것이 중요합니다. F = FROM
, W = WHERE
, G = GROUP BY
, H = HAVING에서 실행 순서를 알기 위해
FWGHSOL 순서(
F에서 시작하여
L로 끝남)를 기억해야 합니다.
, S = SELECT
, O = ORDER BY
및 L = LIMIT
.
MySQL의 WHERE
절과 HAVING
절의 차이점
데이터를 조작하는 쿼리를 작성할 때 다음 사항을 고려해야 합니다.
WHERE 절 |
HAVING 조항 |
---|---|
행(레코드) 작업에서 구현됩니다. | 열(속성) 작업에서 구현됩니다. |
집계 계산 전에 개별 행에 대해 필터 작업을 수행합니다. | 집계(그룹) 데이터에 대해 필터 작업을 수행합니다. |
주어진 조건을 만족하는 특정 행에서 특정 데이터를 검색합니다. | 먼저 모든 데이터를 검색한 다음 지정된 조건에 따라 분리합니다. |
이 절에는 집계 메서드를 사용할 수 없습니다. | 이 절과 함께 집계 메서드를 쉽게 사용할 수 있습니다. |
사전 필터처럼 작동하며 GROUP BY 절 앞에 옵니다. |
포스트 필터처럼 작동하며 GROUP BY 절 뒤에 옵니다. |
DELETE , SELECT 및 UPDATE 문과 함께 사용할 수 있습니다. |
SELECT 문과만 사용할 수 있습니다. |