SQL에서 SELECT Query는 아래 순서로 수행된다.
FROM ➡️ WHERE ➡️ GROUP BY ➡️ HAVING ➡️ SELECT ➡️ ORDER BY
FROM
절에 명시된 테이블이 실제로 존재하는 테이블인지 확인한다. 그리고 SELECT
권한이 있는지도 체크한다. 만약 권한이 없는데 명령을 요청한 경우 semantic error
가 발생한다.
조건에 해당하는 로우(ROW)를 검색한다.
가져온 로우들을 어떤 방식으로 GROUB BY
(압축)할 것인지 체크한다.
💡 SELECT
절보다 먼저 실행되기 때문에 SELECT
절에서 지정한 Alias를 사용할 수 없다.
GROUP BY
한 로우 중에 버려야할 데이터들이 있는지 체크한다.
가져온 로우들 중에 어떤 컬럼들을 출력해야 할지를 체크한다.
💡 일단 로우를 가져오고 난 다음에 SELECT
절을 체크하기 때문에 SELECT * FROM
한 것과 컬럼 1개만 SELECT
하는 것과 I/O 비용은 사실상 같다.
SELECT
절보다 나중에 실행되기 때문에 SELECT
절에서 지정한 Alias를 사용할 수 있다.
데이터베이스의 데이터는 블록 단위로 저장된다. 블록에는 테이블의 데이터들이 로우 단위로 저장되어 있다. 따라서 데이터를 가져올 때에도 로우 단위로 가져오기 때문에 SELECT
절에 전체 컬럼을 지정하는 것과 일부 컬럼의 지정하는 것은 I/O 비용 측면에서 차이가 없다.
https://qxf2.com/blog/mysql-query-execution/
https://youtu.be/eeq0wDl3bLs