직전 글의 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
다음으로는 OFFSET와 FETCH 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
다음은 와일드카드에 대해 알아보자. 지금까지는 명확한 조건으로 데이터들을 검색하고 추출했지만, 만약에 내가 찾는 데이터의 정보가 헷갈린다면 어떡할 것인가? "티커가 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 |