MySQL에서 SELECT 문으로 계산된 값에 별칭(Alias)을 붙인 후, 그 별칭을 기준으로 결과를 필터링하고 싶은 경우가 있습니다. 이때 WHERE 절 대신 HAVING 절을 사용하면 됩니다.
WHERE 절은 별칭을 인식하지 못하기 때문에, 집계되거나 계산된 컬럼의 별칭으로 조건을 걸 때는 반드시 HAVING 절을 활용해야 합니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable755 (
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Score1 int,
Score2 int
);
Query OK, 0 rows affected (0.62 sec)2. 샘플 데이터 삽입하기
INSERT 명령어를 사용해 테이블에 여러 개의 레코드를 추가합니다.
mysql> insert into DemoTable755(Score1,Score2) values(30,23); Query OK, 1 row affected (0.18 sec) mysql> insert into DemoTable755(Score1,Score2) values(50,60); Query OK, 1 row affected (0.13 sec) mysql> insert into DemoTable755(Score1,Score2) values(89,90); Query OK, 1 row affected (0.29 sec) mysql> insert into DemoTable755(Score1,Score2) values(99,99); Query OK, 1 row affected (0.18 sec) mysql> insert into DemoTable755(Score1,Score2) values(40,43); Query OK, 1 row affected (0.14 sec)
3. 전체 레코드 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable755;
위 쿼리는 다음과 같은 결과를 출력합니다.
+----+--------+--------+ | Id | Score1 | Score2 | +----+--------+--------+ | 1 | 30 | 23 | | 2 | 50 | 60 | | 3 | 89 | 90 | | 4 | 99 | 99 | | 5 | 40 | 43 | +----+--------+--------+ 5 rows in set (0.00 sec)
4. 별칭을 활용한 필터링 쿼리
다음은 MySQL에서 별칭을 기준으로 필터링을 수행하는 쿼리입니다. Score1과 Score2를 더한 값을 Result라는 별칭으로 지정하고, HAVING 절을 사용해 그 값이 83인 레코드만 조회합니다.
mysql> select Score1+Score2 AS Result,DemoTable755.* from DemoTable755 having Result=83;
실행 결과는 다음과 같습니다.
+--------+----+--------+--------+ | Result | Id | Score1 | Score2 | +--------+----+--------+--------+ | 83 | 5 | 40 | 43 | +--------+----+--------+--------+ 1 row in set (0.00 sec)
핵심 정리
Score1(40) + Score2(43) = 83이므로, 조건에 일치하는 5번 레코드만 반환되었습니다. 이처럼 HAVING 절에 별칭을 사용하면 계산된 결과값을 기준으로 손쉽게 필터링할 수 있습니다. 다만 HAVING 절은 내부적으로 임시 테이블을 생성하기 때문에 대량의 데이터를 다룰 때는 성능에 유의하는 것이 좋습니다.