본문 바로가기
SQL

[SQL] 역순 정렬하기 [단순하게 order by를 사용하면 안되는이유]

by itstime0809 2023. 8. 26.
728x90

SQL

https://school.programmers.co.kr/learn/courses/30/lessons/59035

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

쿼리

SELECT NAME, DATETIME from ANIMAL_INS order by ANIMAL_ID DESC;

 

설명

 해당 문제는 프로그래머스 Level.1 문제이며 문제가 굉장히 간단한 문제이지만 간과하고 넘어갈 수 있는 사실이 있는 것 같기 때문에 짚고 넘어가 보려 한다. 우선 문제를 해결하고자 하는 것은 아래와 같다.

 

 

동물 보호소에 들어온 모든 동물의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 ANIMAL_ID 역순으로 보여주세요. SQL을 실행하면 다음과 같이 출력되어야 합니다.

 

 

 위 문장에서 ANIMAL_ID를 역순으로 출력하라고 한다. 그럼 생각해보아야 하는게 정렬이라는 게 무엇일까를 먼저 생각해봐야 한다. 정렬이라고 하면 문자의 경우 문자의 순서대로 a-z, A-Z 숫자라면 1-9와 같이 어떤 기준을 잡고 나열하는 방식을 의미한다. 그럼 역순이라는건 무엇인가를 다음으로 생각해 보아야 한다. 역순이라는 것은 거꾸로라는 말과 같은 의미를 지니고 있다. 따라서 역순은 어떤 특정기준으로 나열되어 있는 것 혹은 그렇게 나열되지 않은 것들의 집합에서 처음과 끝을 바꾸어서 나열하는 것을 의미한다. 자세하게 설명해 본다면 마지막을 기준으로 처음까지 정렬한다는 의미다. 그러면 정렬과 역순이 같은 걸까? 위 문제에서 정렬과 역순이 같은 의미로 사용될 수 있기 때문에 DESC를 사용할 수 있다는 것을 알아야 한다. 정렬과 역순은 엄연히 다르다. 물론 어떤 기준에 대해서 나열한다는 의미는 통할 수 있지만 근본적으로 정렬은 어떤 특정한 기준을 가지고 나열하는 것을 의미하고 역순은 단순 뒤에서부터 처음까지를 나열하는 것을 의미하기 때문이다. 생각해 본다면 랜덤 하게(무작위로) 나열되어 있는 숫자들의 집합이 있을 때 1,5,2,4,6,7 이러한 숫자가 있을 때 이를 DESC로 즉 내림차순으로 정렬한다고 해서 역순으로 출력하는 의미를 갖게 되는가? 전혀 아니다. DESC는 말 그대로 내림 차순이다. 어떠한 숫자들을 큰 숫자부터 작은 숫자까지 출력하는 의미를 가지고 있다. 따라서 정렬의 결과는 7 6 5 4 2 1과 같이 나올 것이다. 그럼 역순으로 나타내면 어떻게 될까? 7 6 4 2 5 1이다. 둘의 결과는 다르다. 기준이 다르고 나열하는 것은 같다. 결국 정렬과 역순은 다르다는 것을 알 수 있다. 그럼 왜 위 문제에서는 역순으로 출력하라고 했는데 DESC가 가능할까? 생각해 보면 단순하다. 정렬이 되어 있기 때문이다. 정렬이 되어 있다라는 것은 어떤 기준을 가지고 특정 데이터가 나열되어 있다는 뜻이 된다. 해당 데이터를 select * from ANIMAL_INS로 확인해 보면 알 수 있듯 ANIMAL_ID가 오름 차순으로 정렬이 되어 있다. 그렇다는건 작은 거에서 -> 큰 순서대로 정렬이 되어 있다는 의미가 된다. 그렇다면 역순으로 출력하기 위해서 어떻게 해볼 수 있을까? 반대로 내림차순으로 정렬하면 된다. 왜? 오름 차순으로 먼저 정렬이 되어 있었기 때문에 역순으로 출력한다고 한다면 뒤에서 처음까지 나열하게 되는 건데, 내림 차순으로 정렬하게 되면 역순으로 출력하는 것과 같은 효과를 내기 때문이다. 그렇기 때문에 위 문제에서 역순을 정렬을 사용해서 사용할 수 있는 것이다. 이와 같은 사실을 기반으로 정렬과 역순은 엄연히 다른 것이며, 프로그래밍 코딩테스트 문제를 간혹 풀 때도 정렬과 역순은 다르다. 그렇기 때문에 역순이라고 해서 반드시 DESC, ASC와 같이 정렬로 알고 있어서는 안 된다고 생각한다.