SQL
정렬을 할 때는 주의해야할 점이 있습니다. 그건 바로 정렬 기준의 데이터 타입이
(1) 숫자형(INT 등)인 경우와,
(2) 문자열형(TEXT 등)인지에 따라
정렬 결과가 달라진다는 점입니다.
아래 그림을 보면 ordering_test라는 테이블에서 data 컬럼을 기준으로 오름차순 정렬을 하고 있습니다.
결과를 보니 크기가 작은 수부터 큰 순으로 잘 정렬되었네요.
잠깐 이 data 컬럼의 타입을 한번 볼까요?
정수형을 나타내는 INT가 지정되어 있네요. 자, 이 데이터 타입을 한번 INT에서 TEXT로 바꿔보겠습니다.
바꾸고나서
Apply 버튼을 눌러서 적용할게요.
그 다음 다시 정렬을 해보면
이번에는 이전과 다른 결과가 나왔죠?
왜 그런 걸까요? 그건 INT 타입과 TEXT 타입의 정렬 방식이 다르기 때문입니다.
INT 타입의 값은 숫자의 대소(크고 작음)를 기준으로 정렬이 수행되지만,
TEXT 타입의 값은 숫자의 대소가 아니라 한 문자, 한 문자씩 그 문자 순서를 비교해서 정렬이 수행됩니다.
예를 들어 지금 ’120’이 ’19’보다 먼저 나오게 된 것은, 일단 맨 앞의 1을 비교했더니 같았지만, 그 바로 뒷 자리는 문자 2가 문자 9보다 문자 순서상 더 앞에 있는 것이기 때문에 ‘120’이 더 먼저 나온 겁니다. 그리고 ‘230’과 ‘27’을 보면 앞 자리의 2는 같지만 그 다음은 3과 7로, 7이 문자 순서상 더 뒤이기 때문에 27이 더 뒤에 나온 겁니다. TEXT 타입처럼 문자열을 나타내는 데이터 타입들이 정렬 기준으로 사용될 때는 이런 원리가 적용됩니다.
그러니까 숫자값이 담긴 컬럼을 정렬 기준으로 할 때는 그 컬럼의 데이터 타입이 숫자형인지, 문자열형인지를 잘 살펴봐야 하죠.
그런데 이미 TEXT 타입인 컬럼에 있는 숫자값들을, 그냥 INT 등의 숫자형 타입으로 보고 정렬할 수는 없을까요? 가능합니다. 정렬할 때 그 컬럼의 값들의 데이터 타입을 일시적으로 변경해주면 되는데요.
이걸 하기 위해서는 CAST라는 함수를 써야합니다. CAST는 ‘틀을 만들다’, ‘틀을 정하다’라는 뜻을 가진 영어 단어인데요. 보통 프로그래밍 세계에서 어떤 변수의 데이터 타입을 바꿀 때 사용되는 단어입니다. SQL에서도 같은 의미로 사용되는데요.
지금 아래 그림의 SQL문을 보면 CAST(data AS signed)라는 표현식이 있죠? 이 부분이 바로 data 컬럼에 존재하는 값들의 데이터 타입을 일시적으로 signed라는 데이터 타입으로 변환하라는 뜻입니다.
signed는 처음 보는 데이터 타입인데요. signed는 양수와 음수를 포함한 모든 정수를 나타낼 수 있는 데이터 타입입니다.
이 SQL 문을 실행해보면, 이렇게 data 컬럼의 타입이 INT였을 때와 같은 결과가 나옵니다. 방금 말한대로 data 컬럼의 값들이 일시적으로 signed 타입으로 변환되어 해석되었기 때문입니다.
만약 어떤 컬럼의 숫자값들이 TEXT 같은 문자열 타입으로 저장돼있지만, 정렬 기준으로 쓸 때는 숫자형으로 사용하고 싶다면 CAST 함수를 쓰면 되겠죠?
참고로 만약 문자열 타입으로 저장된 숫자값에 소수점이 포함되어 있다면 signed 대신 decimal(소수점이 있는 수를 나타내는 타입)을 적어주고 사용하면 됩니다.
댓글남기기