# 3장 가져온 데이터 정렬하기

## 데이터 정렬하기

설정 없이 SELECT 문으로 가져온 데이터는 정렬되지 않은 상태이다. 대개 테이블의 순서대로 출력된다. 데이터가 업데이트되거나 삭제되면 DBMS가 공간을 어떻게 사용하느냐에 따라 순서가 바뀔 수 있다. 즉, 정렬을 명시하지 않는다면 정렬 순서를 예상해서는 안된다는 의미이다. 관계형 데이터베이스 설계 이론에서도 정렬이 명시되지 않으면, 검색된 데이터의 순서를 가정해서는 안된다고 명시하고 있단다.

SELECT 문으로 가져온 데이터를 정렬하려면, ORDER BY 절[^1]을 사용한다. ORDER BY 뒤에는 하나 이상의 열 이름을 적는데, 이를 기준으로 결과를 정렬한다.

<figure><img src="https://534473029-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh5bANRFbqQiBiOjIxpbm%2Fuploads%2Fhu2sLJgCC1X8NCTCz2JY%2Fimage.png?alt=media&#x26;token=21baa97e-77f5-4c06-8d7f-935db4f60312" alt=""><figcaption><p>prod_name 열을 기준으로 정렬하라고 명시함</p></figcaption></figure>

{% hint style="info" %}
ORDER BY 절의 위치

ORDER BY 절을 사용할 때는 이 절이 SELECT 문의 마지막에 와야 한다는 것을 기억하자. 아니면 에러가 발생한다.
{% endhint %}

## 여러 개의 열로 정렬하기

두 개 이상의 열로 데이터를 정렬해야 하는 일도 종종 발생한다. 이때 검색과 마찬가지로 열을 콤마로 구분해 사용하면 여러 열로 정렬할 수 있다.

<figure><img src="https://534473029-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh5bANRFbqQiBiOjIxpbm%2Fuploads%2FS5wHYRUTkbaqtvtDPq24%2Fimage.png?alt=media&#x26;token=61c073b8-0f92-4ca2-b4b4-d07ef964b1d5" alt=""><figcaption><p>id, price, name 데이터를 불러오고 price, name의 순으로 정렬</p></figcaption></figure>

## 열의 위치로 정렬하기

ORDER BY는 열 이름을 사용해 정렬할 수 있고, 열 위치로도 정렬할 수 있다.

<figure><img src="https://534473029-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh5bANRFbqQiBiOjIxpbm%2Fuploads%2F8Zb6AwL9U9CD6g2yn1Wi%2Fimage.png?alt=media&#x26;token=2b55dcf7-5ba3-4e87-81a7-30aa237887f8" alt=""><figcaption><p>위와 같은 결과</p></figcaption></figure>

이러한 방법의 장점은 열 이름을 다시 적을 필요가 없다는 점이다.

단점은\
첫째, 열 이름을 쓰지 않기에 사용자가 잘못된 열을 지정할 가능성이 있다.\
둘째, SELECT 절에서 가져오는 열이 변경될 때 ORDER BY 절을 수정하지 않아 잘못 정렬할 수 있다.\
셋째, SELECT 절에 없는 열로 정렬하는 것이 불가능하다.

{% hint style="info" %}
검색하지 않은 열로 정렬하기

이 기법을 사용하면 SELECT 절에서 나열하지 않은 열로 정렬하는 것은 불가능하다. 하지만 필요하다면 하나의 명령문에서 열 이름과 위치를 혼용해 사용해도 된다.
{% endhint %}

## 정렬 순서 지정하기

데이터 정렬 순서는 오름차순이 기본값이지만, DESC 키워드를 사용해 내림차순 정렬을 명시할 수 있다.

<figure><img src="https://534473029-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh5bANRFbqQiBiOjIxpbm%2Fuploads%2FT245nUzGM8zIl55ZNAHn%2Fimage.png?alt=media&#x26;token=c782daeb-2288-4844-ae6c-f3d953e9bf06" alt=""><figcaption><p>prod_price을 기준으로 내림차순 정렬한다.</p></figcaption></figure>

여러 열을 기준으로 내림차순으로 정렬하려면 어떻게 할까? 각각의 열에 DESC 키워드를 적으면 된다.

<figure><img src="https://534473029-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh5bANRFbqQiBiOjIxpbm%2Fuploads%2FTFaaYLULCLwUUz0oytyr%2Fimage.png?alt=media&#x26;token=0e83ac08-db73-43d8-a3e1-69a49d8ee9d3" alt=""><figcaption><p>내림차순은 DESC를 명시한 열에만 적용이 된다.</p></figcaption></figure>

오름차순은 ASC인데 기본값이라 굳이 적지 않아도 된다.

## 정리하기

* SELECT 문의 ORDER BY 절을 이용해 가져온 데이터를 정렬할 수 있다.
* ORDER BY 절은 SELECT 문의 마지막에 있어야 한다.
* 오름차순이 기본값이지만, DESC를 명시해 내림차순으로 정렬할 수 있다.

## 도전 과제

1. Custom 테이블에서 모든 고객 이름을 가져오고 그 결과를 내림차순으로 정렬하여 표시하는 SQL 문을 작성하기.

<figure><img src="https://534473029-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh5bANRFbqQiBiOjIxpbm%2Fuploads%2FluQcG0nA8a86tMg6IGah%2Fimage.png?alt=media&#x26;token=e8d0aa78-d4ce-496e-9012-39bea3601e19" alt=""><figcaption></figcaption></figure>

2. Orders 테이블에서 고객 ID와 주문 번호를 검색해, 결과를 고객 ID로 먼저 정렬하고 최근 주문한 순서대로 정렬하는 SQL 문 작성하기.

<figure><img src="https://534473029-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh5bANRFbqQiBiOjIxpbm%2Fuploads%2F9EbjT8dZUl2hj1awbTrC%2Fimage.png?alt=media&#x26;token=122c4938-7d82-4d5c-9c46-9253840eff0b" alt=""><figcaption></figcaption></figure>

3. Order Items 테이블에서 수량 및 가격을 검색해 가장 수량이 많고, 높은 가격순으로 정렬하는 SQL 문을 작성하라

<figure><img src="https://534473029-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fh5bANRFbqQiBiOjIxpbm%2Fuploads%2FrLRscoCkI7eCZysRjWQR%2Fimage.png?alt=media&#x26;token=329c0371-4824-4ea5-b6e4-4c760fa6bb52" alt=""><figcaption></figcaption></figure>

4. 다음 SQL 문은 무엇이 잘못되었는가?

```
SELECT Vend_name,
FROM Vendors
ORDER vend_name DESC;
```

Vend\_name의 콤마, ORDER =>ORDER BY

[^1]: SQL 문은 절(Clause)로 구성되어 있는데, 절은 필수로 사용하는 것과 선택 사용하는 것으로 나뉜다. 절은 보통 SELECT 문의 FROM과 같이 키워드와 키워드에 해당하는 데이터로 이루어진다.
