# UNION & ORDER BY

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

(참고 : [UNION \[1\]](https://app.gitbook.com/s/EAnXhlSDUbsvwZc1efw5/thinking-about/undefined-1/union-1 "mention") \~ [UNION \[3\]](https://app.gitbook.com/s/EAnXhlSDUbsvwZc1efw5/thinking-about/undefined-1/union-3 "mention"))

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

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

우선, UNION 연산자를 사용한다는 건&#x20;

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

COLUMN의 개수를 알아내기 위해서, [UNION \[3\]](https://app.gitbook.com/s/EAnXhlSDUbsvwZc1efw5/thinking-about/undefined-1/union-3 "mention")에서는 에러가 나지 않는 시점까지

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

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

한 가지 더 있는 데, 그게 바로 <mark style="background-color:blue;">**ORDER BY**</mark>이다.

### \[ ORDER BY ]

order by는 <mark style="color:blue;">**select문 맨 뒤에 위치하는 걸 원칙으로 하며 정렬을 담당**</mark>한다.&#x20;

```
order by COL_NAME
```

order by는 <mark style="color:blue;">**어떤 column을 기준으로 정렬할 건지**</mark> 지정해줘야 하기 때문에&#x20;

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

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

```
order by COL_NAME desc
```

<mark style="color:blue;">**desc**</mark>(descending) <mark style="color:blue;">**keyword**</mark>를 적어주면 된다. (참고로 오름차순은 <mark style="color:blue;">**asc keyword**</mark>로 나타냄)

마지막으로 살펴볼 order by 특징은 column name을 지정할 때, <mark style="color:blue;">**인덱스**</mark>를 사용할 수 있다는 것이다.

```
SELECT title, author FROM board order by title
```

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

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

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

```
SELECT title, author FROM board order by 1
```

<mark style="background-color:blue;">**SELECT 뒤에 나열한 column 중에서 첫 번째인 title을 가리키는 인덱스**</mark>, 1을 사용하는 경우가 된다.&#x20;

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

```
SELECT title, author FROM board order by 2
```

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

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

<figure><img src="https://2312435576-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzogQ2aBWvTUNLb9AodP%2Fuploads%2FlQivnlUoomLSYl5Lv4TF%2Fimage.png?alt=media&#x26;token=d19cb296-339b-4607-8466-8bc7aec7822e" alt=""><figcaption></figcaption></figure>

실제 member table에 order by를 사용해보면 **"인덱스가 2"**&#xC774;기 때문에&#x20;

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

흠..  여기까지 봤을 때,&#x20;

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

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

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

```
SELECT title, author FROM board order by 3
```

DB에게 <mark style="background-color:blue;">**2개의 column을 꺼내 달라고 하는 동시에 3번째 column으로 정렬**</mark> 시키라고 하면

<figure><img src="https://2312435576-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOzogQ2aBWvTUNLb9AodP%2Fuploads%2FGhO4JHqgmlgcclM7d0ns%2Fimage.png?alt=media&#x26;token=c7195e1e-8b8f-4c2c-8bb8-b55c16919f41" alt=""><figcaption></figcaption></figure>

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

즉 <mark style="background-color:blue;">**"너가 column 2개만 꺼내라며! 3번 째 column은 없다고!"**</mark> 말하고 있는 것이다.&#x20;

이를 통해 확인할 수는 사실은&#x20;

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

ORDER BY는 <mark style="background-color:blue;">**column의 개수가 넘어가는 순간**</mark> 에러가 난다는 점이다.&#x20;

따라서 <mark style="color:blue;">**에러가 나는 순간에 입력한 index보다 1 작은 수**</mark>가 column의 개수임을 알 수 있다.
