7. [SQL기초] 결과 데이터 정렬하기
검색 결과 정렬
데이터를 다루는 가장 기본은 잘 정리된 데이터입니다. 순서대로 정리된 데이터는 다루기 쉽고 재사용성을 높입니다.
쿼리 결과를 순서대로 정렬하려면 order by 절을 사용해야 합니다. Order by 절을 사용하면 검색 대상의 특정 컬럼 값을 순서대로 정렬할 수 있습니다.
기본 order by 절의 구문은 다음과 같습니다.
Select 컬럼 이름 from 테이블 이름 where 조건식 order by 열 이름;
Order by 절은 쿼리문 맨 끝에 와야 합니다. Where 절 보다 앞에 올 수 없습니다. Where 절이 없을 경우 from 절 뒤에 와야 합니다.
Order by 절이 없을 경우 테이블 검색 결과로 반환되는 행들은 테이블에 저장된 순서대로 표시됩니다. 표시 순서는 먼저 저장된 행이 위쪽에 오게 됩니다.
회원정보 테이블의 회원 정보를 회원 이름으로 정렬해서 가져오는 쿼리문은 다음과 같습니다.
Select * from member order by name;
오름차순과 내림차순 방향
쿼리 결과를 기준 컬럼 값으로 정렬할 때는 2가지 방식으로 정렬을 할 수 있습니다. 작은 값부터 큰 값 순서로 표시를 하는 오름차순과, 큰 값부터 작은 값 순으로 정렬을 하는 내림차순이 있고, 정렬 방향을 정하지 않고 order by 절의 정렬 컬럼을 표시하면 오름차순으로 정렬을 합니다.
정렬 방향은 “asc”, “desc” 2가지가 있습니다. 오름차순은 “asc”(ascendant), 내림차순은 “desc”(descendant)로 열 이름 뒤에 공백으로 띄워서 표시를 합니다.
앞의 회원정보를 이름순으로 정렬해서 가져오는 쿼리문은 다음과 같습니다.
Select * from member order by name asc;
반대 순서(내림 차순)로 정렬하려면 다음과 같이 정렬 방향을 바꿔주면 됩니다.
Select * from member order by name desc;
정렬하는 값의 대소 기준
숫자형 데이터 컬럼은 큰 숫자가 더 큰 값이 되며, 정렬 방향에 그대로 적용됩니다.
숫자형으로 표시되는 년, 월, 일 날짜와 시간 또한 숫자형과 마찬가지로 더 큰 숫자가 더 큰 값이 됩니다.
가장 중요한 문자열 데이터의 정렬은 사전식 순서에 따른 정렬 기준을 가집니다. 알파벳은 알파벳 순으로 뒤에 오는 알파벳이 더 큰 값이 되며, 한글 또한 사전 순서대로 뒤에 오는 글자가 더 큰 값이 됩니다.
내 포인트 정보 테이블에서 정수 값인 내 포인트 값을 내림 차순으로 정렬하면 다음과 같이 정렬됩니다.
select * from mypoint order by point desc;
문자열 데이터를 정렬할 때 주의할 점이 있습니다. 숫자형 데이터와 숫자 표기지만 문자열인 데이터는 정렬 기준이 다릅니다. 정렬 결과 또한 다르므로 주의해야 합니다.
숫자인 1, 33, 7, 10, 5는 오름 차순으로 정렬하면 1, 5, 7, 10, 33 순서로 숫자 크기에 따라 정렬이 되지만 문자형 데이터 타입인 “1”, “33”, “7”, “10”, “5”를 오름 차순으로 정렬하면 “1”,.”10”, “33”, “5”, “7”로 정렬됩니다.
문자열 데이터는 사전식 순서로 정렬되기 때문에 맨 앞자리 숫자 문자를 오름차순으로 먼저 정렬한 후, 첫 번째 문자 숫자가 같은 데이터들은 두 번째 문자 숫자로 추가 정렬을 합니다.
문자열 데이터는 사전식 정렬을 하며, 문자 종류에 따라 우선순위가 있습니다.
숫자 문자 > 알파벳 > 한글 순으로 정렬 우선순위가 있습니다.
회원 정보 테이블의 로그인 패스워드를 오름 차순으로 정렬하면 다음과 같이 정렬됩니다.
Select * from member order by pw asc;
여러 기준 열로 정렬하기
기본 쿼리문 구조는 다음과 같습니다.
Select 열 이름 from 테이블 이름 where 조건식 order by 열 이름 [ASC|DESC], 열 이름 [ASC|DESC];
정렬하는 기준이 되는 컬럼은 여러 개를 지정할 수 있습니다. 정렬 컬럼 사이는 쉼표로 구분합니다. 또한 각 정렬 컬럼 별로 오름차순|내림차순 방향을 각각 지정할 수 있습니다. 여러 개의 컬럼을 order by 절에 정렬 기준으로 표시하면 사전식 순서로 왼쪽에서 오른쪽 방향으로 하나씩 정렬이 적용됩니다.
사전식 컬럼 정렬 순서는 컬럼 한 개에 대한 정렬이 끝난 후 값이 같은 컬럼 값에 대해서만 다음 컬럼의 정렬이 추가로 적용되는 것입니다.
Select * from member order by name asc, nickname desc, age desc;
이름(name)으로 가장 먼저 오름차순 정렬이 되고, 이름이 같은 항목들은 닉네임(nickname) 순으로 내림차순 정렬이 됩니다. 닉네임도 같은 경우 나이(age) 순으로 내림차순으로 정렬됩니다.
이름에서 같은 항목이 없으면 닉네임과 나이순으로는 더 이상 정렬이 되지 않습니다.
정렬을 할 때 정렬 기준 컬럼이 한 개만 있고 컬럼 값이 같은 행들이 여러 개일 때 이 행들의 표시 순서는 확정적이지 않습니다. 데이터베이스를 어떤 방식으로 저장했는지, 또는 데이터를 가져오는 데이터베이스의 특성에 따라 값이 같은 컬럼의 표시 순서가 바뀔 수 있습니다. 주의해야 합니다.
여러 컬럼을 기준으로 정렬을 할 때는 표시한 컬럼의 순서에 따라 결과가 달라진다는 점에 주의해야 합니다. 앞의 쿼리문에서 정렬 컬럼의 표시 순서를 바꾸면 쿼리 결과 데이터의 표시 순서도 달라지게 됩니다.
Select * from member order by age desc, name asc, nickname desc;
오름차순으로 여러 컬럼을 정렬하는 경우 정렬 방향을 생략하면 쿼리문을 조금 더 간결하게 유지할 수 있습니다. 쿼리문을 작성할 때 알아두면 좋습니다.
Select * from member order by ag, name, nickname;
널 정렬 기준
널은 컬럼에 값이 입력되지 않은 상태를 말합니다. 즉 없는 데이터입니다. 널 값이 들어있는 컬럼을 기준으로 정렬을 하면 없는 데이터인 널은 특별하게 취급되어 예외적인 처리를 하게 됩니다.
대소 비교를 할 수 없지만, 가장 작거나 가장 큰 값으로 예외 처리를 하며, 데이터베이스 종류에 따라서 처리하는 방법이 다릅니다. 때문에, 사용하는 데이터베이스에서 어떤 기준을 가지고 있는지 미리 알아 둘 필요가 있습니다.
MySQL은 널 값을 가장 작은 값으로 예외 처리를 합니다. 오름 차순으로 정렬을 하면 널은 가장 앞에 표시됩니다.
회원정보 테이블을 nickname(닉네임) 컬럼을 기준으로 오름차순 정렬을 하면 닉네임이 없는 행이 가장 위에 표시됩니다.
select * from member order by nickname asc;