UNION & ORDER BY

DATE : 2023/11/30

UNION이 무엇이며 어떤 식으로 사용하는 지는 이미 정리했기 때문에 여기서 다루지는 않겠다.

(참고 : UNION [1] ~ UNION [3])

바로 본론으로 들어가서, 어떻게 하면 UNION 연산자를 사용해

다른 Table의 정보를 가져올 수 있을 지 그 과정을 살펴보도록 하자.

우선, UNION 연산자를 사용한다는 건

선행되는 SELECT문의 결과가 몇 개의 COLUMN을 가지고 있는 지 안다는 시점에서 가능하다.

COLUMN의 개수를 알아내기 위해서, UNION [3]에서는 에러가 나지 않는 시점까지

1을 붙여가면서 최종적인 1의 개수로 COLUMN 개수를 파악했다.

이 과정처럼 연산자의 성질을 이용하여 COLUMN의 개수를 알아낼 수 있는 방법이

한 가지 더 있는 데, 그게 바로 ORDER BY이다.

[ ORDER BY ]

order by는 select문 맨 뒤에 위치하는 걸 원칙으로 하며 정렬을 담당한다.

order by COL_NAME

order by는 어떤 column을 기준으로 정렬할 건지 지정해줘야 하기 때문에

뒤에 column name을 적어주는 형태로 쓰인다.

기본적으로 order by는 오름차순으로 row를 정렬 시키기 때문에 내림차순으로 바꾸고 싶다면

order by COL_NAME desc

desc(descending) keyword를 적어주면 된다. (참고로 오름차순은 asc keyword로 나타냄)

마지막으로 살펴볼 order by 특징은 column name을 지정할 때, 인덱스를 사용할 수 있다는 것이다.

SELECT title, author FROM board order by title

예를 들어 위와 같은 Query가 실행되면 가져온 ROW를

title column 기준으로 오름차순 정렬을 하라는 의미가 된다.

이때 이와 동일한 명령을 나타내는 Query가 바로

SELECT title, author FROM board order by 1

SELECT 뒤에 나열한 column 중에서 첫 번째인 title을 가리키는 인덱스, 1을 사용하는 경우가 된다.

만약 author column을 기준으로 정렬 하고 싶다면 SELECT 뒤에 나열한 column name 중에서

SELECT title, author FROM board order by 2

두 번째인 author을 의미하는 2를 입력하면 된다.

(주의할 점은 여기서 index는 0부터 시작하지 않는 다는 점!)

실제 member table에 order by를 사용해보면 "인덱스가 2"이기 때문에

pass column을 기준으로 오름차순 정렬된 결과를 확인할 수 있다.

흠.. 여기까지 봤을 때,

인덱스를 사용할 수 있다는 건 알겠는데 이걸 어떻게 써먹을 수 있지..?

위에서 우리는 SELECT 뒤에 나열한 column name 만큼만 인덱스를 지정해보았다.

그렇다면 COLUMN 개수보다 큰 인덱스를 사용하면 어떻게 될지 궁금할 것이다.

SELECT title, author FROM board order by 3

DB에게 2개의 column을 꺼내 달라고 하는 동시에 3번째 column으로 정렬 시키라고 하면

"Unknown column 3 in order clause" 에러가 발생하게 된다.

"너가 column 2개만 꺼내라며! 3번 째 column은 없다고!" 말하고 있는 것이다.

이를 통해 확인할 수는 사실은

UNION은 column의 개수가 일치할 때까지 에러가 나는 반면,

ORDER BY는 column의 개수가 넘어가는 순간 에러가 난다는 점이다.

따라서 에러가 나는 순간에 입력한 index보다 1 작은 수가 column의 개수임을 알 수 있다.

Last updated