본문 바로가기
공부/mysql

Mysql 기본명령어 6 (ORDER BY)

by signature95 2022. 1. 25.
728x90
반응형

이전 포스트에 이어서 작성하는 내용입니다.

 

2022.01.25 - [공부/mysql] - Mysql 기본명령어 5 (LIKE)

 

Mysql 기본명령어 5 (LIKE)

지난 포스트에 이어서 작성하는 내용입니다. 2022.01.24 - [공부/mysql] - Mysql 기본 명령어 4 (AND, OR, NOT 논리연산자) Mysql 기본 명령어 4 (AND, OR, NOT 논리연산자) 지난 포스트에 이어서 작성하는 내용입..

signature95.tistory.com

 

 

ORDER BY는 검색결과의 행을 정렬하는 방법입니다.

 

SELECT row_name FROM table_name WHERE 조건식 ORDER BY row_name;

 

바로 실습을 해보겠습니다.

먼저 데이터를 확인합니다.

age 열을 보면, 순서대로 정렬이 되어 있지 않음을 확인할 수 있습니다. 이를 정렬하기 위해서 다음 명령어를 입력해 보겠습니다.

 

SELECT * FROM sample31 ORDER BY age;

검색 조건이 없는 경우, WHERE을 생략할 수 있음

ORDER BY를 시행하면 오름차순으로 정렬된 것을 확인할 수 있습니다.

이는 문자열에도 적용이 가능합니다. 

(가나다 순으로 정렬된 것을 확인할 수 있음. 사전식 순서로 대소관계가 정렬되기 때문)



오름차순으로 정렬하는 것이 아닌 내림차순 정렬도 가능합니다.

 

descendant (하강)을 의미하는 DESC 명령어를 마지막에 넣으면 가능합니다.

SELECT row_name FROM table_name WHERE 조건식 ORDER BY row_name DESC;

 

ORDER BY는 기본 값으로 ASC(ascendant가 지정되어 있음)

SELECT row_name FROM table_name WHERE 조건식 ORDER BY row_name ASC;

 

 

하지만 수치형 데이터가 입력되어 있더라도, 실제 데이터가 INT가 아닌 VARCHAR, STR인 경우는 정렬이 달라지게 됩니다.

문자형 데이터가 사전식으로 대소관계를 인식하여 정렬하는 것을 잠깐 앞에서 살펴보았는데, 그 사전식 정렬이 이유입니다.

 

예시를 살펴보겠습니다.

확인해보면 a로 정렬한경우와 b로 정렬한 경우가 다르게 된것을 확인할 수 있습니다.

 

앞에서 언급했듯, 데이터 유형의 차이로 인해 발생한 것입니다.

밑은 각 a, b열의 데이터 유형을 살펴본 결과 값입니다.

이처럼 a는 문자형의 데이터이기 때문에, 사전식 정렬 결과를 보여준 것입니다. 

 

또한, 이렇게 데이터를 정렬해서 출력하더라도, 실제 데이터의 행 순서까지 바뀌진 않습니다. 결과를 반환하는 과정에서 정렬을 한 것이기 때문에 기존의 테이블에는 아무런 영향이 없는 것이죠.

 

 

그렇다면, 이번에는 여러개의 열에 이를 적용시켜 보겠습니다. 

 

응용이긴 하지만, 기본 구조는 생각보다 간단합니다.

 

SELECT row_name FROM table_name WHERE 조건식 ORDER BY row_name1 [ASC | DESC],  row_name2 [ASC | DESC],  row_name3 [ASC | DESC] …… ;

 

대용량의 데이터를 다루게 된다면, 하나의 열을 정렬하는 것보다는 더 다양한 열을 정렬하여 사용하는 경우가 많을 것입니다.

만약, 가구 데이터를 생각해보면 방의 개수가 가장 많은 집에서 가족 구성원의 수는 적은 순서로 정렬하게 되는 경우도 존재할 것입니다. 이 경우는 방의 개수를 먼저 내림차순으로 정렬하고 그리고 가족구성원은 오름차순으로 정렬하게 된다면 가능할 것입니다.

 

그럼 바로 실습을 해보도록 하겠습니다.

 

먼저 데이터입니다. 

위 데이터를 a 열의 오름차순으로 정렬하게 된다면 다음과 같은 결과를 출력할 수 있습니다.

하지만, b값을 보면 1,3,2 형태로 정렬이 올바르게 되지 않은 것을 확인할 수 있죠.

따라서 이를 정렬하려면 다음과 같은 명령어를 사용하면 됩니다.

 

SELECT * FROM sample32 ORDER BY a ASC, b ASC;

물론 ORDER BY의 기본 값은 ASC이므로 사실 ASC를 생략해도 결과는 동일하게 나옵니다.

위 오류를 보면 아시겠지만, [ASC], [DESC]를 그대로 입력하면 문법 오류가 발생합니다.

 

 

이번에는 a, b의 순서를 바꿔서 정렬하고 a는 내림차순으로 해보도록 하겠습니다.

위의 명령문에는 SELECT *를 햇기에 a, b 순서로 나와서 제대로 명령어를 수행했는지 직관적으로 보기 어렵다 판단하여 SELECT b, a로 결과를 다시 출력하였습니다.

 

그렇다면 NULL 값은 데이터를 비교할 수 없는데 어떻게 처리가 될까요

 

에초에 비교자체가 성립하지 않기 때문에 NULL은 제일 위 혹은 아래에 표시됩니다. 하지만 표준 SQL에 해당 규정이 적용되지 않아서 SQL 데이터베이스 제품에 따라 정렬되는 기준도 상이합니다.

 

Mysql은 NULL을 가장 작은 값으로 취급하여 ASC에는 가장 먼저 출력되고 DESC에서는 가장 나중에 출력되게 됩니다. 

728x90

댓글