본문 바로가기

CS+/SQL

Mysql - 복수의 열 정렬, 행수 제한(LIMIT,OFFSET)

1) 복수의 열 정렬

 

이번에는 복수 열로 정렬하는 법을 얘기 해보겠습니다. 

같은 값을 가진 행의 순서는 '일정하지 않습'니다.

다음의 예를 보겠습니다.

 

위의 데이터를 '1-1, 1-2, 1-3' 와 같이 정렬을 하려 합니다.

 

원하는 대로 출력이 되지 않습니다. 

b 도 추가해주면 해결이 됩니다. 

 

1차적으로 a열 기준으로 정렬하고 동일 한 값들은 b열을 기준으로 정렬 합니다

이번에는 b열 기준으로 먼저 정렬하고, a열을 그 적용해보겟습니다. 

 

쉽네요. 정렬 뒤에  asc/desc 를 통해서 우선순위의 정렬을 정하고, 정함과 동시에 오름차순, 내림차순도 정할 수 있습니다. 

 

asc 는 기본값이니깐 생략해줘도 되지만, 정렬방법을 정할 수 있다는 차원에서 표기했습니다 :)

 

ORDER BY 로 지정한 열에서 NULL 값을 가지는 행은 가장 먼저 표시되거나 가장 나중에 표시됩니다. 데이터베이스 제품마다 기준이 다릅니다. MySQL의 경우, NULL 값을 가장 작은 값으로 취급해 ASC(오름차순)에서는 가장 먼저, DESC(내림차순)에서는 가장 나중에 표시합니다. 

 

2) 결과 행 제한하기 - limit

limit 구는 표준 SQL은 아닙니다. Mysql 과 PostgreSQL 에서 사용할 수 있는 문법임을 유념해주세요.

 

> SELECT 열명 FROM 테이블명 WHERE 조건식 ORDER BY 열명 LIMIT 행수

 

예를 바로 보죠.

 

7행으로 이루어진 테이블이 있습니다. 

 

limit 구로 반환되는 행을 제한하는 것을 볼 수 있습니다. 여기에 order by 를 같이 적용해보겠습니다.

 

no 열을 내림차순으로 정렬한 뒤에 상위 3개 행에 해당하는 '7,6,5'가 표시되었습니다. 

SQL Seaver 에서는 limit 와 비슷한 기능을 하는 'TOP'를 사용할 수 있습니다.

Oracle 에서는 limit 와 비슷한 기능을 하는 'ROWNUM' 을 사용해여 WHERE 구로 조건을 지정하여 행을 제한할 수 있습니다. 

 

+) OFFSET 지정

 

LIMIT 구에서 OFFSET 을 통해 어느 행에서부터 데이터를 추출할 지 정할 수 있습니다. 

 

OFFSET 에서 숫자는 인덱스의 위치라고 보시면됩니다. 인덱스는 0부터 시작하므로 인덱스가 2인 3부터 데이터를 보여줍니다.

 

이번에는 내림차순으로 정렬하여 그 상태에서 인덱스가 1인 행부터 추출하도록 만들어 보았습니다.

OFFSET 구는 LIMIT 뒤에 기술해주셔야 합니다. 인덱스는 항상 0부터 시작하니깐 이점에 유의해서 위치 지정을 해주시면 됩니다.

 

문제를 풀어보겠습니다. 

문제는 프로그래머스에 있는 문제에요 :) 

 

3개의 열을 고르면 되겠네요. 그리고 정렬하는 열은 두 가지 이름열과 날짜열입니다. 이름열은 기본값이 사전식으로 되니깐 따로 손 댈 필요없습니다. 대신 날짜의 경우, 더 최신 날짜가 위에 행으로 올라오도록 해줘야해요. 

 

날짜의 경우, 과거에서 현재로 오는 것이 ASC 이고, 현재(최근 날짜)에서 과거의 날짜로 가는 것이 DESC 입니다. 문제에서는 보호를 나중에 시작한 동물이 먼저 오도록 해달라고 하였으니 DESC 로 정렬을 해주면 됩니다. 

 

 

정답은 위와 같습니다. 

 

두 번째 문제입니다. 

 

일단 SELECT 에서는 NAME 을 선택하시면 됩니다. 날짜를 기준으로 정렬을 해주시면 됩니다. 내림차순으로 해줘야죠.

그래야 제일 최근에 들어온 동물이 상단에 위치합니다. 

그리고 1행만 보여줄 거니깐 LIMIT 1 을 해주시면 됩니다. 

 

 

 

 

--참고--

 

https://programmers.co.kr/learn/challenges

 

프로그래밍 강의 | 프로그래머스

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr