반응형
  1. 정렬 - ORDER BY

SELECT 쿼리에서 ORDER BY를 지정하면 검색 결과의 행 순서를 바꿀 수 있습니다.

    1. 검색 결과 정렬

SELECT 쿼리의 ORDER BY 뒤에 정렬하고 싶은 컬럼을 지정하면 지정된 컬럼을 기준으로 레코드를 정렬합니다.

ORDER BY는 아래 표와 같이 두가 방법으로 사용이 가능합니다.


1

SELECT * FROM 테이블 ORDER BY 컬럼명

2

SELECT * FROM 테이블 WHERE 조건식 ORDER BY 컬럼명

[표 1. ORDER BY 의 사용 위치]


[표 1]에서 보듯이 별도 검색 조건이 없을 경우에는 테이블명 바로 뒤에 지정하면 됩니다.

    1. 내림차순 정렬

ORDER BY는 별도 옵션 지정이 없다면 오름차순 정렬을 기본으로 합니다.

내림차순으로 정렬해야 할때는 “ORDER BY 열명” 뒤에 DESC를 붙여서 지정합니다.


1

SELECT * FROM 테이블 ORDER BY 컬럼명 DESC

2

SELECT * FROM 테이블 WHERE 조건식 ORDER BY 컬럼명 DESC

[표 2. DESC의 사용 위치]


DESC는 descendant(하강), ASC는 ascendant(상승)의 약자입니다.

쉽게 예를 들면 오름차순은 첫번째 레코드가 가장 작은 값을 가지고 레코드가 아래로 내려갈수록 값이 커지는 것이고, 내림차순은 첫번째 레코드가 가장큰값을 가지고 아래로 내려갈수록 값이 작아지는 것입니다.


스크린샷 2017-02-17 오후 5.45.06.png

[그림 1. 오름차순 내림차순을 사용한 쿼리]


위 [그림 1]에서 보는 것과 같이 오름차순과 내림차순의 결과가 다릅니다. 예제 쿼리에서는 오름차순 쿼리 호출 시 별도로 오름차순 예약어를 명시하지 않았는데 평소에 오름차순으로 지정할 일이 있으면 ASC로 지정해 주는것이 좋습니다.

    1. 대소관계

ORDER BY로 정렬할 때는 값의 대소관계가 중요합니다.

수치형 데이터의 경우는 대소관계를 판별하는것이 어렵지 않습니다. 문제는 문자열형 데이터입니다.

문자열형 데이터의 경우는 알파벳이나 한글 자모음 배열 순서를 사용하면 문자를 차례대로 나열할 수 있습니다.

한마디로 문자열형 데이터는 사전식 순서에 의해 정렬이 결정됩니다.


스크린샷 2017-02-17 오후 5.53.55.png

[그림 2. 문자열형 데이터를 오름차순한 결과]


[그림 2]에서 a 컬럼의 경우 자료형이 문장열형이기 때문에 오름차순으로 정렬할 경우 1 다음 2가 나오지 않고 10이 나온것입니다. 해당 쿼리에서 b 컬럼으로 오름차순으로 정렬한다면 원하는 결과인 1, 2, 10, 11의 순서로 보일것입니다.


지금까지 ORDER BY를 사용해서 데이터 검색 시 레코드의 정렬 순서를 변경하는 것을 보았습니다. 하지만 이것은 어디까지나 검색한 결과의 레코드 순서를 바꿔서 보여주는 것이지 테이블 자체의 레코드 순서를 변경하는 것은 아닙니다.

  1. 복수의 레코드 정렬

데이터의 양이 많을 경우 하나의 컬럼만으로는 레코드를 특정짓기 어려운 때가 많습니다. 이런 경우 복수의 컬럼을 지정하여 정렬을 합니다.

    1. 복수 컬럼으로 정렬 지정

ORDER BY에 1개의 컬럼을 지정하는 것으로는 정확히 순서를 결정할 수 없는 경우가 있습니다. 예를 들어 같은 값이 들어가 있을 경우가 그렇습니다.


1

SELECT * FROM 테이블 ORDER BY 컬럼명1, 컬럼명2 ...

[표 3. 복수의 컬럼으로 정렬]


복수의 컬럼을 지정하면 정렬 결과가 바뀝니다.

정렬의 순서는 지정한 컬럼명의 순서를 따릅니다. 만약 이때 값이 같을 경우 다음으로 지정한 컬럼명을 기준으로 정렬을 합니다.


스크린샷 2017-02-17 오후 5.59.11.png

[그림 3. 복수의 컬럼으로 실행한 결과]

    1. 정렬 방법 지정

복수의 컬럼을 지정해도 각 컬럼에 개별적으로 정렬 방법을 지정할 수 있습니다.


1

SELECT * FROM 테이블 ORDER BY 컬럼명1[ASC|DESC], 컬럼명2[ASC|DESC], ...

[표 4. 복수의 컬럼에 정렬 방식 지정]


스크린샷 2017-02-17 오후 6.07.26.png

[그림 4. 복수의 컬럼에 정렬방식을 지정한 결과]

    1. NULL값의 정렬

지금까지는 값이 저장된 컬럼의 정렬 방법을 설명했습니다. 그러면 컬럼의 값이 NULL일 때는 어떻게 정렬을 하는지 보겠습니다.

NULL은 특성상 대소비교를 할 수 없어 정렬 시에는 별도의 방법으로 취급합니다.

간단히 설명하면 ORDER BY로 지정한 컬럼에서에서 NULL값을 가지는 레코드는 가장 먼저 표시되거나 가장 나중에 표시됩니다. 하지만 NULL에 대한 대소비교 방법은 표준 SQL에도 규정되어 있지 않아 데이터베이스 제품에 따라 기준이 다릅니다.

제가 예제를 실행하는 MySQL의 경우는 NULL은 가장 작은 값으로 취급합니다.

  1. 결과의 레코드 수 제한 - LIMIT

검색한 데이터의 레코드 갯수가 많을 때는 한번에 보기 어렵기 때문에 LIMIT을 사용해서 표시할 레코드의 수를 제한할 수 있습니다.

LIMIT은 표준 SQL은 아닙니다. MySQL과 PostgreSQL에서 사용할 수 있습니다.

    1. 레코드 수 제한

LIMIT은 SELECT 쿼리의 마지막에 지정합니다.


1

SELECT * FROM 테이블 ORDER BY 컬럼명 LIMIT 레코드수

[표 5.  LIMIT을 지정한 쿼리]


LIMIT은 최대 레코드 수를 수치로 지정합니다. 예를 들어 LIMIT 10으로 지정하면 최대 10개의 레코드가 결과로 표시됩니다.


스크린샷 2017-02-17 오후 6.11.00.png

[그림 5. LIMIT을 사용한 결과]


만약에 LIMIT을 사용하지 않고 조건식을 지정하여 동일한 결과를 얻을 수 있을 수 있습니다. 하지만 LIMIT과 WHERE은 기능과 내부처리 순서가 전혀 다릅니다.

LIMIT은 반환할 레코드 수를 제한하는 기능으로 WHERE로 검색한 후 제일 마지막에 처리됩니다.


스크린샷 2017-02-17 오후 6.14.37.png

[그림 6. WHERE, ORDER BY 와 함께 LIMIT을 사용한 결과]


LIMIT의 처음 설명에서 이것은 MySQL과 PostgreSQL에서만 사용이 가능하다고 했습니다. 그러면 두 데이터베이스를 제외한 나머지에서는 이런 기능이 없을까요?

다른 데이터베이스에도 비슷한 기능이 존재합니다. 대표적인 데이터베이스인 Oracle과 SQL Server를 예로 들어 보겠습니다.


SQL Server에서는 TOP을 사용하여 최대 레코드 수를 제한할 수 있습니다. 아래 쿼리는 SQL Server에서 TOP의 사용하는 방법입니다.


1

SELECT TOP 3 * FROM 테이블

[표 6. SQL Server의 TOP 사용]


Oracle에는 LIMIT이나 TOP이 없습니다. 대신 ROWNUM을 사용해서 레코드 수를 제한 할 수 있습니다. 단, ROWNUM으로 행을 제한할 때는 WHERE 에서 지정합니다. 그래서 LIMIT이나 TOP과 결과가 다릅니다. 자세한 설명은 향후 준비해 보겠습니다.


1

SELECT * FROM 테이블 WHERE ROWNUM <= 3

[표 7. Oracle에서 ROWNUM 사용]

    1. 오프셋 지정

대량의 데이터를 하나의 페이지에 표시하는 것은 기능적으로도 속도 측면에서도 효율적이지 못하므로 일번적으로 페이지 나누기를 합니다. 페이지 나누기 기능은 LIMIT을 사용해서 간단히 구현할 수 있습니다.


1

SELECT * FROM 테이블 LIMIT 레코드 수 OFFSET 위치

[표 8. LIMIT에서 OFFSET 지정]


스크린샷 2017-02-17 오후 6.17.25.png

[그림 7. OFFSET을 지정하여 시작위치 조정 결과]


OFFSET의 시작 위치 지정은 LIMIT 뒤에 기술합니다. 위치 지정은 0부터 시작합니다. 배열의 인덱스를 생각하면 쉽습니다. ‘시작할 레코드 -1’이 시작 위치가 되는겁니다.

예를 들면 첫번째 레코드부터 5건의 데이터를 취득하기 위해서는 LIMIT 5 OFFSET 0 이 되는 겁니다.


반응형

+ Recent posts