Mariadb에서 ORDER BY는 SELECT 이후에 실행된다.
그런데 ORDER BY의 기준 컬럼을 SELECT에 포함되지 않은 컬럼을 사용해도 될까?
답은 DISTINCT 절이 아니면 된다 이다.
If DISTINCT is specified, the expression in the ORDER BY clause have access only to the virtual table returned by the previous step (VT5)
If DISTINCT is not specified expressions in the ORDER BY clause can access both the input and the output virtual tables of the SELECT phase.
MariaDB에서는 각 명령문이 끝나면 그 결과값을 저장하는 Virtual Table이 생성되어 전달된다. 이는 SELECT문에서도 마찬가지이며, SELECT의 결과값이 ORDER 절에 전달된다.
그런데 만약 ORDER 컬럼이 SELECT 절에 존재하지 않더라도,
MaraiDB는 SELECT 절의 resultSet에 다음 단계에 필요한 ORDER 컬럼을 추가한다.
이로 인해 다음 단계인 ORDER 절에서 해당 컬럼을 이용하여 정렬할 수 있는 것이다.
docs says that each step of logical processing generates virtual table that is used as the input to the next step
그런데 DINSTNCT 절은 왜 되지 않는다는 걸까?
DISTINCT는 SELECT에 포함된 모든 절을 기준으로 유일성을 검사하는데, ORDER BY 를 위해 기준컬럼에 접근할 때 SELECT 문에 존재하지 않으면 기준컬럼에 접근이 어려운 것 같다.
위에서 ORDER BY 의 specifed(기준) column이 select 문에 포함되는데 왜 그런걸까?
사실 그 답을 찾진 못했는데, 그냥 추측을 해 보자면 아래와 같은 경우 specified를 포함하면 DISTINCT한데 그렇지 않으면 중복 column으로 판단된다.
이러한 경우, specified 의 SELECT 문 포함여부에 따라 결과값이 달라지니까 그런 거 아닐까 생각한다.
//SELECT DISTINCT column A, column B ORDER BY specified;
column A | column B | specified
개 고양이 1
개 고양이 2