MySQL의 SELECT 쿼리 실행 순서는?
MySQL의 SELECT 쿼리 실행 순서는 다음과 같습니다.
- FROM
- WHERE/JOIN
- GROUP BY
- HAVING
- SELECT
- DISTINCT
- ORDER BY
- LIMIT
예제를 통해 확인해보겠습니다.
실행 순서 확인
실행 순서를 확인할 예제 쿼리입니다.
# 인구가 50만명 이상인 도시를 2개 이상 보유한 국가 상위 2건 조회
select
c.name, count(1) as total_cities
from
world.city_population cp
left join world.country c on c.Code = cp.country_code
where
cp.population >= 500000
group by
cp.country_code
having
count(1) > 1
order by
total_cities desc
limit 2;
위 쿼리의 실행 순서는 다음과 같습니다.
1. FROM
from 절에 있는 city_population 테이블의 데이터를 가져옵니다.
2. WHERE, JOIN
WHERE 절과 JOIN 절의 순서는 MySQL의 최적화 방식과 인덱스 여부 및 테이블 크기에 따라 달라질 수 있습니다.
일반적으로는 JOIN 절이 먼저 수행되며, WHERE 절에 사용된 컬럼에 인덱스가 있는 경우 WHERE 절이 먼저 수행된다고 합니다.
- WHERE 먼저 실행 시
1) population >= 500000 조건에 의해 인구가 50만명 이상인 도시만 필터링됩니다.
2) 필터링된 city_population 데이터 기준으로 country 테이블과 left join을 수행합니다.
- JOIN 먼저 실행 시
1) city_population 전체 데이터 기준으로 country 테이블과 left join을 수행합니다.
2) join된 데이터 기준으로 where 절의 조건을 적용합니다.
3. GROUP BY
city_population 테이블의 country_code 기준으로 도시 개수를 그룹화 합니다.
group by 실행 결과 각 국가별로 도시가 그룹화됩니다.
4. HAVING
그룹화된 데이터에서 count(1) > 1 조건을 만족하는 국가만 선택합니다.
HAVING은 그룹화된 데이터에 대한 필터링을 적용하기 때문에 WHERE보다 나중에 실행됩니다.
5. SELECT 컬럼 선택
최종적으로 필요한 컬럼을 선택합니다.
위 예제 쿼리에서는 country 테이블의 name 컬럼과 count(1) 함수의 실행 결과를 사용합니다.
6. ORDER BY
order by total_cities 절에 의해 도시 개수의 내림차순으로 정렬합니다.
order by 이전에 select가 먼저 실행되었기 때문에 order by 절에서 실제로 테이블에 존재하지 않는 total_cities를 정렬 컬럼으로 사용할 수 있습니다.
7. LIMIT
limit 2에 의해 데이터 중 2건만 조회됩니다.