본문 바로가기
DataBase/개념

select 문 실행순서와 처리 과정

by 깐니 2022. 1. 24.
  • select 문 실행순서
  • group by 와 having 절에서의 주의사항
  • 조건절 : having 절과 where 절의 차이
  • where절에서의 alias 사용은 ‘Invalid Identifier’ 에러를 발생시킨다.

select 문 실행순서

SQL 문은 비절차적인 언어지만, 내부적으로 DBMS에 의해 실행 순서를 가진다.

SELECT
    [ ALL | DISTICT ]
    [ TABLE NAME.]{ * | 속성이름 [[AS] 별칭]}
FROM
    { 테이블이름 [[AS] 별칭]}
    [ INNER JOIN | LEFT OUTER JOIN | RIGHT OUTER JOIN { 테이블 이름 }
        ON 검색조건 ]
WHERE
    검색조건
GROUP BY
    속성이름,..
HAVING
    검색조건
[ 질의 UNION 질의 | 질의 UNION ALL 질의 ]
[ ORDER BY 속성 { ASC | DESC },,  ]

실행순서는 다음과 같다.

 

(1) FROM 절 : 전체 데이블의 결과를 가져온다.

(2) ON

(3) JOIN

(4) WHERE 절 : (1)-(3)에서 읽어온 테이블에서 조건에 맞는 결과만 추출한다.

(5) GROUP BY 절 : (4)의 데이터를 선택한 컬럼으로 GROUPING한 작업의 결과를 추출한다.

(6) HAVING 절 : (5) 의 그룹화된 데이터에서 조건에 맞는 결과만 다시 추출한다.

(7) SELECT 절 : (5)-(6) 데이터에서 출력할 열을 선택한다.

(8) DISTINCT 절

(9) ORDER BY 절 : (4)의 데이터를 정렬한다.

 

 

group by 와 having 절에서의 주의사항

group by 로 속성을 그룹으로 묶은 후, select 절에는 group by 에서 사용한 속성과 집계함수만 나올 수 있다.

having 절은 group by 절의 결과 나타나는 그룹을 제한하는 역할을 하기때문에 반드시 group by 와 같이 작성해야하고, where 절보다 뒤에 나와야 한다.

having 절의 검색조건은 집계함수만 나올 수 있다.

  • 집계함수 : sum, avg, min, max, count

 

 

조건절 : having 절과 where 절의 차이

  • 같은 결과를 가져오는 쿼리이지만, 조건문을 어디에서 처리하느냐에 따라 성능 속도 차이가 나게 된다.

아래와 같은 movie 데이터가 있다.

이때 type이 action인 데이터의 갯수를 추출하고자 한다.

-- having 절 사용시
SELECT 
	type
	, count(type) as cnt
FROM movie
GROUP BY type
HAVING type = 'action';

-- where 절 사용시
SELECT 
	type
	, count(type) as cnt
FROM MOVIE
WHERE type = 'action'
GROUP BY type;

having 절에서 조건을 처리한 경우, 실행순서를 보자.

from 절에서 movie 테이블 전체데이터를 가져온 후,

group by 절에서 type = ‘action’ 인 데이터를 grouping 하는 과정에서 전체 데이터를 그룹핑 처리한 이후 , having 절에서 조건을 처리해야한다.

반면, where 절에서 조건을 처리한 경우의 실행순서를 보자.

from 절에서 movie 테이블 전체데이터를 가져온 후,

where 절에서 type = ‘action’인 데이터를 추출한다.

추출한 4건의 데이터를 type으로 grouping 한 후, select 절에서 추출한다.

따라서 쿼리의 실행순서로 인해 일반 조건을 처리하는 경우, where 절에서 처리하는 방법이 효율적이다.

조건처리를 having 절에서 처리하는 방법과 where 절에서 하는 방법에 대한 성능 속도 차이가 나게 되므로 주의해서 사용해야한다.

  • where절은 모든 필드에 대한 조건문을 작성할 수 있지만, having절은 group by 절로 그룹화 된 데이터에 대한 조건문만을 작성할 수 있다.
  • 반면, where 절은 group by 절이 실행되기 전에 실행되므로, 집계함수와 함께 사용할 수 없다.

 

 

where절에서의 alias 사용은 ‘Invalid Identifier’ 에러를 발생시킨다.

where 절에서 alias를 사용하면, ‘Invalid Identifier’ 에러가 발생한다.

이유는, select 절은 where 절 이후에 실행되기 때문에 where 이 실행된때는 해당 alias를 가진 컬럼이 아직 존재하지 않기 때문이다.

따라서, where 절에서의 alias를 이용한 조건문은 문법에 맞지않다.

반면 같은 이유로, select 절 이후 실행되는 order by 절에서는 alias 를 사용해도 문제가 없다.