본문 바로가기
SQL

ORDER BY 문 & 와일드 카드

by Notorious Coder 2023. 8. 1.

직전 글의 SELECT문의 기본형식에서 마지막 부분에 ORDER BY 이 있었다. 이 구문은 데이터를 정렬하기 위한 것으로 가장 마지막에 입력한다. 

 

 

 

데이터를 1개 열 기준으로 정렬할 경우에는 다음과 같이 하면 된다.

 

 

--ex) symbol 기준으로 정렬

select *
from nasdaq_company
order by symbol

 

 

2개의 열을 기준으로 정렬하고 싶다면 쉼표(,)로 구분해서 입력해 주면 된다. 

 

 

--ex) sector가 null이나 공백이 아닌 경우, sector열 기준으로 정렬 후 industry열로 정렬

select *
from nasdaq_company 
where sector IS NOT NULL and sector <> ''
order by sector, industry

 

 

정렬 시 오름차순, 내림차순으로 수행하고 싶다면, 정렬하고자 하는 기준 열 다음에 각각 ASC, DESC를 붙여주면 된다.

 

 

--오름차순
select *
from nasdaq_company
order by symbol ASC


--내림차순
select *
from nasdaq_company
order by symbol DESC

 

 

만약 어떠한 조건에서 데이터를 검색할 때 상위 N개의 데이터만 검색하고 싶다면 TOP를 사용하면 된다. 다만, 상위 N개의 데이터만을 반환하기 때문에 정렬의 우선순위를 잘 따져보아야 한다. 그리고 TOP을 사용할 때, 반드시 ORDER BY 문을 사용하자. 왜냐하면 정렬하지 않으면 어떤 값을 기준으로 정렬한 상위 N개의 데이터가 출력되었는지 알 수 없기 때문이다. 

 

 

--ex) 테이블에서 ipo_year열을 기준, 내림차순 정렬 후 상위 5개의 데이터만 보여줘.

select TOP 5 *
from nasdaq_company
order by ipo_year DESC

 

 

다음으로는 OFFSETFETCH NEXT라는 것도 있는데 OFFSET은 어떠한 구간을 건너뛰어 데이터를 검색하고 싶을 때 사용하면 된다. 예를 들어 symbol열을 기준으로 처음 100번째까지의 데이터는 궁금하지 않다면, 다음과 같이 코드를 작성하면 된다는 것이다.

 

 

select *
from nasdaq_company
order by symbol
offset 100 rows

 

 

이렇게 하면 100번째까지의 데이터를 건너뛰고 101번째부터의 데이터들을 얻을 수 있다. 그리고 FETCT NEXT는 출력할 행의 개수를 정할 수 있다. 또한, 반드시 OFFSET과 같이 사용해야 한다. 바로 위의 코드에서 5개의 데이터만을 출력하고 싶다면 아래와 같이 표현하면 된다. 

 

select *
from nasdaq_company
order by symbol
offset 100 rows
fetch next 5 rows only

 

5개의 데이터만 출력되었다

 

 

다음은 와일드카드에 대해 알아보자. 지금까지는 명확한 조건으로 데이터들을 검색하고 추출했지만, 만약에 내가 찾는 데이터의 정보가 헷갈린다면 어떡할 것인가? "티커가 LM 뭐 시기였던 거 같은데..." 이럴 때 해결 방법이 바로 LIKE이다. LIKE를 사용하면 와일드카드로 지정한 패턴과 일치하는 문자열이나 날짜, 시간 등을 검색할 수 있다. 특정 문자열을 포함하는 문자열을 검색하고 싶다면 %를 사용하면 된다. %를 사용해서 검색하는 다양한 방법들을 표로 정리해 봤다.

 

 

%A% 문자열에서 A를 포함하는 문자열을 검색
A% 문자열에서 A로 시작하는 문자열을 검색
AA% 문자열에서 AA로 시작하는 문자열을 검색
%AA 문자열에서 AA로 끝나는 문자열을 검색
%A 문자열에서 A로 끝나는 문자열을 검색

 

 

만약에 문자열 중에 특수 문자가 포함되어 있는 것들을 검색하려면 어떻게 해야 할까? 예를 들어 문자열에 %가 포함되어 있다면 ESCAPE를 사용하면 된다. 먼저 특수 문자가 포함되어 있는 문자열로 임시 테이블을 생성해 보자.

 

--%를 포함한 임시 테이블을 생성하는 코드

with cte (col_1) as (
select 'A%BC' UNION ALL
select 'A_BC' UNION ALL
select 'ABC' 
)
select * from cte

--select * from cte where col_1 like '%%%'

 

 

맨 아래 주석 코드와 같이 실행한다면 원하는 결과를 얻을 수 없다. 왜냐하면 %는 검색할 수 있는 값이 아닌, 0개 이상의 문자를 의미하는 예약어이기 때문이다. 이제 ESCAPE를 사용해서 코드를 구현해 보자.

 

 

with cte (col_1) as (
select 'A%BC' UNION ALL
select 'A_BC' UNION ALL
select 'ABC' 
)
select * from cte
where col_1 like '%#%%' escape '#'

 

 

쿼리가 실행될 때 처음에 '%#%%'이 호출되고 #가 제거되어 '%%%'로 해석된다. 이는 %를 포함한 앞뒤 어떠한 문자가 와도 무방한 데이터를 검색한다는 의미이다. 여기서 굳이 #이 아니더라도 다른 것들도 쓸 수 있다. 그 문자열에 포함되어 있지 않은 것만 사용하면 문제가 없다. 

 

 

다음은 _를 사용하여 특정 문자열을 포함하는 특정 길이의 문자열을 검색하는 방법이다. 굉장히 쉽다. 예를 들어, 'A_'라고 하면 'A로 시작하는 두 글자 짜리 문자열을 검색' 한다는 것이다. 이제 LIKE를 ' % '와 ' _ '를 사용한 예시들을 살펴보고 마무리하자.

 

 

A_C% A?C로 시작하는 모든 문자열 검색
AB[C, D]% ABC 혹은 ABD로 시작하는 모든 문자열 검색
TS[^B]% TS로 시작하고 B를 포함하지 않는 모든 문자열 검색
N%D_ N?D로 시작하는 모든 문자열 검색
_ _ Q% ??Q로 시작하는 모든 문자열 검색
A[B-D, J, K-P] A로 시작하면서 두 번째 문자가 B~D 혹은 J 혹은 K~P인 문자열 검색

 

 

 

 

SQL에 관한 내용은 '이지스 퍼블리싱'의 'Do it! SQL 입문'이라는 책을 참고하여 정리하였습니다.

'SQL' 카테고리의 다른 글

데이터 그룹화  (0) 2023.08.06
SELECT문 & WHERE문  (0) 2023.08.01